MySQL Abfrage ob Eintrag älter als... Falsch
gero
- datenbank
Hallo ,
ich versuche eine Abfrage zu "basteln", mit der ich rausfinden kann, ob ein bestimmter(!) Eintrag älter als 1 Stunde ist. Wenn das so ist dann ist gut so, wenn nicht, dann eben nicht ;)
Dazu steht mir in der DB ein Timestamp-Feld zu Verfügung. Probiert habe ich meine Abrage mit Date_SUB(), aber irgendwie funktioniert das nicht ganz so wie ich "gehofft" habe. Ich habe das Gefühl, das die Einschränkung des Datums nicht oder nur teilweise beachtet wird. Manchmal gehts, manchmal nicht, Leider habe ich noch nicht herausgefunden wann und warum ;)
So habe ich das versucht:
$pruefung2 = 'SELECT * FROM
voteWHERE
pageid= \''.$page.'\' AND
name= \''.$name.'\' AND
ip= \''.$ip.'\' AND
datum BETWEEN SYSDATE() AND DATE_SUB(SYSDATE(), INTERVAL 1 DAY) LIMIT 1 ';
Wichtig ist eben, das alle Kriterien übereinstimmen (pageid, name , ip) und Ziel des Ganzen ist es, das nur jede Stunde einmal pro IP ein Vote abgegeben werden kann.
Prüfen tu ich das dann so:
$ergebnis = mysql_query($pruefung2);
$row = mysql_fetch_object($ergebnis);
if ($row->ip == $ip)
{
//Eintrag ist jünger als eine Stunde
echo $row->ip;
echo "<br />Eintrag verboten";
}
else
{
//Eintrag ist älter als eine Stunde
echo "Eintrag bereits vorhanden...Update wird vorgenommen<br />";
}
echo mysql_error();
echo mysql_errno();
Was habe ich falsch gemacht?
Hi,
ich versuche eine Abfrage zu "basteln", mit der ich rausfinden kann, ob ein bestimmter(!) Eintrag älter als 1 Stunde ist. [...] Probiert habe ich meine Abrage mit Date_SUB(), aber irgendwie funktioniert das nicht ganz so wie ich "gehofft" habe. Ich habe das Gefühl, das die Einschränkung des Datums nicht oder nur teilweise beachtet wird.
Vielleicht ...
DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
^^^^^
... ist das nur einfach eine etwas laengere "Stunde", als ueblich?
MfG ChrisB
Huhu,
... ist das nur einfach eine etwas laengere "Stunde", als ueblich?
MfG ChrisB
*grins* Nein, das war nur ein Versuch zu erkennen, warum nicht das passiert was passieren soll. Aber leider klappt auch das nicht so wie es soll ;)
Im Beispiel "1 Day" konnte ich Einträge vornehmen, die ein paar Minuten alt waren ;)
Grüße
Hallo,
$pruefung2 = 'SELECT * FROM
voteWHERE
pageid= \''.$page.'\' AND
name= \''.$name.'\' AND
ip= \''.$ip.'\' AND
datumBETWEEN SYSDATE() AND DATE_SUB(SYSDATE(), INTERVAL 1 DAY) LIMIT 1 ';
warum fängst Du mit PHP-Code an? Warum postest Du PHP-Code, wenn Du ein SQL-Problem hast.
Schreibe Dir zunächst eine einfache SQL-Anweisung, die das liefert, was Du haben möchtest.
Fangen wir mit dem SQL-Statement an:
Wichtig ist eben, das alle Kriterien übereinstimmen (pageid, name , ip) und Ziel des Ganzen ist es, das nur jede Stunde einmal pro IP ein Vote abgegeben werden kann.
Du willst also ein Anzahl haben. OK, also lassen wir uns eine Anzahl zurückgeben - und nicht einen oder keinen Datensatz mit Daten, die nicht benötigt werden.
SELECT
COUNT(*) anzahl -- Gib mir die Anzahl der Datensätze
FROM -- meiner Tabelle
vote -- vote,
WHERE -- die sich auf
pageid = <eine pageid> -- eine bestimmte page beziehen,
AND -- und einen bestimmten
name = <irgendein name> -- Namen aufweisen
AND -- und von einer ganz bestimmten
ip = <eine bestimmte ip> -- IP-Adresse stammen
AND --
datum [link:http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_between@title=BETWEEN] DATE_SUB(NOW(), INTERVAL 1 HOURS) AND NOW()
-- Beachte, dass die Syntax BETWEEN min AND max lautet, einer Deiner Fehler.
-- Ich persönlich würde statt BETWEEN übrigens ein einfaches > vor einer Stunde verwenden.
$ergebnis = mysql_query($pruefung2);
$row = mysql_fetch_object($ergebnis);
if ($row->ip == $ip)
// Wenn bei Deiner Abfrage kein Datensatz zurückgeliefert wird,
// was steht dann in $row. COUNT() liefert auf jeden Fall eine Zahl zurück,
// ist diese > 0, dann war's verboten
{
//Eintrag ist jünger als eine Stunde
echo $row->ip;
Was für eine andere IP erwartest Du?
echo "<br />Eintrag verboten";
}
else
{//Eintrag ist älter als eine Stunde
echo "Eintrag bereits vorhanden...Update wird vorgenommen<br />";
}
echo mysql_error();
echo mysql_errno();
> Was habe ich falsch gemacht?
Außerdem solltest Du die Werte, mit denen Du Dein SQL-Statement zusammenbaust, ordentlich mit mysql\_real\_escape\_string() behandeln, damit Du nicht anfällig für SQL-Injection bist. Weiterhin wäre es eine verflixt gute Idee, das SQL-Statement in doppelte Anführungszeichen zu setzen, damit Du die einfachen Anführungszeichen des SQL-Statements nicht zu escapen brauchst. Schöner wäre es mysqli und Prepared Statements zu verwenden.
Freundliche Grüße
Vinzenz