Skocz do zawartości

[mysql/php] Wyszukiwanie z polskimi znakami w php/mysql


dj.drezyna

Polecane posty

Mam problem z wyszukiwaniem polskich znaków. W tabeli o której mowa jest porównywanie napisów ustawione na latin2_bin. Chciałbym też nadmienić, że phpMyAdmin wyszukuje bezbłędnie np. ś, ę wersja stara (3.3.1) PHP 5.3.6 Mysql 5.5.13

Mam oto taki kod w którym wyszukanie bęben nic nie daje wyniku ale już ben znajduje.

 

I nie ważne czy jest:

$nazwa = mysql_real_escape_string(strtoupper($_POST['nazwa']));
//czy
$nazwa = mysql_real_escape_string(strtoupper(iconv('utf-8','iso-8859-2',$_POST['nazwa'])));
//czy
$nazwa = mysql_real_escape_string(strtoupper(iconv('latin2','iso-8859-2',$_POST['nazwa']))); // choć to błędne...
//czy usunięta jest deklaracja set_charset

A oto pełny kod

$baza = mysql_connect('localhost','root','a');
mysql_select_db('magazyn');
mysql_set_charset ('latin2');
if (!empty($_POST)) {
$nazwa = mysql_real_escape_string(strtoupper(iconv('utf-8','iso-8859-2',$_POST['nazwa'])));
$zapytanie = '
SELECT nazwa FROM produkty WHERE';
if ($_POST['nazwa'] != null) $zapytanie .= " UCASE(nazwa) LIKE '%$nazwa%'";
$wynik = mysql_query($zapytanie,$baza)
?>
<p class="p_info">Kryteria spełniają następujące wydziały:</p>
<?php
}
if (mysql_num_rows($wynik) < 1) {
?>
<p class="p_info">Niczego nie znaleziono!</p>
<?php
}
?>
<?php
while ($wiersz = mysql_fetch_array($wynik)) {
echo $wiersz['nazwa'].'<br />';
}
mysql_close($baza);
?>
<form style="width: 50%" action="temp2.php" id="formik" method="POST">
Nazwa produktu: <input type="text" name="nazwa" />
<input class="przycisk" type="submit" value="Wyszukaj" />
</form>

Byłbym wdzięczny za pomoc i wskazanie co tutaj jest nieprawidłowo.

pozdrawiam!

 

P.S. Polskie znaki w y ś w i e t l a poprawnie.

Galeria przyrodnicza http://fotokrajobrazy.warmia.pl

Link do komentarza
Udostępnij na innych stronach

Testowałem sobie ;P i zapytam:

Czemu tu zmieniasz na iso? skoro baza ma latin2?

$nazwa = mysql_real_escape_string(strtoupper(iconv('utf-8','iso-8859-2',$_POST['nazwa'])));

 

zobacz, że to co ja Ci podam działa bez problemu:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<?php
$baza = mysql_connect('localhost','root','qwerty');
mysql_select_db('testowa_baza');
mysql_set_charset ('latin2');
if (!empty($_POST)) {
$nazwa = mysql_real_escape_string(strtoupper(iconv('utf-8','latin2',$_POST['nazwa'])));
$zapytanie = '
SELECT nazwa FROM produkty WHERE';
if ($_POST['nazwa'] != null) $zapytanie .= " UCASE(nazwa) LIKE '%$nazwa%'";
$wynik = mysql_query($zapytanie,$baza)
?>
<p class="p_info">Kryteria spełniają następujące wydziały:</p>
<?php
}
if (mysql_num_rows($wynik) < 1) {
?>
<p class="p_info">Niczego nie znaleziono!</p>
<?php
}
?>
<?php
while ($wiersz = mysql_fetch_array($wynik)) {
  echo iconv('latin2','utf-8',$wiersz['nazwa']).'<br />';  // Jezeli kodowanie strony jest inne niz bazy to przy kazdym pobraniu danych musisz konwersje typow zrobic :]
}
mysql_close($baza);
?>
<form style="width: 50%" action="index.php" id="formik" method="POST">
Nazwa produktu: <input type="text" name="nazwa" />
<input class="przycisk" type="submit" value="Wyszukaj" />
</form>

Prawdziwy programista wiesza sie wraz ze swoim programem.

Link do komentarza
Udostępnij na innych stronach

Ojej niepotrzebnie podawałem te utf-8. Po prostu mówię, że próbowałem już wszystkiego. Ja korzystam z iso-8859-2, cała strona na tym jest. I jak mówisz zrobiłem analogicznie, czyli:

$nazwa = mysql_real_escape_string(strtoupper(iconv('iso-8859-2','latin2',$_POST['nazwa'])));

razem z deklaracją, której i wcześniej używałem, czyli

<meta http-equiv="content-type" content="text/html; charset=iso-8859-2" />

I dalej nic nie działa, czyli po wpisaniu frazy bez polskich znajduje a z ś np. nie znajdzie Taśma.

 

Jeszcze powiem, że zrobiłem test co on takiego widzi przed konwersją i po niej i zrobiłem:

echo '<br />'.$_POST['nazwa'].'<br />';
$nazwa = mysql_real_escape_string(strtoupper(iconv('iso-8859-2','latin2',$_POST['nazwa'])));
echo '<br />'.$nazwa.'<br />';

Wynik był szokujący: po wpisaniu w inputa ś wyświetlił w obu przypadkach... ś Więc czemu w bazie nie znajduje?

 

Szok jeszcze większy wpisałem w inputa bęben to w pierwszy wyrzuciło bęben a w drugim BęBEN i już wiadomo dlaczego nie znajduje, bo UCASE podniesie do drukowanych wszystkie litery, funkcja php tylko alfabetu łacińskiego, SZOK!!

 

I co teraz jak zmusić php by ponosił do wielkich liter też polskie znaki? Bo ja tylko ten sposób znam by wyszukiwał bez znaczenia na wielkość znaków, czyli podnieść wszystkie na duże i w bazie też użyć UCASE.

 

A i dziękuję za odpowiedź! :)

Galeria przyrodnicza http://fotokrajobrazy.warmia.pl

Link do komentarza
Udostępnij na innych stronach

Czasami człowiekowi jest potrzebna pewna iskra lub wskazówka niekoniecznie bezpośrednia...

 

Tak było w tym przypadku, dzięki za pomoc spike!

 

Poczytałem sobie o funkcji strtouppper i okazało się że narodowych znaków nie powiększa, w przeciwieństwie do funkcji mb_convert_case gdzie ę zmienia się na Ę ó na Ó i tak dalej.

 

Myślę, że zawarte tu uwagi pomogą innym a Tobie spike proponuję sprawdzić, czy ten skrypt z uteefem poszedł jeżeli były znaki ś lub ą w inpucie ;)

 

Pozdr,

Galeria przyrodnicza http://fotokrajobrazy.warmia.pl

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...