Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] Krzaczki w MySQL
coder()
post
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 3.05.2007

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


Witam.
1.
Mam formularz do którego dodaję tekst. Jest on nastepnie obrabiany i każdy wyraz z tego ciągu dłuższy od 3 znaków jest wsadzany do bazy danych. Cały skrypt, mysql i html używają systemu UTF-8.
Niestety mimo tego do bazy danych wpadają krzaki. Oczywiście gdy wyciągne te rekordy z bazy danych to przeglądarka wyswietli mi je normalnie. Jednak jeśli do MySQL dodam jakiś rekord ręcznie to normalnie rekordy są przetrzymywane z żąśółćńę itp.
Jak zrobić żeby przez sam skrypt tak się dodawało automatycznie??

Tekst jest poddawany obróbce przez nastepujące funkcje w niezmienionej postaci:
  1. <?php
  2. $text = stripslashes(&_POST['text']);
  3. $text = preg_replace('/[.,?!`~;:_\"'()ab\t\nfre]/','',$text);
  4. $tablica = explode(' ', $text);
  5. $tablica = array_unique($tablica);
  6. $tablica = sort($tablica);
  7.  
  8. //to jest w pętli
  9. $tablica[$i] = mb_strtolower($tablica[$i], "UTF-8");
  10.  
  11. //Następnie każdy wiersz tablicy jest poddawany dodatkowej obróbce która wyciąga z
     niego pierwszą literę i zamienia na dużą.
  12. $litery = str_split($tablica[$i], 1);
  13. $pierwsza_litera = mb_strtoupper($litery[0], "UTF-8");
  14.  
  15. //TERAZ ZMIENNE $pierwsza_litera i $tablica[$i] są wysyłane kolejno do bazy danych
    .
  16. ?>


Która z tych funkcji coś zawala?? i na co wymienić zeby nie było krzaków w MySQL

2.
Drugi problem dotyczy tego że z do innego formularza jestem przekierowywany z jakiegoś tam linku. W linku tym jest zawarta zmienna (a więc tablica GET). Zmienna zawiera jedną literę alfabetu. Nie ma żadnego problemu jesli nie będzie to litera z ogonkiem. Jak zczytać z tej zmiennej GET tą litere żeby normalnie mi ją przekonwertowało do UTF-8 i nie powstały żadne krzaki??

Aktualnie używam funkcji html_entity_decode()" title="Zobacz w manualu PHP" target="_manual
Go to the top of the page
+Quote Post
wolguy
post
Post #2





Grupa: Zarejestrowani
Postów: 219
Pomógł: 10
Dołączył: 9.01.2005

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


Napisz trochę jaśniej. Krzaczki masz przy ręcznym dodawaniu rekordu do bazy przez np. phpMyAdmina czy przy dodawaniu przez skrypt?
Go to the top of the page
+Quote Post
coder()
post
Post #3





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 3.05.2007

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


Krzaczki występują prze dodawaniu poprzez skrypt którego wszystkie funkcje zamieściłem sad.gif
Przy dodawaniu RĘCZNYM przez phpMyadmina krzaczki NIE WYSTĘPUJĄ.
Go to the top of the page
+Quote Post
wolguy
post
Post #4





Grupa: Zarejestrowani
Postów: 219
Pomógł: 10
Dołączył: 9.01.2005

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


Jak dla mnie to musisz się jedynie upewnić, że strona, z której jest wysyłany formularz, też używa kodowania utf-8. Wtedy obrabianie znaków w php będzie niepotrzebne.
Go to the top of the page
+Quote Post
coder()
post
Post #5





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 3.05.2007

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


Napisałem wyraźnie że strona również ma kodowanie utf-8

A tekst musi być obrabiany ponieważ jest to długi ciąg znaków z który musi być rozdzielony na poszczególne słowa i dodane do bazy danych która tworzy jakby słownik.

