Seite 1 von 1
Probleme mit 'ORDER BY' in sql-abfrage!
Verfasst: 12.07.2003 17:33
von Jason
Hi,
ich habe in meinem Forum eine kleine DVD Datenbank in der die Benutzer auch nach DVD´s suchen können. Die gesuchten DVD´s werden aus der DB mit folgendem Query ausgelesen:
Code: Alles auswählen
$sql = "SELECT *
FROM " .DVD_TABLE . ',' .DVD_CAT_TABLE ."
WHERE `$where` LIKE '%" . $search . "%'
LIMIT 0,5;
$where enthält den namen der Spalte in der gesucht werden soll z.b. Author und $search enthält das wort nachdem gesucht werden soll.
Das liest die ersten 5 DVDs aus der datenbank aus mit den dazugehörenden kategoriennamen nun würde ich diese ausgabe gerne nach dvd_title sortieren lassen dazu habe ich ORDER BY dvd_title hinzugefügt:
Code: Alles auswählen
$sql = "SELECT *
FROM " .DVD_TABLE . ',' .DVD_CAT_TABLE ."
WHERE `$where` LIKE '%" . $search . "%'
ORDER BY dvd_title
LIMIT 0,5;
Leider funktioniert das nicht jetzt wird nurnoch 1 Datensatz ausgegeben und nicht wie es sein sollte 5
Hat irgendjemand ne idee wo der fehler liegen könnte?
Grüße Jason
Verfasst: 12.07.2003 19:39
von PhilippK
Hast du die Query auch mal direkt ausprobiert (also z.B. mit phpMyAdmin)?
Gruß, Philipp
Verfasst: 12.07.2003 20:30
von Jason
Hi,
so gehts wunderbar vieleicht habe ich ja noch woanders im script einen fehler gemacht bei der pagination oder so ich habs hier mal hochgeladen vieleicht kann ja mal jemand reinsehen:
dvd_search.php (Das ist das Original ohne das ORDER BY dvd_title)
Vieleicht habe ich das problem oben auch etwas doof beschrieben also die User können über ein Formular nach DVD´s suchen wenn es jetzt für eine suchanfrage z.b. 27 Ergebnisse gibt werden diese durch die Pagination auf 6 seiten mit jeweils 5 ergebnissen verteilt diese ergebnise möchte ich nach dvd_title sortieren dazu habe ich wie gesagt das ORDER BY dvd_title hinzugefügt dann werden weiterhin die ergebnisse auf 6 Seiten aufgeteilt aber es wird nur auf den ersten 5 seiten jeweils 1 Datensatz aufgelistet und auf der 6 garkeine. Hoffe mal das war jetzt etwas verständlicher ausgedrückt
Grüße Jason
Verfasst: 12.07.2003 20:37
von PhilippK
Was mir gerade so auffällt: du hast die beiden Tabellen ja garnicht verknüpft. Ein JOIN wäre da nicht ganz schlecht...
Gruß, Philipp
Verfasst: 12.07.2003 22:42
von Jason
Arghh ich honk

Hat sich erledigt habs hinbekommen hattest recht mit nem Join gehts
Danke dir
Gruss Jason
Verfasst: 13.07.2003 18:10
von Jason
Hi,
zurzeit können die User nur nach wörtern oder wortteilen suchen die in dvd titel/beschreibung vorhanden sind aber ich hätte es gerne so das die User auch wildcards benutzen können also wenn sie z.b. nach d*d suchen sollen sowohl titel die dvd enthalten als auch titel die deutschland enthalten ausgegeben werden ist das irgendwie möglich?
Gruss Jason
Verfasst: 13.07.2003 18:28
von PhilippK
Schon mal probiert, das Sternchen (*) durch 'nen Prozent-Zeichen (%) zu ersetzen. Für genau ein Zeichen den Unterstich (_) und nicht das Fragezeichen (?) verwenden.
Ach ja: Aufpassen, dass du in dem vom Benutzer eingegebenen String die Anführungszeichen behandelst (entweder escapen oder ganz löschen). Sonst kann der so ziemlich jeden SQL-Befehl auf deiner DB ausführen.
Gruß, Philipp
Verfasst: 13.07.2003 19:20
von Jason
Stimmt mit prozent gehts aber den Usern meines Forums wäre es lieber mit nem * gibts da vieleicht ne möglichkeit das wenn sie ein * eingeben das mit % ersetzt wird so wie bei der generellen phpBB Suche?
Code: Alles auswählen
Ach ja: Aufpassen, dass du in dem vom Benutzer eingegebenen String die Anführungszeichen behandelst (entweder escapen oder ganz löschen). Sonst kann der so ziemlich jeden SQL-Befehl auf deiner DB ausführen.
Wie meinst das? Sorry ich bin noch absolut noob
Grüße Jason
Verfasst: 13.07.2003 20:07
von Pyramide
Jason hat geschrieben:gibts da vieleicht ne möglichkeit das wenn sie ein * eingeben das mit % ersetzt wird?
http://de.php.net/manual/de/function.str-replace.php
Code: Alles auswählen
Ach ja: Aufpassen, dass du in dem vom Benutzer eingegebenen String die Anführungszeichen behandelst (entweder escapen oder ganz löschen). Sonst kann der so ziemlich jeden SQL-Befehl auf deiner DB ausführen.
Wie meinst das? Sorry ich bin noch absolut noob
http://de.php.net/manual/de/function.my ... string.php
PS: Ich habe mal eine "SearchToSQL" Funktion geschrieben, die aus Suchanfragen wie
(PHP OR Java) + *Forum einen gültigen SQL-WHERE-Befehl generiert:
http://mitglied.lycos.de/pyramidenzahn/ ... htosql.txt . Verwendung etwa so:
Code: Alles auswählen
$sql = "SELECT *
FROM " .DVD_TABLE . ',' .DVD_CAT_TABLE ."
WHERE " . SearchToSQL($search, array($where)) . "
ORDER BY dvd_title
LIMIT 0,5;
Der erste Parameter ist der Such-String vom User, der zweite ein Array von Spaltennamen, in denen mit LIKE gesucht wird, der dritte ein Array von Spaltennamen, in denen mit = gesucht wird und der vierte ein array mit Optionen (siehe Quellcode unter //settings). Weglassen kannst du den 4. und entweder 2. oder 3. HTH
Verfasst: 13.07.2003 22:29
von Jason
Danke Pyramide,
ich werde deine funktion morgen mal ausprobieren
Gruss Jason