2016-07-24 7 views
1

Ich versuche, ein System zu erstellen (naja, es ist ein Projekt), wo ich Benutzer IP-Adressen protokollieren können, wenn sie bestimmte Aktivitäten ausführen. Nach einigen Recherchen habe ich festgestellt, dass ip2long benötigt wird, um in die Datenbank zu konvertieren. Ich habe eine Datenbank namens ips (unsigned) und die Hauptspalten sind ip und count.Verwenden von IPs in PHP und MySQL

Mysql Screenshot:

enter image description here

Dies ist, was ich zur Zeit habe:

$ip=$_SERVER['REMOTE_ADDR']; 
$ip = ip2long($ip); 

$stmt = $DB_con->prepare("INSERT INTO ips (ip, count) VALUES (:addr, 1) ON DUPLICATE KEY UPDATE count = count + 1"); 
$stmt->bindparam(":addr", $ip); 
$stmt->execute(); 

Dies funktioniert gut. Aber ich kann nicht scheinen, die Werte von der Datenbank abzurufen und sie anzuzeigen. Ich mache das wahrscheinlich schrecklich falsch, habe aber keine Ahnung. Nach dieser Aussage muss ich dann Longtoip konvertieren. Ich würde etwas Hilfe schätzen, da dies gibt mir gerade einen Fehler 500:

$stmt = $DB_con->prepare("SELECT ip , count FROM ips WHERE 1") 
$stmt->execute(); 
+0

Ihr Fehler 500 kann von einem Fehler auf DB-Ebene stammen. Können Sie '$ stmt-> errorInfo()' nach 'execute' hinzufügen, um zu wissen, was append? Aber ich denke, das liegt daran, dass 'count' ein MySQL-Schlüsselwort ist und es maskiert werden muss:' SELECT ip, \ 'count \' ... '. – Elorfin

+0

"1" ist keine Bedingung. Was versuchst du zu fragen? – Mureinik

+0

und "count" ist eine reservierte Arbeit (es ist eine Funktion), aber Sie rufen es ohne Argumente – Mureinik

Antwort

4

Es ist nichts falsch mit der folgenden Abfrage, wie Sie aus dem SQL Fiddle unten angegebenen Link der Abfrage sehen können:

SELECT ip, count FROM ips WHERE 1 

SQLFiddle

wenn Sie jedoch wirklich COUNT als eine Funktion zu verwenden, die Absicht haben, dann Ihre Abfrage benötigt eine GROUP BY Klausel:

SELECT ip, COUNT(*) AS ipCount 
FROM ips 
GROUP BY ip 

Als allgemeine gute Praxis möchten Sie vielleicht vermeiden, Ihre Spalten count oder nach einer anderen MySQL-Funktion zu benennen, da dies zu Verwirrung darüber führen könnte, was Ihre Abfrage tatsächlich macht (und Sie selbst könnten Opfer davon werden). .

+0

* "COUNT ist ein reserviertes Schlüsselwort in MySQL" * - Es ist nicht. Zu Ihrer Information: Die manuellen Status https://dev.mysql.com/doc/refman/5.7/en/keywords.html - * "Namen von integrierten Funktionen sind als Bezeichner zulässig, müssen jedoch möglicherweise als solche verwendet werden Beispiel: COUNT ist als Spaltenname zulässig. In Funktionsaufrufen zwischen dem Funktionsnamen und dem folgenden "(" -Zeichen) ist jedoch standardmäßig kein Leerzeichen zulässig. * –

+1

@ Fred-ii Sie haben Recht, ich habe es nicht bemerkt Ich habe mich selbst in einer Fiddle überprüft und tatsächlich ist "count" ein legitimer Spaltenname, sogar unescaped. Der "500" -Fehler, den der OP bekommen hat, führte mich zu einer Erklärung, als es schien, dass irgendein _other_ Problem es verursachte Ich werde meine Diskussion über die Verwendung von "COUNT" als Funktion mit "GROUP BY" unverändert lassen, weil ich glaube, dass das korrekt ist. –

+0

Kein Problem Tim ;-) –