PHP Counter zählt Ip mehrmals.

Tab

unlimited
ID: 374854
L
26 Juni 2007
900
71
Hallo liebes Forum,

ich habe gerade einen kleinen Counter geschrieben, welcher über die DB läuft.

PHP:
function counter_output() {
    
    /* DB Abfrage */
    $sql = "SELECT * FROM pagecounter ORDER BY count DESC LIMIT 1";
    $sql_return = mysql_query($sql);
    
    /* Ausgabeschleife für Variablen */
    while($row = mysql_fetch_object($sql_return)) {
        $value = $row->count;
    }
    
    /* Erstellen des Inhalstsbereichs und Ausgabe der Variable */
    echo '<table width="100%" cellspacing="0" cellpadding="3" border="0" class="infoBoxContents" style="border: 1px solid #B6B7CB;"><tbody><tr>
          <td><img width="100%" height="1" border="0" alt="" src="images/pixel_trans.gif"></td></tr><tr>
          <td class="boxText">Sie sind der <b>'.$value.'</b>. Besucher</tr><tr><td>
          <img width="100%" height="1" border="0" alt="" src="images/pixel_trans.gif"></td></tr></tbody></table>';
}

/*  */
function count_peoples($ip, $timestamp) {
    $sql = "SELECT * FROM pagecounter";
    $sql_return = mysql_query($sql);
    
    while ($row = mysql_fetch_object($sql_return)) {
        $db_ip = $row->ip;
        $db_count = $row->count;
    }
    
    if ($db_ip != $ip) {
        
        if (empty($db_count)) {
            $db_count = 1;
        } else {
            $db_count++;
        }
        $update = "INSERT INTO pagecounter (timestamp, count, ip) VALUES ('$timestamp', '$db_count', '$ip')";
        mysql_query($update);    
    }
}
?>
Doch nun trägt er aber ein und die selbe IP mehrmals in der Datenbank ab, zählt komischerweise aber nicht höher, sondern behält dieselbe Counterzahl?

Woran kann das liegen?

Liebe Grüße

EDIT: Habe ein Schema erkannt. Sind jetzt 2 Besucher Online, zählt er die IP's immer abwechselnd, dann zählt er auch hoch...
 
äh der Code ist absoluter Mist.
Du gehst in deiner While-Schleife alle db-Results durch, wodurch du bei der if-Abfrage nur den letzten Datensatz mit der IP vergleichst.

Es gibt auch noch einen WHERE-Teil für MySQL-Statements ;)
 
Also ich will Dir jetzt nicht zu nahe treten, aber in meinen Augen ist der Code teils ganz schöner Blödsinn und wenn ich nicht ganz falsch denke, absolut nicht zu empfehlen, wenn man die "count_peoples" Funktion anschaut.

Also mal grob in Stichpunkten begründet:
1. Wieso in "counter_output" eine while, wenn sowieso nur ein Ergebnis erwarted wird?
2. Was macht Deine "count_peoples" Functions-schleifen wenn die Counter Tabelle mal >=500k Einträge hat?
3. Bin mir grad nicht sicher, aber gibt die "counter_output" wirklich immer die letzte Zeile der Tabelle wieder?
4. in der "count_peoples" wird eine while gestartet, aber das dazugehörige if() ist nach dem die Schleife geschlossen wurde.
5. Wenn Du das if() innerhalb der while schiebst, wie es denke ich mal gedacht war, dann haut es erstrecht nimmer hin.

Also so richtig steige ich durch den Code net durch, aber Frage am Rande, wieso willst Du das Rad neu erfinden??? Habe es nur flüchtig angeschaut, aber direkt das erste sollte das bieten was Du gerade machen willst.

@Ice
@Tab
Siehe Ice´s Post
 
Zuletzt bearbeitet:
PHP:
$update = sprintf("INSERT INTO pagecounter
  (timestamp, count, ip) VALUES
  ('$timestamp', '1', '$ip')
  ON DUPLICATE KEY UPDATE
  count=count+1",
  $ip);
mysql_query($update);
Angenommen MySQL und unique / primay key ueber ip Feld :evil:
 
@Snyke: %... :biggrin:
PHP:
$update = sprintf("INSERT INTO pagecounter
  (timestamp, count, ip) VALUES
  (%lu, 1, '%s')
  ON DUPLICATE KEY UPDATE
  count=count+1",
  $timestamp, $ip);
;)
 
Copy&Paste error.

Ausserdem versteh ich den Timestamp nicht, dann zaehlt er nur hoch wenn die timestamps uebereinstimmen oder wie is das gemeint?
 
PHP:
function eintragen($user_ip, $count, $timestamp) {
    $mysql = "SELECT * FROM pagecounter WHERE ip = ".$user_ip."";
    $mysql_query = mysql_query($mysql);

    $row = mysql_fetch_assoc($mysql_query);
    $datenbank_ip = $row['ip'];

    
    if (empty($datenbank_ip)) {
        $new_count = $count+1;
        $insert = "INSERT INTO pagecounter (timestamp, count, ip) VALUES ('$timestamp', '$new_count', '$user_ip')";
        mysql_query($insert);
    } else {
        echo "Sie sind schon bekannt.";
    }

}
Ich bekomme folgenden Fehler: Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/www/doc/6992/seite.de/www/counter.php on line 18

Meine Gedanke ist folgender:

Schau in die DB, ob dort schon die IP des Besuchers vorhanden ist, wenn ja, dann hat $datenbank_ip einen Wert, wenn nicht, dass müsste er ja leer sein.

Wenn er leer ist, heißt das dieser Besucher ist neu und er wird eingetragen.

Das Eintragen funktioniert einwandfrei, da durch den Fehler $datenbank_ip immer leer ist, somit wird die Ip immer wieder neu eingetragen.

Wo liegt der Fehler?

Liebe Grüße

EDIT: Line 18 ist in dem Fall Line 5
 
Du musst strings (wie eine IP im dot-separated format zum beispiel) mit quotes in der query abtrennen.
 
Vielen Dank für Deine Antwort.

Leider konnte ich unter dem Begriff "dot-separated format" nicht viel finden, was genau bedeutet das?

Liebe Grüße
 
Leider konnte ich unter dem Begriff "dot-separated format" nicht viel finden, was genau bedeutet das?
wörtlich nehmen: "mit Punkten separiert"

Du kennst sicherlich das Format einer IPv4-Adresse: xxx.xxx.xxx.xxx
Zwischen den Zahlen notiert man Punkte.
 
Genau das ist mir bekannt.

Doch diese Punkte sind schon gesetzt? Verstehe leider nicht in wiefern ich daran nun was ändern muss.

Liebe Grüße und vielen Dank.
 
Ist an der Stelle nicht
PHP:
"...INET_ATON('".$_SERVER['REMOTE_ADDR']."')..."
eher angebracht?

INET_ATON

Sollte eigentlich nur eine Frage von Vorliebe sein, mit ip2long oder eben den INET_XTOY funktionen kannst du eine kompaktere Darstellung in der DB verwenden, aber zum lesen muss man sie wieder zurueck konvertieren. Ich bin ein grosser fan von ip2long und co. und wuerde deshalb raten diese zu verwenden :D
 
ip2long und INET_ATON produzieren den gleichen Output.
Nur die Namensgebung der PHP-Version ist absoluter Mist weil ein 4 Byte Int entsteht und kein Long.
 
Ganz toll is natuerlich wenn man jetzt noch zwischen unsigned und signed unterscheidet, dann is das durcheinander vollkommen :D