Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   LIKE auf mehrere Möglichkeiten anwenden (https://www.delphipraxis.net/67436-like-auf-mehrere-moeglichkeiten-anwenden.html)

faux 14. Apr 2006 12:40

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:
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
Eigentlich kommts nur auf Zeile 5 an. In diesem Fall werden nur Einträge mit B beginnend angezeigt, klar.
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.

mkinzler 14. Apr 2006 12:45

Re: LIKE auf mehrere Möglichkeiten anwenden
 
Ich würde einen parametrisierten Query anlegen:
SQL-Code:
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
Den Parameter such mußt du beim aktivieren der Buttons nur entsprechend setzen:

Delphi-Quellcode:
query.ParamByName( 'such').value := '%B%';
Query.ExecSql;

faux 14. Apr 2006 12:52

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

marabu 14. Apr 2006 13:05

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

mkinzler 14. Apr 2006 13:06

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:
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
und übergebe dem Skript den gesuchten Anfangsbuchstaben per POST/GET .

[Achtung: meine Lösung ist exemplarisch, da eigentlich eine Übgabe an ein Skript niemals ungeprüft verwendet werden sollte / SQL-Injection möglich]

faux 14. Apr 2006 13:14

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:
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
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.
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:

Zitat von marabu
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.

Werde ich mal probieren.

Grüße
Faux

mkinzler 14. Apr 2006 13:23

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:
...
WHERE s.type = t.id
    AND p.id = s.publisher
    AND ((serie LIKE '%'.$_POST['cat']."%') OR ( substring (...) IN ( ".$_POST['begmit']."));
und übergibst dann cat und begmit in der Form: "'A'", oder bei Ziffern: "'0', '1', '2', ..."

faux 15. Apr 2006 11:48

Re: LIKE auf mehrere Möglichkeiten anwenden
 
Zitat:

Zitat von mkinzler
SQL-Code:
...
WHERE s.type = t.id
    AND p.id = s.publisher
    AND ((serie LIKE '%".$_POST['cat']."%') OR ( substring (...) IN (".$_POST['begmit']."));

Müsste es nicht AND heißen?

SO gehts:
SQL-Code:
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
Aber ist das AND von mir richtig, oder ein Denkfehler und dein OR stimmt?

Habe gerade eine noch einfachere Methode rausgefunden:
SQL-Code:
AND substring(serie,1,1) BETWEEN '0' AND '9'
Danke für die Hilfe!

Grüße
Faux

mkinzler 15. Apr 2006 12:11

Re: LIKE auf mehrere Möglichkeiten anwenden
 
Stimmt es muß and heißen !

generic 16. Apr 2006 01:22

Re: LIKE auf mehrere Möglichkeiten anwenden
 
SQL-Code:
  AND serie LIKE ".$_POST['such']."%";
wer sowas benutzt braucht sich nicht zu wundern wenn die datenbank leer ist oder die seite defaced wird!

ACHTUNG SOLCHE KONSTRUKTE SIND UNSICHER!

jedes script kidde wird euch dort eine SQL injection machen.

bitte das hier mal durchlesen:
http://www.unixwiz.net/techtips/sql-injection.html

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 Uhr.
Seite 1 von 2  1 2      

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