gero: MySQL Abfrage ob Eintrag älter als... Falsch

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 voteWHEREpageid= \''.$page.'\'  ANDname= \''.$name.'\' ANDip= \''.$ip.'\' ANDdatum 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?

  1. 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

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. 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

  2. Hallo,

    $pruefung2 = 'SELECT * FROM voteWHEREpageid= \''.$page.'\'  ANDname= \''.$name.'\' ANDip= \''.$ip.'\' ANDdatum BETWEEN 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