Mysql, Wo, wie oder wie
Habe ein Problem mit einer MySql Abfrage. Ich bin auf der Suche nach einem Muster match in drei Felder, und ich habe versucht, mit Klammern voneinander trennen, wie Muster. Anstatt die richtige Anzahl von Zeilen zurückgibt, die alle Zeilen als Ergebnis.
Hier ist die Abfrage
mysql_query("select * from contacts where contact_name like '%$contact_name%' or bus_name like '%$busname%' or contact_email like '%$contact_email%'");
Wenn ich Suche für contact_name wie Kim oder busname wie someword und contact_email wie beliebig, es sollte nur 1 Ergebnis.
Ich denke, das Problem ist, wenn ein Benutzer hinterlässt einen Suche-Feld leer, MySql mag es nicht, Suche nach nichts in einer like-Anweisung. Würde ich besser sein, fangen, Feld, bevor Sie die Suche und ersetzen Sie es mit einem obskuren Charakter, also ist es nicht leer ist, oder gibt es eine Möglichkeit in der Erklärung, dass wir damit umgehen können mit einem leeren Suchstring
Dank für jede Hilfe, die
- konnte Sie zeigen, was die Daten in der Tabelle ist, und ein Aktuelles Beispiel mit echten Werten?
- SQL-injection-Gefahr Voraus! Bitte Lesen Sie über die Anweisungen vorbereitet.
- Hi. Nicht sicher was du da meinst. Die Daten in der Tabelle enthält ein Personen-name in Spalte 1 wird Ihr Firmenname in Spalte 2 und Ihre E-Mail-Adresse in Spalte 3 🙂
- was bekommen Sie, wenn Sie echo den query-string? Sind Sie sicher, dass diese 3 Variablen gefüllt werden? Mit
OR
wird mit den gegebenen Anforderungen, so dass, wenn einer leer ist, und es gibt Aufzeichnungen, die leer sind, dann passt es - contact_name bus_name contact_email Graham Belper Party Kuchen [email protected]
- 22 Datensätze mit allen Feldern gefüllt keine leeren Zeilen besitzt jeder Datensatz einen Personen-Namen, einen Firmennamen und einen E-Mail-Adresse
- Keine leeren Datensätze
- select * from mail_list wo contact_name like '%Kim%' oder bus_name like '%%' oder contact_email like '%noemail%'
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihr Instinkt ist richtig, dass Leerzeichen bewirkt, dass Ihre Anweisung, um alle Zeilen.
Wenn die person, sendet Sie ein leeres Formular, den SQL, der ausgeführt wird, ist wirklich:
Offensichtlich So, dass alle Zeilen.
Lösung: Sie müssen zuerst, um zu sehen, dass einer deiner Variablen einen Wert hat, und wenn Sie don ' T haben mindestens eine variable mit einer nicht-leeren/Gültiger Wert, man sollte einen Fehler zurück.
Ist UND ich DRINGEND ECHO der Poster, der sagte, dass es ernsthafte SQL-injection-Risiken, ohne Desinfektion Ihren code!!!
Lassen Sie uns betrachten Sie Ihre Abfrage:
Mal sehen, wie das ausgewertet wird, für jede Zeile:
Betrachten nun, was würde passieren, wenn Sie
and
stattor
:Scheint es mir, dass Sie brauchen, um zu verwenden
and
stattor
.Als für meinen Kommentar über SQL-injection, ich meine, dass die Art und Weise Ihrer Abfrage geschrieben ist, ist es eine offene Tür für einige rogue-code eingefügt werden und die Beschädigung Ihrer Daten. Stellen Sie sich, dass die variable
contact_name
zugeordnet ist, so etwas wie dieses:Das wäre schlecht.
Bitte überprüfen Sie dieser link (und auch diese wenn Sie lachen ein wenig über das, was SQL-injection machen kann).
UNION
in der SQL-Abfrage.