Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z kodowaniem utf 8
Forum PHP.pl > Forum > Przedszkole
wojciech533
Stworzyłem baze w mysql i strone internetowa . Napisałem system logowania oraz rejestracji . Problem polega na tym ze podczas dodawania nowego uzytkownika wszystkie polskie znaki DZIALAJA POZA JEDNYM "Ó" . Nie wiem co to za magia ... Cała baze razem z tabelami zmienilem na utf 8 za pomoca komendy : ALTER TABLE tabela_name CONVERT TO CHARACTER SET UTF8 COLLATE UTF8_UNICODE_CI . W plikach php mam : header('Content-type:text/html; charset=utf-8'); . Dodatkowo dopisałem : $polaczenie->query("SET NAMES 'utf8' COLLATE 'utf8_polish_ci'"); $polaczenie->query("SET CHARSET utf8") ; . Ale nie wiem czy to jest potrzebne skoro mam header . Pisze w NetBeans w ktorym to w pliku netbeans.conf dopisałem -J-Dfile.encoding=UTF-8 w odpowiednie miejsce . Wykorzystuje ochrone przed wstrzykiwaniem sql mysqli_real_escape_string ale nie wiem czy to moze byc problemem. Nie mam juz pomysłów . Dopiero sie ucze i jest to moja pierwsza baza oraz strona . Z góry dziękuje bardzo za pomoc ! smile.gif . Przypomnę że wszystko dziala poza literką "ó" a jak w terminalu wpisuje jakies słowo z ta literka do bazy wszystko dziala jak nalezy oraz wyniki na stronie rowniez pokazują "ó" .
Tomplus
Chaotycznie napisałeś, wrzuć po prostu kod tutaj.

Nie powiedziałeś jakie kodowanie mają pliki strony? bo być może mają kodowanie UTF-8 BOM albo ASCII zamiast UTF-8 without BOM.

Jak się uczysz tworzenia stron z wykorzystaniem baz danych, to zainteresuj się PDO, takie funkcje jak mysqli_real_escape_string będą zbyteczne.
wojciech533
  1. <?php
  2. header('Content-type:text/html; charset=utf-8');
  3.  
  4. if(!isset($_POST['login']) || (!isset($_POST['password'])))
  5. {
  6. header('Location: index.php');
  7. exit();
  8. }
  9.  
  10. require_once 'connect.php';
  11. //konstruktor razem z wylaczeniem bledu lub ostrzezenia ze strony PHP
  12. $polaczenie = @new mysqli($host , $db_user , $db_password , $db_name);
  13.  
  14.  
  15. if($polaczenie->connect_errno!=0)
  16. {
  17. echo "Error: ".$polaczenie->connect_errno ;
  18. }
  19. else
  20. {
  21. $polaczenie->query("SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'");
  22. $polaczenie->query("SET CHARSET utf8") ;
  23. //mysqli_set_charset($mysqli,'utf8') ;
  24.  
  25.  
  26. $login = $_POST['login'];
  27. $haslo = $_POST['password'];
  28. $haslo2 = $_POST['password2'];
  29.  
  30. $login = htmlentities($login, ENT_COMPAT , "UTF-8") ;
  31. $haslo = htmlentities($haslo, ENT_COMPAT , "UTF-8") ;
  32. $haslo2 = htmlentities($haslo2, ENT_COMPAT , "UTF-8") ;
  33.  
  34.  
  35. if($haslo == $haslo2)
  36. {
  37. unset($_SESSION['error_pass']) ;
  38.  
  39. if($submit = @$polaczenie->query(
  40. sprintf("SELECT * FROM user WHERE login='%s'" ,
  41. mysqli_real_escape_string($polaczenie,$login))))
  42. {
  43. $ile_login = $submit->num_rows ;
  44. }
  45. if($ile_login > 0)
  46. {
  47. $_SESSION['error_login'] = '<span style="color:red"> Ten login jest już zajęty!</style>';
  48. mysqli_free_result($submit);
  49. header('Location:index.php');
  50. }
  51. else
  52. {
  53.  
  54. if($submit2= @$polaczenie->query(sprintf("INSERT INTO user (login , pass) VALUES( '%s', '%s')" ,
  55. mysqli_real_escape_string($polaczenie,$login) ,
  56. mysqli_real_escape_string($polaczenie,$haslo))))
  57. {
  58.  
  59. $_SESSION['zalogowany'] = true ;
  60.  
  61. $wiersz = mysqli_fetch_assoc($submit2);
  62.  
  63. $_SESSION['login'] = $wiersz['login'] ;
  64. $_SESSION['id'] = $wiersz['id'];
  65. unset($_SESSION['blad']);
  66. unset($_SESSION['error_pass']);
  67. unset($_SESSION['error_login']);
  68.  
  69.  
  70. mysqli_free_result($submit2);
  71.  
  72.  
  73.  
  74. header('Location:fantasy.php');
  75. }


Sprawdzilem pliki i mam tylko jedną opcje do wyboru z utf8 , nie mam ani utf8 with bom ani utf8 without bom , same utf8 .
viking
A co zwracają wartości po htmlentities?
Bindowanie rób przez http://php.net/manual/en/mysqli.prepare.php
wojciech533
Poprawne nazwy , błąd jest gdzie indziej
viking
Nie chodzi mi o nazwy tylko jakie masz wartości na tym etapie. Czy echo $login; zwraca to co ma zwrócic?
Już pomijając bezsens tego kawałka kodu (wygląda jak mix funkcji sprzed 10 lat dopasowany do teraźniejszości) to powinieneś uzywać http://php.net/manual/en/function.password-hash.php
Pokaż też kod create tabeli
Tomplus
Korzystaj z edytorów takich jak Notepad++ lub Sublime. Tam jest zapis kodowania pliku bez BOM.

mysqli_real_escape_string() jest marnym zabezpieczeniem

a usuwanie zmiennych w unset możesz używać szeregowo unset($zmiennaA, $zmiennaB, $zmiennaC, ...)

header('Content-type:text/html; charset=utf-8'); jest zbędny, wcale nie daje ci szans że skrypt obsługuje UTF-8, bo dane które wysyłasz do skryptu muszą być w kodowaniu UTF-8. Dlatego są moje naciski o to kodowanie bez BOM, ponieważ z BOM w nagłówku są 3 niewidoczne znaki, które powodują (acz nie zawsze) że kodowanie strony się zmienia na inne niż jest w nagłówku.



com
ono sie nie zmienia tylko plik ma białe znaki które wysyła do przeglądarki przed przetworzeniem skryptu php i rzuca potem notice itp wink.gif
wojciech533
Problem rozwiązała biblioteka PDO , zacnie smile.gif dzieki za pomoc !
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.