Coś jest na 100% nie tak ze skryptem bo wszystkie litery z ogonkami w bazie danych mam zapisane za pomocą 2 jakiś dziwnych znaczków...

EDIT:
Zauważyłem teraz że jeśli dodam cały tekst bezpośrednio (beż żadnej obróbki do bazy danych) wprost z tablicy POST przez prosty skrypcik php to też występują krzaczki... Czy zmienną POST trzeba jakoś przekonwertować??

Ten post edytował coder() 9.01.2008, 19:37:04
Go to the top of the page
+Quote Post
Numb
post
Post #6





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 5.11.2007

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


A sprawdź jakie kodowanie jest ustawione w tabeli...
Go to the top of the page
+Quote Post
coder()
post
Post #7





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 3.05.2007

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


no całą bazę jak robiłem to zaznaczyłem pl-utf-8
jak sprawdzić w pojedynczej tabeli??:|
Go to the top of the page
+Quote Post
Cotter
post
Post #8





Grupa: Zarejestrowani
Postów: 57
Pomógł: 12
Dołączył: 6.01.2008
Skąd: Wrocław

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


Miałem kiedyś taki sam problem. Okazuje się, że meritum sprawy nie tkwi ani w kodowaniu bazy, ani tabeli, ani formularza (oczywiście pod warunkiem, że są dobrze ustawione). Istnieją jeszcze inne istotne kodowania, które mogą wpływać na znaki w połączeniu pomiędzy php i mysql. Jakie kodowania użyto można sprawdzić za pomocą:
  1. SHOW VARIABLES LIKE '%character%'

Z kolei ustawić je można zaraz po nawiązaniu połączenia i wybraniu bazy w następujący sposób:
  1. SET character_set_client='utf8'
  2. SET character_set_connection='utf8'
  3. SET character_set_results='utf8'
  4. SET character_set_server='utf8'


Ten post edytował Cotter 9.01.2008, 20:59:45
Go to the top of the page
+Quote Post
potreb
post
Post #9





Grupa: Zarejestrowani
Postów: 1 568
Pomógł: 192
Dołączył: 7.03.2005
Skąd: Warszawa

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


Rozumie, że pliki masz zapisane w utf-8. Jak tak przy połączeniu z bazą możesz ustawić sobie SET NAME utf-8


--------------------

Go to the top of the page
+Quote Post
coder()
post
Post #10





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 3.05.2007

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


za każdym razem mi wyskakuje błąd gdy chce cokolwiek zmienić w kodowaniu bazy itp.

Cytat
MySQL zwrócił komunikat:
#1064 - Something is wrong in your syntax obok 'character_set_client='utf8'' w linii 1
Go to the top of the page
+Quote Post
Cotter
post
Post #11





Grupa: Zarejestrowani
Postów: 57
Pomógł: 12
Dołączył: 6.01.2008
Skąd: Wrocław

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


Na początku zobacz jakie zmienne zwróci kwerenda:
  1. SHOW VARIABLES LIKE '%character%';

wszędzie powinno być utf8. Jeżeli gdzieś nie ma to ustaw:
  1. SET zmienna='utf8';

Starsze wersje mysql mogą nie obsługiwać podanych przeze mnie zmiennych.

Możesz również spróbować napisanej przez
potreb'a podpowiedzi. Często rozwiązuje to problem. Z tym, że powinno być:
  1. SET NAMES 'utf8';


Ten post edytował Cotter 9.01.2008, 21:00:01
Go to the top of the page
+Quote Post
coder()
post
Post #12





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 3.05.2007

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


właśnie w tym jest problem ze nawet te zmienne które mam pewność ze są (w tym przypadku sprawdziłem i mam character_set) nie da się zedytować...
Zawsze dostaje komunikat o błędzie 1064 ;/ przy SET NAMES jest to samo.
Go to the top of the page
+Quote Post
Cotter
post
Post #13





