#1064 Syntaxfehler geschachtelte Anfrage
Zelphir
- datenbank
Hallo SelfHTMLer,
Ich habe vor einen kleinen Besucherzaehler zu basteln.
Dazu dachte ich mir, muesste ich einfach die IP-Adressen mit zugehoerigem Datum speichern, die meine Webseite besuchen.
Das habe ich auch schon getestet:
<?php
//Benoetigte Daten sammeln
$date = date("Y-m-d",time());
if (!isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$client_ip = $_SERVER['REMOTE_ADDR'];
}
else {
$client_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
echo $date;
echo $client_ip;
//Feststellen ob diese IP heute schon auf der Webseite war
$todayCountQuery = "
SELECT date, COUNT(client_ip)
FROM counter
WHERE (
(date = '$date') AND
(client_ip = '$client_ip')
)
GROUP BY date;";
$todayCountQueryResult = mysql_query($todayCountQuery);
//Falls heute noch nicht auf der Webseite gewesen wird ein Datensatz gespeichert
if(mysql_num_rows($todayCountQueryResult) == 0){
echo "Heute noch nicht auf der Webseite gewesen!";
//Datensatz mit IP und Datum speichern
$increaseCounterQuery = "INSERT INTO counter (client_ip, date) VALUES ('$client_ip', '$date');";
mysql_query($increaseCounterQuery);
}
Soweit funktioniert das auch alles. Ob es jetzt die beste Loesung ist weiß ich nicht, es ist das erste mal, dass ich etwas mit PHP und SQL in Verbindung mache.
Nun muss ich natuerlich noch alle verschiedenen IP-Adressen eines jeweiligen Datums zaehlen, und diese dann zusammenaddieren. Das wollte ich wie folgt bewerkstelligen:
<?php
$getCounterQuery = "
SELECT SUM(visitor_count_per_day) AS visitorCount
FROM
(SELECT date, COUNT(client_ip) AS visitor_count_per_day
FROM counter
GROUP BY date;)";
?>
Soweit ich weiß muessen nur nicht-aggregierte Attribute per GROUP BY gruppiert werden, sofern denn ueberhaupt eine Aggregation in der Anfrage vorliegt. Daran habe ich mich auch gehalten, allerdings meint mein phpMyAdmin SQL Query Verarbeiter, dass ich einen Syntaxfehler in meiner Anfrage habe:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5
Eingabe:
SELECT SUM(visitor_count_per_day) AS visitorCount
FROM
(SELECT date, COUNT(client_ip) AS visitor_count_per_day
FROM counter
GROUP BY date;)
Wenn ich die Anfrage teste. Wenn ich die Anfrage einfach so im PHP-Code stehen lasse, dann erhalte ich den Fehler:
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in (PFAD) on line 46
Hier eine Beispieltabelle mit einigen Testwerten, die ich benutze um zu testen:
79.55.0.143 2012-09-01
79.55.0.144 2012-09-02
79.55.0.145 2012-09-03
79.55.0.146 2012-09-04
127.0.0.1 2018-09-20
127.0.0.1 2018-09-20
127.0.0.1 2018-09-20
127.0.0.1 2018-09-20
127.0.0.1 2018-09-20
127.0.0.1 2018-09-20
127.0.0.1 2018-09-20
127.0.0.1 2018-09-20
127.0.0.1 2012-09-18
Was kann ich gegen den Fehler tun und was loest ihn aus?
Was mache ich in meiner SQL Anfrage fuer einen Fehler?
Hi,
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5
Eingabe:
SELECT SUM(visitor_count_per_day) AS visitorCount
FROM
(SELECT date, COUNT(client_ip) AS visitor_count_per_day
FROM counter
GROUP BY date;)
Na erst mal gehört der Smilie am Ende da nicht rein, und dann willst du Spaltennamen, die Schlüsselwörter sind, natürlich entsprechend quoten (bzw. von vornherein vermeiden).
MfG ChrisB
--
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
Hi,
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5
Eingabe:
SELECT SUM(visitor_count_per_day) AS visitorCount
FROM
(SELECT date, COUNT(client_ip) AS visitor_count_per_day
FROM counter
GROUP BY date;)
>
> Na erst mal gehört der Smilie am Ende da nicht rein, und dann willst du Spaltennamen, die Schlüsselwörter sind, natürlich entsprechend quoten (bzw. von vornherein vermeiden).
>
> MfG ChrisB
>
Sowas aber auch, da dachte ich doch glatt nach jeder Anfrage ein Semikolon zu machen, einfach der Einheitlichkeit halber :D
Gut also in Unterabfragen keine Semikolons verwenden.
Dann hatte ich noch kurz den Fehler:
#1248 - Every derived table must have its own alias
welchen ich dadurch behoben habe, dass ich das ganze so hier geschrieben habe:
~~~sql
SELECT SUM(c.visitor_count_per_day) AS visitorCount
FROM
(SELECT date, COUNT(client_ip) AS visitor_count_per_day
FROM counter
GROUP BY date) AS c
Danke fuer deine Hilfe, ich habe echt gedacht, dass ich irgendwelche Denkfehler drinn habe, die aus irgendeinem Grund als Syntaxfehler erkannt werden ^^
Noch etwas: Wenn man nun jeden Tag viele Besucher haette, dann wurde sich die Relation recht schnell vergroeßern. Macht es Sinn, jeden Tag die Anzahl der Besucher der vorherigen Tage zusammen zu fassen und nur fuer den heutigen Tag einen Extra-Datensatz inklusive Datum in der Relation zu belassen?
Ist mir noch so im Nachhinein aufgefallen :)
Dazu dachte ich mir, muesste ich einfach die IP-Adressen mit zugehoerigem Datum speichern, die meine Webseite besuchen.
Das kann aus verschiedenen Gründen schief gehen.
Musst mal ein bisschen suchen warum. Zum Beispiel wenn mehrere über die gleiche externe IP-Adresse surfen. Oder vielleicht Mobilfunk Surfer?
Dazu dachte ich mir, muesste ich einfach die IP-Adressen mit zugehoerigem Datum speichern, die meine Webseite besuchen.
Das kann aus verschiedenen Gründen schief gehen.
Musst mal ein bisschen suchen warum. Zum Beispiel wenn mehrere über die gleiche externe IP-Adresse surfen. Oder vielleicht Mobilfunk Surfer?
Das geschah aus Testzwecken ueber Localhost.
Ich habe auch einfach Testdatensaetze in die Relation eingefuegt.