2010-10-07 7 views
11

Es ist 12:30 Uhr und ich habe für 9 Stunden gerade codiert. Ich muss dieses Projekt wirklich machen, aber MySQL ist mit meiner Deadline beschäftigt. Können Sie diesen Ausschnitt für mich untersuchen und sehen, ob Sie herausfinden können, was falsch ist?Was ist falsch an dieser MySQL Query?

PHP/MySQL Query

$q = $this->db->query("SELECT * FROM bans WHERE ip='".$ip."'"); 

die folgenden Fehler Hält Rückkehr ...

MYSQL Error [6. Oktober 2010 23.31 Uhr CDT]
Sie haben einen Fehler in Ihre SQL-Syntax; Sie in die Bedienungsanleitung zu Ihrer MySQL-Server-Version für die richtige Syntax entspricht in der Nähe zu verwenden ‚* FROM Verbote WHERE ip =‘ 206.53.90.231 ‚‘ in Zeile 1 (1064)

ich nichts falsch mit der sehen Abfrage. Ich habe sogar verschiedene Methoden ausprobiert, die Variable $ ip einzuschließen, aber ohne Erfolg.

EDIT:
Gerade hier hinzufügen in der ip Spalte in der Datenbank ist ein varchar (255).

EDIT 2:
Hier ist der ganze betroffene Code. Denken Sie daran, dass dies alles in einer Klasse ist. Wenn ich etwas verpasse, lass es mich wissen.

Linie von einer anderen Funktion

if($this->isBanned($_SERVER['REMOTE_ADDR'])===true) { return json_encode(array('error'=>'You are banned from this ShoutBox.')); } 

Betroffene Funktion

function isBanned($ip) { 
    $q = $this->db->query("SELECT * FROM bans WHERE ip='".$ip."'"); $num = $this->db->affected_rows; 
    if($num>0) { $row = $this->db->fetch_array($q); if(($row['expires'] < time()) && ($row['expires'] !== 0)) { $this->unbanUser($ip,'internal'); return false; } return true; } return false; 
} 

unbanUser Funktion

function unbanUser($ip,$t='box') { 
    $q = $this->db->query("SELECT * FROM bans WHERE ip='".$ip."'"); $num = $this->db->affected_rows; if($num>0) { $q = $this->db->query("DELETE * FROM bans WHERE ip='".$ip."'"); 
    return (($t=='box') ? json_encode(array('status'=>'removed')) : true); } else { return (($t=='box') ? json_encode(array('error'=>'Unable to locate the user.')) : true); } 
} 
+0

Versuchen Sie, '$ ip' direkt vor der Abfrage zu drucken – codaddict

+0

Seltsam, auch wenn Sie es mit' mysql_real_escape_string() 'in Ihrer Datenbank-Klasse entkommen, die die IP-Zeichenfolge nicht beeinträchtigen sollte, über die Ihr Fehler spricht ... – BoltClock

+0

Die Abfrage sieht korrekt aus, vorausgesetzt, es sind keine ungeraden, nicht druckbaren Zeichen vorhanden. Der Fehler, den es sieht, ist am '*'. Ich nehme an, die Zeichenfolge ist alles ASCII, nicht UTF-8? – cHao

Antwort

7

ich denke, es kann es Ihre DELETE Aussage ist, die das verursacht Error.

Entfernen Sie die * nach der DELETE und es sollte in Ordnung sein.

+2

Es ist definitiv die 'DELETE', die das Problem hier verursacht. –

+0

Oh mein Gott. Ich habe heute zu viele Anfragen geschrieben und dachte nicht direkt an

DELETE
. Ja, das hat meine Probleme gelöst. Vielen Dank, dass Sie mir hier geholfen haben. –

+2

Das ist der Knoten in der Geschichte! – Nirmal

0

Versuchen Sie folgendes:

$q = $this->db->query('SELECT * FROM bans WHERE ip="' . $ip . '"'); 
+2

Welchen Unterschied würde das für MySQL machen? – BoltClock

+0

Ja genau, was ich dachte. –

+0

Eigentlich besagt der SQL-Standard, dass String-Literale einfach zitiert werden müssen, aber MySQL erlaubt doppelte Anführungszeichen (doppelte Anführungszeichen im SQL-Standard sind analog zu den hinteren Anführungszeichen von MySQL). Dies kann Ihnen einige Stunden Kopfkratzen ersparen, wenn Sie jemals ein anderes DBMS verwenden. – imgx64

0

Überprüfen Sie, ob Sie den "Charakter oder die" Zeichen verwenden (die letzte ist ein Akzent)

+1

Der Fehler ist irgendwo vor dem * – Nirmal

+0

Ich benutze 'nicht', aber es hat nie eine Rolle gespielt. –