"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

PHP/MYSQL Suche mit Umlauten

BiG_WEaSeL 07.01.2007 - 11:24 943 6
Posts

BiG_WEaSeL

Super Moderator
-
Avatar
Registered: Jun 2000
Location: Wien
Posts: 8088
Folgende Ausgangssituation: Ich habe eine Suche (selbst geschrieben) für eine Newsseite die die MYSQL-Datenbank durchsucht.

Code: PHP
SELECT * FROM news WHERE titel LIKE "%$sucharray[$i]%" or unter LIKE "%$sucharray[$i]%" or artikel LIKE "%$sucharray[$i]%" ORDER BY datum DESC limit $offset,$anzahl;
Danach führe ich eine query aus um zu sehen wieviele Treffer es insgesamt waren:
Code: PHP
SELECT COUNT(id) AS treffer FROM news WHERE" . titel LIKE "$sucharray[$i]" or unter LIKE "$sucharray[$i]" or artikel LIKE "%$sucharray[$i]%" . " AND datum<='$testdatum' AND frei=\"J\";


Mein Problem:

Bei der oben stehenden Suchquery wird bei der Suche nach ÖBB auch OBB und OEBB gefunden + zusätzlich case-insensitve, ich möchte allerdings nur Jene Datensätze die wirklich ÖBB enthalten (case-insensitve, also auch öBB Öbb etc.)


Lösungsversuche:

1. ich hab die query mit "like binary" erweitert, was bewirkt, dass nur noch ÖBB (case-sensitive) gefunden wird.

2. ich verwende die oben genannte Query und filtere per PHP die falschen Treffer heraus, dabei habe ich allerdings das Problem, dass ich es nicht zusammenbringe das "nächste/vorherige Seite" Feature zu implementieren weil ich nach dem herausfiltern nicht mehr mehr als (z.b. 20) Results habe (ÖBB liefert 29 echte Treffer) und so das Feature glaubt es gibt nicht mehr Treffer.

3. ich habe schon unzählige Scripts auf z.b. hotscripts.com, drupal etc durchforstet bin aber nicht schlauer geworden


Kann mir jemand von euch eventuell dabei helfen? Wäre sehr nett.

Burschi1620

24/7 Santa Claus
Avatar
Registered: Apr 2004
Location: Drüber da Donau
Posts: 6792
du könntest die suchergebnisse in php separat nochmal nach ÖBB durchsuchen (um das OBB und OEBB problem zu umgehen)

fatmike182

Agnotologe
Registered: Oct 2005
Location: VIE
Posts: 4223
ist zwar nicht die eleganteste Lösung, aber dass die Suche zwischen ä & a nicht unterscheidet ist ja auch nicht fein.

Könnte man niht mit upper [http://dev.mysql.com/doc/refman/5.1...-functions.html] oder so für die Suche den String so umwandeln, dass quasi keine casesensitivity mehr da ist (da ohnehin alles Großbuchstaben) & dann mit dem neuen String binary abfragen?

Vllt hilft dir ein Link von denen weiter, der hat das selbe Problem gehabt: http://lists.phpbar.de/pipermail/my...May/003371.html

BiG_WEaSeL

Super Moderator
-
Avatar
Registered: Jun 2000
Location: Wien
Posts: 8088
vielen dank fatmike, ich brauchte wohl einen externen anschub, mit LOWER() hab ich's schon probiert das hat damals nicht funktioniert, mit UPPER funktioniert es jetzt.

@burschi: bitte vorher den ganzen post lesen und nicht nur die überschrift ;) (siehe lösungsversuch 2)

Burschi1620

24/7 Santa Claus
Avatar
Registered: Apr 2004
Location: Drüber da Donau
Posts: 6792
habs eig. gelesen aber anscheinend missinterpretiert ;)
Aber das problem kannst du ja auch noch lösen. Je nachdem wie des ganze halt aussieht (wwi :D ) kannst du dir ja irgendwelche hilfsvariablen oder die treffer selbst auf die nächste seite rüberschicken (ich rede vom <form> in html) und da dann auslesen und anhängen oder so.
Weiß net ob des so gehen könnte, so hätte ich es halt gemacht. Hab halt noch keine großen erfahrungen mit php sammeln können ;)

edit: eh schon solved, diesmal überlesen *g*. Nadann is ja egal ;)
Bearbeitet von Burschi1620 am 07.01.2007, 12:33

fatmike182

Agnotologe
Registered: Oct 2005
Location: VIE
Posts: 4223
bitteschön *µ*
war eigentlich Zufall, dass ich Upper geschrieben hab & nicht Lower... Wundert mich, dass das eine funktioniert & das andere nicht!

D.h. suche funzt jetzt ganz?
(hab sowas bei suchfunktionen NIE berücksichtigt, aber jetzt wo ichs weiß...)

BiG_WEaSeL

Super Moderator
-
Avatar
Registered: Jun 2000
Location: Wien
Posts: 8088
Zitat von fatmike182
bitteschön *µ*
war eigentlich Zufall, dass ich Upper geschrieben hab & nicht Lower... Wundert mich, dass das eine funktioniert & das andere nicht!

hab es heute nicht mehr ausprobiert, vielleicht hab ich damals auch etwas anderes falsch gemacht

Zitat

D.h. suche funzt jetzt ganz?
(hab sowas bei suchfunktionen NIE berücksichtigt, aber jetzt wo ichs weiß...)

ja, und zwar so:

Code: PHP
mysql_query("SELECT * FROM news WHERE UPPER(titel) like \"%" . strtoupper($sucharray[$i]) . "%\" or UPPER(unter) LIKE \"%" . strtoupper($sucharray[$i]) . "%\" or UPPER(artikel) LIKE \"%" . strtoupper($sucharray[$i]) . "%\" ORDER BY datum DESC limit $offset,$anzahl;");

als verbesserung könnte man auch $sucharray[$i] nur 1 mal vorher umwandeln und in eine temporäre variable schreiben, die man dann in der query benützt.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz