Vinzenz Mai: MySQL Abfrage ob Eintrag älter als... Falsch

Beitrag lesen

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