Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: wyszukiwarka problem polskich znaków
Forum PHP.pl > Forum > PHP
informatycy
Witam
Problem jest następujący brak polskich znaków w wyniku wyszukiwania. kodowanie strony i skryptu: UTF-8
Dane wprowadzone do bazy danych są w utf-8, system porównań bazy danych ustawiony na UTF-8, połączenie z baza danych zostało ustawione aby dane pobierał w utf-8:

  1. mysql_query("SET NAMES 'utf8'");
  2. mysql_query('SET CHARACTER_SET utf8_unicode_ci');


W całym skrypcie dane z bazy wyświetlane są poprawnie z polskimi znakami. Jedynie podczas wpisania do formularza szukanego słowa które zawiera polskie znaki zostaje zwrócony komunikat że słowo nie zostało znalezione, jednak skrypt wyszukuje słowo bez polskich znaków w bazie. polskie znaki są ignorowane np. wpisując do formularza słowo "żółty" skrypt przeszukuję tylko "ty" bez początkowych 3 polskich znaków.

Ma ktoś jakiś pomysł jak rozwiązać ten problem?

Szczegóły poniżej:

Mam prosty formularz wyszukiwania pojedynczych słów w bazie:

  1. <form action="$kay_site/lookup" method="get" id="frmSearch" name="frmSearch">
  2. <fieldset>
  3. <ol>
  4. <li>
  5. <label for="word">Szukaj Słowa: </label>
  6. <input id="word" type="text" value="" onfocus="tipFade();" name="word"/>
  7. <input id="submit" type="submit" value="Szukaj"/>
  8. </li>
  9. </ol>
  10. </fieldset>
  11. </form>



wynik zwracany jest za pomocą następującego kodu:

  1. <div id="lookup_results">
  2. <?php echo get_lookup_results($word); ?>
  3. </div>


który odwołuje się do funkcji: get_lookup_results:

  1. function get_lookup_results($word) {
  2. $id_url = get_word_info($word);
  3. if ($id_url) {
  4. if ($id_url['url'] == 'none') {
  5. $html = '<p>Znalazłem! To słowo jest wolne i możesz je zarejestrować dla siebie. <a href="'.KAY_SITE.'/buy/'.$id_url['id'].'" class="buyitnow">Aktywuj to Słowo!</a></p>';
  6. $html .= '<p>&raquo; <span class="available"><a href="'.KAY_SITE.'/buy/'.$id_url['id'].'">'.$word.'</a></span></p>';
  7. } else {
  8. $html = '<p>Niestety, słowo którego szukasz zostało już aktywowane przez innego użytkownika.!</p>';
  9. /* $html .= '<p>Jesteś właścicielem tego słowa? ';*/
  10. /* $html .= 'Jeżeli tak możesz <a href="'.KAY_SITE.'/feature/'.$id_url['id'].'" class="buyitnow">wyróżnić to słowo</a> na naszej <b>stronie głównej</b>!'; */
  11.  
  12. $html .= '</p>';
  13. $html .= '<p><ul class="home-words"><li><a class="active-link" href="'.$id_url['url'].'"><span >'.$word.'</span></a></p></li></ul><br /><br />';
  14.  
  15.  
  16. }
  17. $html .= '<p>Możesz również rozważyć aktywację podobnych<span class="available"> dostępnych</span> słów, kliknij aby kontynować.</p>';
  18. $html .= get_alike($word);
  19.  
  20. return $html;
  21. } else {
  22. $html = '<p>Niestety, słowo którego poszukujesz nie znajduje się w naszej bazie! Aby dodać słowo napisz do naszego administratora lub sam dodaj słowo.</p>';
  23. $html .= '<p><h2>Kliknij aby dodać słowo <span >'.$word.'</span> do bazy danych</h2></p>';
  24. $html .= '<p>Możesz również zarejestrowac podobne słowo?</p>';
  25. $html .= get_alike($word);
  26. return $html;
  27. }
  28. }


funkcje powiązane:

  1. function get_word_info($word) {
  2. $sql = "SELECT `url`, `words`.`id` FROM `words`, `sold` WHERE `sold`.`sold_id` = `words`.`id` AND `words`.`word` = '$word'";
  3. $results = mysql_query($sql);
  4. if (mysql_num_rows($results)) {
  5. $row = mysql_fetch_array($results);
  6. return array('url' => $row['url'], 'id' => $row['id']);
  7. } else {
  8. $sql = "SELECT * FROM `words` WHERE `word` = '$word' ";
  9. $results = mysql_query($sql);
  10. if (mysql_num_rows($results)) {
  11. $row = mysql_fetch_array($results);
  12. return array('url' => $row['url'], 'id' => $row['id']);
  13. }
  14. }
  15.  
  16. return false;
  17. }
  18.  
  19. function get_alike($word) {
  20. $html = '<ul class="alike_words">';
  21. $sql = "SELECT * FROM `words` WHERE (SELECT `word` LIKE '%$word%') AND (`url` = 'none') AND (`word` != '$word') LIMIT 0, 20";
  22. $results = mysql_query($sql);
  23. if (mysql_num_rows($results)) {
  24. while ($row = mysql_fetch_array($results)) {
  25. $html .= '<li><a href="'.KAY_SITE.'/buy/'.$row['id'].'" title="Kliknij aby kupić: '.$row['word'].'">'.$row['word'].'</a></li>';
  26. }
  27. } else {
  28. $html .= '<li>Niestety, nie znaleziono podobnych słów !)</li>';
  29. }
  30. $html .= '</ul>';
  31. return $html;
  32. }


