![]() |
Datenbank: MySQL • Version: 4.0 • Zugriff über: PHP 4.4.0 MySQL-Modul
LIKE auf mehrere Möglichkeiten anwenden
Hallo!
Ich habe auf einer Seite, welche Daten aus einer Datenbank anzeigt, eine Leiste mit den Links von A-Z, mit denen man die Suche nach Anfangsbuchstaben einschränken kann. Ich löse das dann einfach so:
SQL-Code:
Eigentlich kommts nur auf Zeile 5 an. In diesem Fall werden nur Einträge mit B beginnend angezeigt, klar.
SELECT *
FROM page_series AS s, page_types AS t, page_publishers AS p WHERE s.type = t.id AND p.id = s.publisher AND serie LIKE 'B%cat%' ORDER BY serie ASC Jetzt sollte es aber auch einen 0-9 Button und einen für Sonderzeichen geben. Wie löse ich das, ohne alles mit OR zu verknüpfen? Grüße Faux EDIT: Hab mal das Query etwas verlürzt, ist ja sinnlos sonst. |
Re: LIKE auf mehrere Möglichkeiten anwenden
Ich würde einen parametrisierten Query anlegen:
SQL-Code:
Den Parameter such mußt du beim aktivieren der Buttons nur entsprechend setzen:
SELECT s.id, serie, band, zusatz, t.type, author, p.publisher AS verlag, isbn, price, pages, publish_month, publish_year, notes
FROM page_series AS s, page_types AS t, page_publishers AS p WHERE s.type = t.id AND p.id = s.publisher AND serie LIKE :such ORDER BY serie ASC
Delphi-Quellcode:
query.ParamByName( 'such').value := '%B%';
Query.ExecSql; |
Re: LIKE auf mehrere Möglichkeiten anwenden
Danke für die Antwort, aber ich verstehe nur Bahnhof. :stupid:
Ich programmiere in PHP, was eigentlich egal sien müsste, da ich ja nur ein SQL-Query brauche. Könntest du mir ev. den Link zur MySQL Doku für diese Parameter geben? Unter SELECT steht nichts und den Artikel zu LIKE finde ich auch gerade nichtmehr. :x Grüße Faux |
Re: LIKE auf mehrere Möglichkeiten anwenden
Hallo Faux,
du schreibst von Präfixsuche und zeigst "B%cat%". Wenn es wirklich nur um eine Präfixsuche geht, dann geht es auch ohne LIKE und dessen schlechtes Laufzeitverhalten. Greife einfach das erste Zeichen per Substring() ab und machen einen Mengentest mit WHERE substring(...) IN ('0', '1', ...). Die genaue Syntax kannst du bestimmt in der Doku nachlesen. Grüße vom marabu |
Re: LIKE auf mehrere Möglichkeiten anwenden
Hallo faux,
In PHP bringt das mit den Parametern eh nicht so viel, da beim Klick auf einen Button sowieso ein Skript neu gestartet wird. Ich vestehe deine Frage nur nicht ganz. Es soll doch immer nur nach einem Anfangbuchstaben ( ich zähle nun Ziffern und Sonderzeichen auch dazu) sortiert werden oder? Dann brauchst du ja kein OR. In PHP kannst du das aber auch anderst lösen verwende die Abfrage:
SQL-Code:
und übergebe dem Skript den gesuchten Anfangsbuchstaben per POST/GET .
SELECT s.id, serie, band, zusatz, t.type, author, p.publisher AS verlag, isbn, price, pages, publish_month, publish_year, notes
FROM page_series AS s, page_types AS t, page_publishers AS p WHERE s.type = t.id AND p.id = s.publisher AND serie LIKE ".$_POST['such']."%"; ORDER BY serie ASC [Achtung: meine Lösung ist exemplarisch, da eigentlich eine Übgabe an ein Skript niemals ungeprüft verwendet werden sollte / SQL-Injection möglich] |
Re: LIKE auf mehrere Möglichkeiten anwenden
Also mein Problem liegt nicht an der PHP-Umsetzung sondern am SQL-Query:
Der User sucht nach cat. Also lautet das Query %cat%. Da aber "cat" unter Umständen einige Hundert Suchergebnisse liefert, habe ich so eine Leiste eingebaut:
Code:
Wenn der User auf "A" klickt, wird das Query so abgeändert: A%cat%, also nur die Suchergebnisse angezeigt, die mit A beginnen. Da gibts auch kein Problem.
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z
Nur gibt es auch Suchergebnisse, welche nicht mit Buchstaben, sondern mit einer Ziffer oder einem Sonderzeichen beginnen. Wie bekomme ich diese jetzt? Ich will nicht 10 Buttons machen mit 1, 2, 3, ... sondern einen Button, der alle Einträge, welche mit einer Ziffer beginnen anzeigt. Zitat:
Grüße Faux |
Re: LIKE auf mehrere Möglichkeiten anwenden
Jetzt habe auch ich verstanden, auf was du hinaus willst. Dann mußt du ja nur den Lösungsvorschlag von Achim mit einbeziehen und die Abfrage nach Anfangsziffern durh eine OR-Bedingung anhängen.
SQL-Code:
und übergibst dann cat und begmit in der Form: "'A'", oder bei Ziffern: "'0', '1', '2', ..."
...
WHERE s.type = t.id AND p.id = s.publisher AND ((serie LIKE '%'.$_POST['cat']."%') OR ( substring (...) IN ( ".$_POST['begmit'].")); |
Re: LIKE auf mehrere Möglichkeiten anwenden
Zitat:
SO gehts:
SQL-Code:
Aber ist das AND von mir richtig, oder ein Denkfehler und dein OR stimmt?
SELECT *
FROM page_series AS s, page_types AS t, page_publishers AS p WHERE s.type = t.id AND p.id = s.publisher AND serie LIKE '%masken%' AND substring(serie,1,1) IN ('1','2','3','4','5','6','7','8','9','0') ORDER BY serie, band ASC Habe gerade eine noch einfachere Methode rausgefunden:
SQL-Code:
Danke für die Hilfe!
AND substring(serie,1,1) BETWEEN '0' AND '9'
Grüße Faux |
Re: LIKE auf mehrere Möglichkeiten anwenden
Stimmt es muß and heißen !
|
Re: LIKE auf mehrere Möglichkeiten anwenden
SQL-Code:
wer sowas benutzt braucht sich nicht zu wundern wenn die datenbank leer ist oder die seite defaced wird!
AND serie LIKE ".$_POST['such']."%";
ACHTUNG SOLCHE KONSTRUKTE SIND UNSICHER! jedes script kidde wird euch dort eine SQL injection machen. bitte das hier mal durchlesen: ![]() gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz