Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Krzaczki w MySQL
Forum PHP.pl > Forum > PHP
coder()
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
wolguy
Napisz trochę jaśniej. Krzaczki masz przy ręcznym dodawaniu rekordu do bazy przez np. phpMyAdmina czy przy dodawaniu przez skrypt?
coder()
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Ą.
wolguy
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.
coder()
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ć??
Numb
A sprawdź jakie kodowanie jest ustawione w tabeli...
coder()
no całą bazę jak robiłem to zaznaczyłem pl-utf-8
jak sprawdzić w pojedynczej tabeli??:|
Cotter
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'
potreb
Rozumie, że pliki masz zapisane w utf-8. Jak tak przy połączeniu z bazą możesz ustawić sobie SET NAME utf-8
coder()
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
Cotter
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';
coder()
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.
Cotter
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.
coder()
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.
Cotter
A ustalasz te kodowania we wszystkich elementach za kazdym razem gdy laczysz sie z baza?
coder()
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??
Cotter
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.
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.