Grupa: Zarejestrowani
Postów: 57
Pomógł: 12
Dołączył: 6.01.2008
Skąd: Wrocław

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


A sprawdzałeś czy są inne niż utf8? Ostatecznością jest konwertowanie zmiennych na inne kodowanie (na przykład ISO) przed wstawieniem ich do bazy używając funkcji iconv.
Jednak najpierw proponuję ci kontakt z administratorem serwera w tej sprawie.

Ten post edytował Cotter 9.01.2008, 23:13:24
Go to the top of the page
+Quote Post
coder()
post
Post #14





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 3.05.2007

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


Witam.
Odświerzam temat ponieważ zainstalowałem sobie na własnym komputerze Apache 2.2 + Mysql 5 + php5
Teraz mam wieksze pole do popisu przy ustawianiu kodowania.
i tak:
tworze prosty skrypt w PHP zawierający zapytanie do bazy danych które mi doda polskie znaki do jakiejś tam tabeli.
Oto ustawienia dla poszczególnych elementów:
Baza Danych: utf8_polish_ci
Tabela: utf8_polish_ci
Wiersz: utf8_polish_ci
System porównań dla połączenia MySQL: utf8_general_ci
System kodowania znaków dla MySQL: UTF-8 Unicode (utf8)

I dla zmiennych:
  1. character_set_client utf8
  2. character_set_connection utf8
  3. character_set_database latin1
  4. character_set_filesystem BINARY
  5. character_set_results utf8
  6. character_set_server latin1
  7. character_set_system utf8
  8. character_sets_dir C:\WebServer\MySQL5\share\charsets\


W php i html mam ustawione również utf-8

Krzaki powstają mimo wszystko

Jak widać zmienne character_set_database oraz[/b] character_set_server [/b] mają kodowanie latin ale niestety mimo iż wykonuje zapytania
  1. SET ***="utf8";
i zapytanie wykona się poprawnie to i tak zmienne te nie zostają zmienione.
Czy to jest powodem powstawania krzaczków??
Dodam ze w phpmyadmin gdy dodaję rekordy ręcznie jest wszystko w porządku. Tylko w przypadku gdy wysyłam zapytanie z pliku php występuje ten problem.

Ten post edytował coder() 12.01.2008, 14:19:45
Go to the top of the page
+Quote Post
Cotter
post
Post #15





Grupa: Zarejestrowani
Postów: 57
Pomógł: 12
Dołączył: 6.01.2008
Skąd: Wrocław

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


A ustalasz te kodowania we wszystkich elementach za kazdym razem gdy laczysz sie z baza?
Go to the top of the page
+Quote Post
coder()
post
Post #16





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 3.05.2007

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


Nie. Łacze się z bazą i od razu wysyłam zapytanie. A to mam coś jeszcze ustawiać za każdym razem przy połaczeniu przez skrypt php??
Go to the top of the page
+Quote Post
Cotter
post
Post #17





Grupa: Zarejestrowani
Postów: 57
Pomógł: 12
Dołączył: 6.01.2008
Skąd: Wrocław

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


Ustawiaj wszystkie kodowania dotyczące systemu i połączenia (kodowania dotyczące tabel są ustawiane raz i nie trzeba tego robić ponownie) zaraz po nawiązaniu połączenia. Następnie dopiero przesyłaj zapytania właściwe.

Czyli tak:
Kod
//Pseudokod
mysql_connect(...);
mysql_select_db(...);
mysql_query("SET character_set_*='utf8'");

//teraz dopiero kwerenda
mysql_query("INSERT INTO tabela (kolumna) values('ąężźć')");

mysql_cose();


Trzeba je ustawiać za każdym razem, ponieważ to jakie wartości są przyjmowane zależy od domyślnych ustawień serwera i systemu. Za każdym razem gdy się łączysz ponownie serwer nie wie, że potrzebujesz inne kodowania i przyjmuje te domyślne.
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 Aktualny czas: 21.08.2025 - 20:56