Ankündigung

Einklappen
Keine Ankündigung bisher.

Counter - Besucherzahl wird nicht erhöht

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Gast-Avatar
    Ein Gast erstellte das Thema Counter - Besucherzahl wird nicht erhöht.

    Counter - Besucherzahl wird nicht erhöht

    Ich habe folgendes Problem:

    Bei der Überprüfung der IP, ob der User schon auf der Seite war, gibt es Probleme. Das Skript soll dies überprüfen und wenn der User noch nicht auf der Seite war, soll die Besucherzahl um 1 erhöht werden, aber das Skript erhöht die Besucherzahl nicht um 1.

    Counter-Skript (Sorry, aber die PHP-Tags funktionieren nicht):
    Code:
    <?php
    
    // Hostname
    $host = "xxxxx";
    
    // MySQL-Username
    $user = "xxxxx";
    
    // Passwort des Users
    $pass = "xxxxx";
    
    // Datenbankname
    $db = "xxxxx";
    
    
    
    // MySQL-Verbindung aufbauen
    $link = mysql_connect( $host, $user, $pass );
    
    // Datenbank auswählen
    mysql_select_db ( $db, $link );
    
    // Schleife zur Überprüfung der IP
    $iptrue = 0;
    $result = mysql_query( "select * from counter", $link );
    
    while ($line = mysql_fetch_object($result)) {
    
    global $iptrue;
    
    if ( $line->ip != $_SERVER['REMOTE_ADDR'] ) {
    $iptrue = 0;
    } else {
    $iptrue = 1;
    }
    }
    
    // überprüfen, ob der User schon auf der Seite war
    if( $iptrue == 0 ) {
    
    // Wenn dies nicht zutrifft, Counter um 1 erhöhen
     mysql_query( "INSERT INTO `counter` (`id`, `ip`) VALUES (\'\', \'".$_SERVER['REMOTE_ADDR']."\')", $link );
    
    }
    
    // Ausgeben des Counters
    echo "Sie sind der ".mysql_num_rows( mysql_query( "select * from counter", $link ) ).". Besucher.";
    
    ?>
    Und die Datenbank (zum Erstellen):
    Code:
    CREATE TABLE counter (
    id int(11) NOT NULL auto_increment,
    ip varchar(50) NOT NULL default \'\',
    PRIMARY KEY (id)
    )
    Wo ist der Fehler? Vielen Dank im Vorraus!

  • Gast-Avatar
    Ein Gast antwortete
    danke! werde ich dann einmal ausprobieren!

    Einen Kommentar schreiben:


  • dehpeh
    antwortet
    folgendes, dein code:
    PHP-Code:
    <?php
    $result 
    mysql_query"select * from counter"$link ); 
    while (
    $line mysql_fetch_object($result)) {

    global 
    $iptrue;

    if ( 
    $line->ip != $_SERVER['REMOTE_ADDR'] ) {
    $iptrue 0;
    } else {
    $iptrue 1;
    }

    ?>
    angenommen, du hast 3 datensätze, beim ersten stimmt die ip nicht, also ist $iptrue = 0
    beim zweiten datensatz stimmt die ip überein, somit ist jetzt $iptrue = 1
    beim beim dritten allerdings stimmt sie wieder nicht und aus $iptrue wird 0...

    somit ist also jenachdem dein ergebnis verfälscht, ausserdem kannst du ja die ip-abfrage direkt von mysql erledigen lassen.
    dies ist viel performanter!

    (wieso eigentlich das global? das braucht man nur
    innerhalb von funktionen, nicht innerhalb von schleifen)

    so wäre die bessere/richtige lösung
    PHP-Code:
    <?php
    $result 
    mysql_query('select id from counter where ip="' $_SERVER['REMOTE_ADDR'] . '"'$link); 
    if(
    mysql_num_rows($result) > 0) {
      
    insert....
    }
    ?>


    nun kann man das ganze allerdings noch stark vereinfachen
    und optimieren, schau mal hier, dies ist das komplette script
    PHP-Code:
    <?php
    mysql_connect
    ('localhost''user''passwort');
    mysql_select_db('datenbank');

    mysql_query('REPLACE INTO counter (ip) VALUES (INET_ATON("' $_SERVER['REMOTE_ADDR'] . '"))');     

    $result mysql_query('SELECT COUNT(ip) AS besucher FROM counter');
    $row mysql_fetch_array($result);
    echo 
    "Sie sind der {$row['besucher']} Besucher.";
    ?>
    wobei die datenbank-tabelle dann so aussieht:
    CREATE TABLE counter (
    ip int(10) unsigned NOT NULL default '0',
    PRIMARY KEY (ip)
    )


    kurz erklärt:
    INET_ATON ist eine mysql funktion, die eine IP in eine nummer "umwandelt". das mysql-feld "ip" kann nun also INT sein.

    es reicht nun völlig aus, in der tabelle nur ein feld "ip" zu haben,
    und nutzen dies auch als primärschlüssel.

    ein "replace into" fügt nur ein datensatz hinzu, wenn noch kein datensatz
    mit dem primärschlüssel vorhanden ist, somit sparen wir uns eine vorige
    abfrage.

    Einen Kommentar schreiben:

Lädt...
X