Tabellenauswertung -> 1065: Query was empty

RiTaLiN

Grünschnabel
Hi,

ich versuche grad einen Spamschutz in unser kleines Gästebuch zu integrieren, da ja CM Pro noch keinen Spamschutz besitzt.
Werde wenn er fertig ist auch veröffentlichen.
Nur bin ich noch am coden und ich hab ein kleines Problem...

Ich habe erfolgreich geschafft eine Zeichenbegrenzung von 250 Zeichen hinzubekommen.
Aber was ich noch nicht geschafft habe ist, dass man nur 3 Einträge pro Zeitspanne mit der gleichen IP vornehmen darf.

Hier frägt er die MySQL-Datenbank ab, wie oft der Eintrag mit welcher IP in welcher Zeitspanne vorhanden ist:

Code:
$zeit = time(); 
$zeitkurz = substr($zeit, 0, 7); 
$sql = "SELECT * FROM $tbl_gbook WHERE ip = '$REMOTE_ADDR' AND name LIKE '$zeitkurz%'"; 
$query = mysql_query($sql, $db_conn); 
$count = mysql_num_rows($query);

Mit $count hätte ich ja nun die Anzahl der Postings mit der IP in der jeweiligen Zeitspanne.
Aber dann gibt mir PHP/MySQL diesen Fehler aus:

Code:
Datenbankfehler! 
 
1065: Query was empty

$sql ergibt dann fertig (je nach IP und Datum und Systemumgebung):
Code:
SELECT * FROM cmp_guestbook WHERE ip = '80.132.33.49' AND created LIKE '1097931%'
(das ; am Ende braucht man ja nur bei Konsoleneingaben, PHP brauchts nicht)
Das heißt die Anfrage ist zumindest MySQL-Technisch einwandfrei.

Könnt ihr mir weiterhelfen.
Wär euch sehr verbunden ! ;)
 
Erst einmal etwas Grundsätzliches:
Ich halte es nicht gerade für ratsam, einen „Spamschutz“ zu entwickeln, der anhand einer IP-Adresse agiert. Denn ein Großteil der Internetnutzer geht über einen Internetanbieter ins Internet, von dem Sie eine IP-Adresse aus einem Pool bei jeder Einwahl zugewiesen bekommen. Des weiteren ist wiederum ein Teil von ihnen über einem sog. Proxy-Server zusammen mit vielen anderen Computern mit dem Internet verbunden, so etwa in Schulen, Firmen, etc. Somit ist es äußerst ungenau, einen Benutzer anhand einer IP-Adresse zu identifizieren.
Hier würde ich eher die Verwendung einer Sitzungsidentifikation vorschlagen, die bei jedem Benutzer untschiedlich ist.

Weitergehend möchte ich die Abfrage zur Ermittlung der Anzahl der Beiträge kritisieren. Für dich mag es vielleicht plausibel klingen, eine Zeitspanne anhand der ersten sieben Stellen eines UNIX-Zeitstempels zu ermitteln. Diese liegt jedoch immer irgendwo zwischen 0 und 999 Sekunden, abhängig von der Zeit, und ist somit nicht gerade brauchbar.

Versuch mal folgendes:
PHP:
<?php
	[…]
	$query = "
		SELECT
		        COUNT(*)
		  FROM
		        `".$tbl_gbook."`
		  WHERE
		        `ip` = '".$REMOTE_ADDR."'
		    AND `created` > UNIX_TIMESTAMP()-30
	";
	$result = mysql_query($query, $db_conn);
	list($count) = mysql_fetch_array($result, MYSQL_NUM);
	[…]
?>
 
hmm, das mit dem count hatte ich auch schon in überlegung.

nur es kommt ja bei dem script öfters vor, dass der MySQL-Befehl nichts findet
und dann diese Meldung

Code:
 1065: Query was empty

ausgibt.

Könnte man da was anderes machen ?
Bin leider da ziemlich ratlos.
Auch in beziehung auf das Sicherheitszertifikat.
Meinste Cookies oder richtige Zertifikate ?
 
wenns dir hilft:

wenn ich per

Code:
 echo $result;

ausgeben lasse was $result enthält dann bekomme ich das hier:

Code:
 Resource id #24

Also gibt MySQL eigentlich ja schon die Fehlermeldung aus oder?
 
hab das problem gelöst.
das problem lag eigentlich nicht hierbei :-(
hab das per echo-versuche rausbekommen.

aber ich musste trotzdem viel verbessern

hier die verbesserte version:
Code:
	  // SPAMSCHUTZ -> Rausfinden wie oft die IP schon verwendet ist: 
	  $zeit = time(); 
	  $zeitkurz = substr($zeit, 0, 7); 
	  $spamquery = "SELECT * FROM $tbl_gbook WHERE ip = '$REMOTE_ADDR' AND created LIKE '$zeitkurz%'"; 
	  //Alternativ geht auch: 
	  // $spamquery = "SELECT COUNT(*) FROM `".$tbl_gbook."` WHERE `ip` = '".$REMOTE_ADDR."' AND `created` > UNIX_TIMESTAMP()-30"; 
	  $spamresult = mysql_query($spamquery, $db_conn); 
	  $spamcount = mysql_num_rows($spamresult); 
	  // Maximal 3 Postings (0-2 erlaubt, ab 3 isses spam) 
	  if($spamcount >= 3) 
	  { 
				   $spam = "ja"; 
	  } 
	  else 
	  { 
				   $spam = "nein"; 
	  } 
	  // JETZT IST KLAR OBS SPAM WAR (reimt sich ... cool)

Aber wenn ich die alternative zeile ausprobieren will dann gibt der mir nicht eine zahl sondern immer Resource id #24 aus !
Also $spamresult ist dann immer Resource id #24, genauso wie $spamcount !
Auch wenn ich deine Version versuche ....
 
Habe das Problem erfolgreich geändert:

Code:
$spamquery = "SELECT id FROM $tbl_gbook WHERE ip = '$REMOTE_ADDR' AND created > 'UNIX_TIMESTAMP()-30'";

somit ist das mit der Zeit genauer.
Vielen Dank für den Tip und die Antwort, bin dir sehr verbunden ! :)

Greetings
RiTaLiN
 
Zurück