2010-11-29 8 views
0
"SELECT * FROM reservation WHERE roomnum = {$room['roomnum']} 
AND roomtype = {$room['roomtype']} 
AND (dateout NOT BETWEEN '$start' AND '$end' 
OR datein NOT BETWEEN '$start' AND '$end')" 

Wenn ich diese Abfrage ich folgende Fehlermeldung erhalten, laufen:Multiple Betweens in einer Anweisung

Sie haben einen Fehler in Ihrer SQL-Syntax;

check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND (dateout NOT BETWEEN '2010-11-22' AND '2010-11-30' OR datei' at line 3

habe ich versucht, diese Abfrage für eine Weile Neuformatierung (mit() und die Erklärungen zu entfernen, die nicht zwischen Aussagen vor den kommen). Das Endergebnis ist immer ein Syntaxfehler. Gibt es ein Problem mit zwei Zwischenspielen?

Danke, Ryan

+3

Wahrscheinlich weil $ room ['roomtype'] leer ist. Diese SQL ist falsch 'roomtype = AND', mysql warte auf etwas nach' = ' – RageZ

+0

Wenn Sie die Abfrage einer Variablen zuweisen und sie drucken könnten, würde es uns helfen, besser zu debuggen. – Nigel

+0

Plus Ich bin nicht wirklich sicher, aber es scheint, dass Ihr Code würde von SQL-Injektion leiden .... Sie wollen wahrscheinlich beginnen, parametrisierte SQL-Abfragen verwenden. http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html – RageZ

Antwort

2

Ich glaube, Sie müssen wahrscheinlich das Debuggen dieser Art starten Fehler durch das Dumping der vollständigen SQL und versuchen Sie es selbst mit mysql-Client, wenn Sie nicht verstehen, warum es nicht funktioniert.

würde ich

$sql = "SELECT * FROM reservation WHERE roomnum = {$room['roomnum']} 
AND roomtype = {$room['roomtype']} 
AND (dateout NOT BETWEEN '$start' AND '$end' 
OR datein NOT BETWEEN '$start' AND '$end')"; 

var_dump($sql); 

tun, und ich denke, es ist offensichtlich sein wird, was falsch ist.

Plus wie ich in meinem Kommentar gesagt, wenn Sie nicht entkommen $room Array, würde dieser Code von sql injection Sicherheitslücken leiden. Sie müssen besser einige parametrisierte Abfragen für Ihre reference verwenden. Plus vorbereitete Aussage führt besser aus und macht den Code in meiner ehrlichen Meinung lesbarer.

+0

@RageZ: glückliche Zeiten, wenn Trivia Fragen über Platzhalter konnten 120+ upvotes sammeln :-)) – zerkms

+0

@Zerkms: ja, ich war nicht auf Stackoverflow zu dieser Zeit. Schade! Ich könnte die 50k plus Ruf erreicht haben ;-) – RageZ

+0

@RageZ: Obwohl vorbereitete Aussagen wunderbar sind, können sie eine wichtige PITA sein, wenn Sie einmal versuchen, zu einem anderen Datenbankanbieter zu wechseln. Ich denke, Sie sollten auf dieses Problem hinweisen, da es nicht offensichtlich ist. – aefxx

0

RageZ ist wahrscheinlich recht - es wie folgt umschreiben:

SELECT * FROM reservation WHERE 
(roomnum = {$room['roomnum']} AND roomtype = {$room['roomtype']}) AND 
(dateout NOT BETWEEN '$start' AND '$end' OR datein NOT BETWEEN '$start' AND '$end'); 
+1

Und wie hilft das bei nicht vorhandenen Variablen? Eine weitere Zahnspange wird magischen Wert in $ room ['roomtype'] bringen? ;-) – zerkms

+0

das gleiche hier ;-) das tut nichts, ein guter alter 'var_dump ($ sql)' würde helfen – RageZ

+0

der Punkt ist, die erste Klausel zu isolieren, um den Syntaxfehler zu verhindern. Basierend auf dem Beispiel des OPs ist das Reparieren der Logik ein wenig außerhalb des Rahmens ... – simon

1
SELECT * 
    FROM reservation 
    WHERE roomnum = {$room['roomnum']} 
    AND roomtype = {$room['roomtype']} 
AND NOT (datein BETWEEN '$start' AND '$end' 
    AND dateout BETWEEN '$start' AND '$end') 

NOT x OR NOT y, die im wesentlichen AS NOT (a AND b) gleich ist. Dieses Axiom ist Teil von De Morgan's law. Wenn Sie sich also nicht sicher sind, welche Gruppierung Sie verwenden, verwenden Sie diese und andere boolesche Logik.

EDIT
Wie andere schon angedeutet, scheint der Fehler eine leere Variable zu sein. Um sicherzustellen, dass Ihre Anfrage nicht bricht, wenn eine leere roomtype oder roomnum angegeben wird, können Sie diese Parameter einfach angeben, was zu einem Vergleich mit einer leeren Zeichenfolge führen würde (HINWEIS: Ich empfehle diese Strategie NICHT. Bitte überprüfen Sie Ihre Variablen, BEVOR sie in Anweisungen verwendet werden).

+0

Diese Abfrage wird ihm absolut denselben Syntaxfehler geben. – zerkms

+1

Ja, Sie haben Recht, aber er fragte, ob die Verwendung von mehreren "BETWEENS" den Fehler verursachen könnte. Wie Sie wahrscheinlich zustimmen werden, ist die obige Aussage vollkommen legal, was wiederum dem OP zeigen würde, dass sein Fehler eher in den Parametern als in der Aussage selbst zu finden ist. – aefxx

+0

Ja, aber er fragte das, weil er nicht Debuggen kann. In diesen Fällen antworte ich lieber auf das ** aktuelle ** Problem, das OP helfen wird, einen funktionierenden Code zu bekommen, unabhängig von der * falschen Frage * ;-) – zerkms

0

Können Sie dies versuchen

"SELECT * FROM reservation WHERE roomnum = {$room['roomnum']} AND roomtype = {$room['roomtype']} AND ((dateout NOT BETWEEN '$start' AND '$end') OR (datein NOT BETWEEN '$start' AND '$end'))" 
+2

Zu wenig Klammern. Ich stimme für das Hinzufügen von 5 oder sogar 6 weiteren Paaren. – zerkms

+0

@zerkms +1 Klammern sind das Brot eines Programmierers. Da sie frei sind, ist es immer gut, sie wie eine gazillion von ihnen zu haben: D – aefxx

0

Bitte verwenden Sie diese Syntax und prüfen Sie, dass $ Zimmer [ ‚Zimmertyp‘] nicht leer

SELECT * FROM reservation 
WHERE roomnum = '".$room['roomnum']."' AND roomtype = '".$room['roomtype']."' 
AND (dateout NOT BETWEEN '".$start."' AND '".$end."' OR datein NOT BETWEEN '".$start."' AND '".$end."') 
+0

Irgendwelche Gründe, ** diese ** Syntax zu verwenden? – zerkms