Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: strtolower nie działa...
Forum PHP.pl > Forum > PHP
codo
Mam juz tego dosyc... zaczelo sie od napisania wyszukiwarki. Po wpisaniu słowa "łódĽ" miała mi znaleĽć takze te dane z bazy ktore zawierały "ŁódĽ" a także "ŁÓD¬". Wyszukiwanie bralo pod uwage jeszcze wiele innych kryteriow wiec nie dalo rady wszystkiego zamknac w jednym sqlu.
Wiec biore SELECT * FROM OBIEKTY.. i dalej jesli cos pasuje to wrzucam do tablicy wynikow.
Porownanie musi byc case insensitive czyli
to nie podziala:
  1. <?php
  2. echo &#092;"Ł \".strtolower(\"Ł\");// wypisze: Ł Ł
  3. ?>

nie dziala tez
  1. <?php
  2. stripos
  3. ?>

  1. <?php
  2.  
  3. if(strcasecmp(&#092;"ŁÓd¬\",\"Ľ\")>=0) echo \"MATCH\"; else echo \"NIE MA\";
  4. // wypisze NIE MA
  5.  
  6. ?>


Ale
  1. <?php
  2.  
  3. if(strcasecmp(&#092;"Abc\",\"a\")>=0) echo \"MATCH\"; else echo \"NIE MA\";
  4. // wypisze MATCH
  5.  
  6. ?>


Co tu zrobić??exclamation.gif
mdco
Wyszukiwarkę najlepiej robić przy pomocy zapytań sql. Mozna zrobic nawet bardzo skomplikowane zapytanie które znajd± Ci wszystko. Tylko trzeba troche z tym powalczyć...winksmiley.jpg
codo
To jak zrobic zeby po wpisaniu Gdansk wyszukiwarka znalazła Gdańsk?
Vengeance
zrobic o jednego wiecej WHERE, gdzie ten dodatkowy bedzie przyjmowal wartosc = '$nazwaMiastaPoPrzepuszczeniuPrzezFunkcje'

a funkcja o ktorej mowa, bedzie usuwac polskie znaki (tzn zastepywac je)
codo
Ale nie da sie napisac takiej funkcji efektywnie.... Ta funkcja musialaby zmienic Gdansk na Gdańsk

  1. SELECT *
  2. FROM TABELA WHERE OPIS LIKE %$szukane% OR OPIS LIKE %$szukane_z_polskimi_znakami%


Ale przeciez Gdansk =>
Gdańsk
Gd±nsk
Gd±ńsk
....
JAk napisac taka funkcje?!
Vengeance
Wiec może w bazie trzymaj nie 'Gdańsk' tylko 'Gdansk'.
Albo trzymaj tak i tak :] Problem zniknie
crash
Napisz sobie funkcję w php, która zamieni Ci polskie znaki na _ i taki ci±g daj w zapytaniu SQL.
codo
Nie chcialbym dublowac danych w bazie... jest sporo rekordow... Z kolei nie widze mozliwosci napisania takiej funkcji.
Jak to zmienia polskie znaki na '_'?
czyli
  1. SELECT *
  2. FROM TABELA WHERE OPIS LIKE %$szukane% OR OPIS LIKE %$szukane_z_kreskami%


To nie zadziala jak trzeba.. Czy ktos moglbym rozwiazac ten problem? Chyba to nie taki rzadki przypadek, ze chce skorzystac z wyszukiwarki z polskimi znakami ktora bedzie dzialac jesli ktos nie ma polskich znakow...
Major
Ogolnie zeby taka zamiana miała sens(dodatkowa kolumna z nazwa bez polskich fontów) trza polskie fontu zastapic unikatami, czyli np
Gdańsk by bylo Gda(n z kreska)sk
winksmiley.jpg I wtedy mozemy wuszikiwać bez problemów tongue.gif
codo
Ok, dodalem nowa kolumne ale to nie rozwiazuje problemu. Wyszukiwarka ma szukac w nazwie, opisie oraz miescie.
Czyli musialbym zdublowac kolejne kolumny, w tym kolumne z opisem, czyli duzo miejsca by to zajmowalo...
A czy nie mozna by zwrocic wszystkich rekordow i potem wybrac te ktore sa ok? Wielki minus to to ze trzeba zawsze wybrac wszystkie rekordy...
Co o tym myslicie?
_Mateo
  1. <?php
  2.  
  3. function filtruj_string($art) {
  4.  
  5.   $art=strtolower($art);
  6.   $art=str_replace('ł', 'l', $art);
  7.   $art=str_replace('ń', 'n', $art);
  8.   $art=str_replace('±', 'a', $art);
  9.   $art=str_replace('¶', 's', $art);
  10.   $art=str_replace('ę', 'e', $art);
  11.   $art=str_replace('ó', 'o', $art);
  12.   $art=str_replace('ż', 'z', $art);
  13.   $art=str_replace('Ľ', 'z', $art);
  14.   $art=str_replace('ć', 'c', $art);
  15.   return $art;
  16. }
  17.  
  18. foreach ($tablica_z_wynikami as $art) {
  19.   $art_do_sprawdzenia=filtruj_string($art);
  20.   $szukany_ciag=filtruj_string($szukany_ciag);
  21.   if(eregi($art_do_sprawdzenia, $szukany_ciag)) {
  22.     echo $art;
  23.    }
  24. }
  25.  
  26. ?>


pewien nie jestem, ale chyba o to chodzi?
DaNTe
Jak się nie boisz (czytaj jak nie masz setek userów) to możesz:
  1. <?php
  2.  
  3. function filtrujPl($tekst)
  4. {
  5.   return strtr($tekst, array(
  6.     'ł'=>'[ŁłLl]',
  7.     '±'=>'[ˇ±Aa]',
  8.     'ń'=>'[ŃńNn]',
  9.     /*... itd ...*/
  10.     'Ł'=>'[ŁłLl]',
  11.     /*... itd ...*/
  12.   ))
  13. }
  14.  
  15. ?>


i potem
  1. "SELECT *
  2. FROM tab WHERE fld1 RLIKE '".filtrujPl('Gdańsk')."'"


RLIKE mozna też zast±pić REGEXP

To dotyczy MySQL - nie wiem jak w innych bazach
codo
Cytat
Jak się nie boisz (czytaj jak nie masz setek userów) to możesz:
...
function filtrujPl($tekst)
{
  return strtr($tekst, array(
    'ł'=>'[ŁłLl]',
    '±'=>'[ˇ±Aa]',
    'ń'=>'[ŃńNn]',
    /*... itd ...*/
    'Ł'=>'[ŁłLl]',
    /*... itd ...*/
  ))
}




i potem
SQL
"SELECT *
FROM tab
WHERE fld1 RLIKE '".filtrujPl('Gdańsk')."'"


Brzmi super...
Wklepałem ale dostaje:
  1. SELECT *
  2. FROM objects WHERE desc_pl RLIKE gd[AaAa]ńsk

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in ....
to samo w przypadku
  1. SELECT *
  2. FROM objects WHERE desc_pl REGEXP gd[AaAa]ńsk

Dysponuje MySQLem...
DaNTe
a nie zapomniałe¶ o uszach ? zwróć uwagę, że powinno być
  1. REGEXP 'gd[Aaˇ±][ŃńNn]sk'


i nie wiem czemu masz AaAa a nie Aaˇ±

BTW: zawsze sobie sprawdzaj (w czasie debugu)
  1. <?php
  2. ?>

to ci dokladniej powie gdzie problem.
codo
Ok, dziekuje uruchomilo sie REGEXP mam tylko jeszcze jedno pytanie:
Mam obiekt o nazwie "XYZ Otmuchów Duży". User wpisuje otmuchow wiec dostaje
  1. SELECT *
  2. FROM objects WHERE LOWER(name) REGEXP 'otmuch[óo]w'

ale dostaje brak wyników
za to na zapytanie:
  1. SELECT *
  2. FROM objects WHERE LOWER(name) REGEXP 'otmuch[óo]'

mam wynik... Jak zrobic zeby bylo dobrze?
vhris
Sam post jest już nieco przeterminowany ale dla osób szukaj±c rozwi±zania moge zaproponowac co¶ takiego:

Zakładaj±c, że zmienna $temp to jest jaka¶ nazwa:

CODE
$temp = str_replace(array('ˇ','Ż','¬','Ć','¦','Ę','Ń','Ł','Ó'),array('±','ż','Ľ','ć','¶','ę','ń','ł','ó'),strtolower($temp));


PóĽniej juz standardowo do zapytania sql składamy:
CODE
$where = 'where lower(name) LIKE \''.$temp.'\'';


Ten sposób przynajmniej u mnie daje pozytywne wyniki.
To jest wersja lo-fi głównej zawarto¶ci. Aby zobaczyć pełn± wersję z większ± zawarto¶ci±, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.