z góry dzięki za pomoc wszystkim dobrym ludziom smile.gif

czy nikt nie ma pomysłu co morze być przyczyną mojego problemu??

pozdrawiam,
Marcin
korro
spróbuj z:
Kod
SET character_set_connection = utf8;;
SET character_set_server = utf8;;
SET character_set_client = utf8;
SET character_set_results = utf8;
informatycy
Niestety ustawiłem te parametry które podałeś przy połączeniu z bazą jednak nadal efekt jest ten sam.

jakieś inne propozycję?

może zastosować AGAINST IN NATURAL LANGUAGE MODE, jednak nie bardzo wiem jak to wcisnąć w kod poniżej:

  1. $sql = "SELECT `url`, `words`.`id` FROM `words`, `sold` WHERE `sold`.`sold_id` = `words`.`id` AND `words`.`word` = '$word' ;


oraz tutaj:
  1. $sql = "SELECT * FROM `words` WHERE `word` = '$word'";


cze poniższe ustawienia bazy danych mogą mieć wpływ na ten problem?



czy jest możliwość zmiany tych ustawień nie mając dostępu do pliku my.cnf?
chemik1982
Sprawdź może najpierw czy słowo wpisane w formularzu jest prawidłowo dostarczane do funkcji szukającej, bo na moje nie.
W formularzu zmień metodę wysyłania na post, pamiętając aby po wykonaniu skryptu słowo brać z tablicy $_POST a nie $_GET.
informatycy
zmieniłem metodę wysyłania na _POST, jednak nadal występuje ten sam problem. Jeżeli chodzi o kodowanie bazy danych to na pewno jest dobre sprawdziłem to wpisując zapytania do bazy z poziomu phpMyAdmina, zapytania tam są wyświetlane poprawnie. Przy metodzie GET, po pokazaniu wyniku wyszukiwania w pasku adresu wyświetlany był adres z poprawnym słowem z polskimi znakami, na stronie jednak słowo nie pokazywało polskich znaków.

  1. <form action="$kay_site/lookup" method="post" id="frmSearch" name="frmSearch"">
  2. <fieldset>
  3. <ol>
  4. <li>
  5. <label for="word">Szukaj Słowa: </label>
  6. <input id="word" type="text" value="" onfocus="tipFade();" name="word"/>
  7. <input id="submit" type="submit" value="Szukaj"/>
  8. </li>
  9. </ol>
  10. </fieldset>
  11. </form>



zmieniłem również funkcję aby pobierała zmienną z tablicy _POST

  1.  
  2. <?php
  3.  
  4. if (!empty($_POST['word'])) {
  5. $word = word_filter($_POST['word']);
  6. }
  7.  
  8. $title = KAY_SITE_NAME;
  9. $title .= KAY_TITLE_SEPARATOR;
  10. $title .= 'Znajdź Słowo: '.$word;
  11. include_once('layout.php');
  12.  
  13. echo $kay_headsec;
  14. ?>
  15.  


szukamy dalej smile.gif

chemik1982
To pokaż jeszcze funkcję word_filter().
Mogę się domyślać, że używasz funkcji htmlspecialchars() lub htmlentities() i pewnie bez parametrów 2 i 3, a mianowicie, np. ENT_QUOTES i 'utf-8'.

informatycy
poniżej funkcja word_filter:


  1.  
  2. function word_filter($str) {
  3. $filtered = '';
  4. for ($i = 0; $i <= strlen($str) - 1; $i++) {
  5. $char = substr($str, $i, 1);
  6. if (ctype_alpha($char)) {
  7. $filtered .= $char;
  8. }
  9. }
  10. return $filtered;
  11. }
  12.  
chemik1982
funkcję substr() zamień na mb_substr().
informatycy
zmieniłem funkcje tak jak zasugerowałeś jednak teraz w wyniku wyszukiwania nie pojawia się nic, puste pole
chemik1982
Włącz raportowanie błędów, sprawdź czy masz w ogóle rozszerzenie mbstring. Doczytaj jak powinno się stosować tą funkcję mb_string().
mb_substr
informatycy
witam,

z mojego php.ini wynika że funkcja jest włączona:

mbstring

Multibyte Support enabled
Multibyte string engine libmbfl
Multibyte (japanese) regex support enabled
Multibyte regex (oniguruma) version 4.4.4
Multibyte regex (oniguruma) backtrack check On

mbstring extension makes use of "streamable kanji code filter and converter", which is distributed under the GNU Lesser General Public License version 2.1.

Directive Local Value Master Value
mbstring.detect_order no value no value
mbstring.encoding_translation Off Off
mbstring.func_overload 0 0
mbstring.http_input pass pass
mbstring.http_output pass pass
mbstring.internal_encoding no value no value
mbstring.language neutral neutral
mbstring.strict_detection Off Off
mbstring.substitute_character no value no value


Włączyłem raportowanie błędów i wyświetla następujący błąd:

Notice: Undefined variable: word in /home/wojdylam/public_html/lookup.php on line 22


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.