Problem z polskim znakami

0

Cześć,

Staram się za pomocą php wstawić rekordy do bazy MySQL. Problem polega na tym, że polskie znaki są błędnie rozpoznawane.
Pracuje na localhost z wykorzystaniem XAMPP (MySQL w wersji 10.1.19-MariaDB, PHP w wersji 5.6.28).
kodowanie bazy to utf8_general_ci próbowałem też utf8_polish_ci

Poniżej zamieszczam część kodu PHP

$sql= "CREATE TABLE IF NOT EXISTS `"._DB_PREFIX_."srodki_pomocnicze`(
				id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
				id_prod_handl INT(5) NOT NULL,
				kod_srodka_nfz VARCHAR(10) NOT NULL,
				nazwa_handlowa VARCHAR(255) NOT NULL,
				model VARCHAR(255) NOT NULL,
				producent VARCHAR(255),
				reg_date TIMESTAMP ) CHARACTER SET utf8 COLLATE utf8_polish_ci";
		
    if(!$result=Db::getInstance()->Execute($sql))

 $sql = "INSERT into ps_srodki_pomocnicze (id_prod_handl,kod_srodka_nfz,nazwa_handlowa,model,producent) 
 values ('".$getData[0]."','".'ąęśćźłóÓŁĘŚĆĄŃ'."','".$getData[2]."','".$getData[3]."','".$getData[4]."')";
 $result = mysqli_query(mysqli_connect('localhost', 'root', '', 'prestashop'), $sql);

Wynik wygląda następująco ąęśćź (Oczywiście mowa tu o kolumnę kod_srodka_nfz)

Czy ktoś z was ma jakiś pomysł co jest nie tak?

Z góry bardzo dziękuję i pozdrawiam

1

Widzę 2 potencjalne miejsca przekłamania znaków.

  1. Kod php
  2. Sterownik bazy danych użyty w php.

Punkt 1 zdiagnozujesz próbując zapisać php-em tekst w pliku na dysku. Zobacz czy prawidłowo zapisze polskie znaki.

Z punktem 2 gorzej. Może wystarczy przejrzeć możliwe ustawienia w connection string. Można próbować odczytać i wyświetlić parametry połączenia z poziomu php. Można zapisać do bazy prawidłowe wartości innym kanałem, a potem próbować je odczytać w php. Można próbować robić select 'ręka' i obserwować efekty. Spróbuj popracować na razie na 1 literce (tak jak ta ręka). Wtedy można próbować zgadnąć, co takiego się dzieje. Można też próbować wysłać z poziomu php konkretny kod ascii i patrzeć, czy łapie.

0

Dzięki wielkie!

Pomógł punkt nr 2.

Jeżeli ktos będzie potrzebował to przedstawiam rozwiązanie które korzysta z wbudowanej metody PRESTASHOP

$id_prod_handl = $getData[0];
$kod_srodka_nfz = $getData[1];
$nazwa_handlowa = $getData[2];
$model = $getData[3];
$producent = $getData[4];
	$result = Db::getInstance()->insert('srodki_pomocnicze', array(
	'id_prod_handl' => (int)$id_prod_handl,
	'kod_srodka_nfz' => pSQL($kod_srodka_nfz),
	'nazwa_handlowa' => pSQL($nazwa_handlowa),
	'model' => pSQL($model),
	'producent' => pSQL($producent)

Jeszcze raz dzięki.
Wniosek taki, że jak człowiek zbyt długo siedzi nad jednym problemem to przestaje widzieć najprostsze rozwiązania :-)

0

A to ciekawe. Nie umiem znaleźć dokumentacji tej funkcji, tylko tyle, że ona zabezpiecza przed sql injection (Best Practices of the Db Class). W sumie dobrze, bo przedtem ten kod był najprawdopodobniej niepoprawny (niebezpieczny). Może jeszcze coś zmieniłeś i teraz działałoby nawet bez tego pSQL.

Na przykład jest metoda mysqli_set_charset. Ogólnie wystarczy wpisać w google mysqli_query encoding i można podpatrzeć rozwiązania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1