Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> wyszukiwarka problem polskich znaków
informatycy
post 22.11.2009, 18:23:15
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 22.02.2006
Skąd: Mysłowice

Ostrzeżenie: (0%)
-----


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


--------------------
Praca IT
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
korro
post 23.11.2009, 18:53:08
Post #2





Grupa: Zarejestrowani
Postów: 259
Pomógł: 42
Dołączył: 8.04.2005
Skąd: Mława

Ostrzeżenie: (0%)
-----


spróbuj z:
Kod
SET character_set_connection = utf8;;
SET character_set_server = utf8;;
SET character_set_client = utf8;
SET character_set_results = utf8;


--------------------
Go to the top of the page
+Quote Post
informatycy
post 26.11.2009, 12:35:55
Post #3





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 22.02.2006
Skąd: Mysłowice

Ostrzeżenie: (0%)
-----


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?

Ten post edytował informatycy 25.11.2009, 14:55:57


--------------------
Praca IT
Go to the top of the page
+Quote Post
chemik1982
post 26.11.2009, 13:44:45
Post #4





Grupa: Zarejestrowani
Postów: 91
Pomógł: 13
Dołączył: 20.03.2007
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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.


--------------------
fitmate.pl - aplikacje internetowe
Go to the top of the page
+Quote Post
informatycy
post 26.11.2009, 14:36:35
Post #5





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 22.02.2006
Skąd: Mysłowice

Ostrzeżenie: (0%)
-----


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



--------------------
Praca IT
Go to the top of the page
+Quote Post
chemik1982
post 26.11.2009, 14:46:48
Post #6





Grupa: Zarejestrowani
Postów: 91
Pomógł: 13
Dołączył: 20.03.2007
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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'.



--------------------
fitmate.pl - aplikacje internetowe
Go to the top of the page
+Quote Post
informatycy
post 26.11.2009, 15:13:43
Post #7





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 22.02.2006
Skąd: Mysłowice

Ostrzeżenie: (0%)
-----


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.  


--------------------
Praca IT
Go to the top of the page
+Quote Post
chemik1982
post 26.11.2009, 15:16:42
Post #8





Grupa: Zarejestrowani
Postów: 91
Pomógł: 13
Dołączył: 20.03.2007
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


funkcję substr() zamień na mb_substr().


--------------------
fitmate.pl - aplikacje internetowe
Go to the top of the page
+Quote Post
informatycy
post 26.11.2009, 15:29:23
Post #9





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 22.02.2006
Skąd: Mysłowice

Ostrzeżenie: (0%)
-----


zmieniłem funkcje tak jak zasugerowałeś jednak teraz w wyniku wyszukiwania nie pojawia się nic, puste pole


--------------------
Praca IT
Go to the top of the page
+Quote Post
chemik1982
post 26.11.2009, 21:05:12
Post #10





Grupa: Zarejestrowani
Postów: 91
Pomógł: 13
Dołączył: 20.03.2007
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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


--------------------
fitmate.pl - aplikacje internetowe
Go to the top of the page
+Quote Post
informatycy
post 27.11.2009, 09:46:02
Post #11





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 22.02.2006
Skąd: Mysłowice

Ostrzeżenie: (0%)
-----


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




--------------------
Praca IT
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.06.2025 - 17:11