AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken LIKE auf mehrere Möglichkeiten anwenden
Thema durchsuchen
Ansicht
Themen-Optionen

LIKE auf mehrere Möglichkeiten anwenden

Ein Thema von faux · begonnen am 14. Apr 2006 · letzter Beitrag vom 16. Apr 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#1

LIKE auf mehrere Möglichkeiten anwenden

  Alt 14. Apr 2006, 12:40
Datenbank: MySQL • Version: 4.0 • Zugriff über: PHP 4.4.0 MySQL-Modul
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.
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: LIKE auf mehrere Möglichkeiten anwenden

  Alt 14. Apr 2006, 12:45
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;
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: LIKE auf mehrere Möglichkeiten anwenden

  Alt 14. Apr 2006, 12:52
Danke für die Antwort, aber ich verstehe nur Bahnhof.
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.

Grüße
Faux
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: LIKE auf mehrere Möglichkeiten anwenden

  Alt 14. Apr 2006, 13:05
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: LIKE auf mehrere Möglichkeiten anwenden

  Alt 14. Apr 2006, 13:06
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]
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: LIKE auf mehrere Möglichkeiten anwenden

  Alt 14. Apr 2006, 13:14
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 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
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: LIKE auf mehrere Möglichkeiten anwenden

  Alt 14. Apr 2006, 13:23
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', ..."
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: LIKE auf mehrere Möglichkeiten anwenden

  Alt 15. Apr 2006, 11:48
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:
AND substring(serie,1,1) BETWEEN '0AND '9' Danke für die Hilfe!

Grüße
Faux
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: LIKE auf mehrere Möglichkeiten anwenden

  Alt 15. Apr 2006, 12:11
Stimmt es muß and heißen !
Markus Kinzler
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#10

Re: LIKE auf mehrere Möglichkeiten anwenden

  Alt 16. Apr 2006, 01:22
  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
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz