Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Polskie znaki mysql vs php
hiper0007
post 25.12.2016, 15:09:27
Post #1





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 6.06.2016

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


Witam!

Sprawa jest pewnie błacha ale juz brak mi pomysłow

dokument index.php (koowanie UTF-8-bez BOM)

phpmyadmin

Sortowanie połączenie z serwerem: UFT8mb4-polish_ci

baza daynych: uft8_polish_ci

tabela: uft8_polish_ci

struktura tabeli: kazde pole edytowane na: uft8_polish_ci

pole tytul:

phpmyadmin:brak polskich znaków (dodane przez formularz php)

strona: polskie znaki występują

pole tresc:

phpmyadmin: polskie znaki wystepują (oprócz litery ó)

strona: brak polskich znaków znaki ?

Po dołączeniu do skryptu php linijki

$polaczenie->set_charset("utf8");

pole tresc;


powoduje iż w bazie mam polskie znaki (oprócz ó) , a w tresci na stronie mam wszystkie polskie znakiw tym ó.

pole tytul;

Nie mam polskich znaków ani tu ani tu a w bazie jest w ten sam sposob ustawione utf8_polish_ci
Go to the top of the page
+Quote Post
Niree
post 25.12.2016, 15:49:22
Post #2





Grupa: Zarejestrowani
Postów: 220
Pomógł: 18
Dołączył: 5.02.2016
Skąd: Polska

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


W mysql znaki nie mogą być zapisane jako polskie (ą, ę itp). Dodaj sobie prosty formularz na testowej stronie i daj polskie znaki w zapytaniu insert. Automatycznie się sformatują do znaków specjalnych.
Na stronie ustaw meta charset=utf-8.
Go to the top of the page
+Quote Post
lukaskolista
post 26.12.2016, 12:26:46
Post #3





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Cytat
W mysql znaki nie mogą być zapisane jako polskie (ą, ę itp).

A to ciekawe, ciekawe... Radzę Ci zweryfikować swoją wiedzę na ten temat.

Spróbuj bezpośrednio w phpmyadmin dodać polkie znaki razem z "ó". Jeżeli będzie ok, to problem leży po stronie Twojego skryptu. Jeżeli nie będzie ok, to problem leży w konfiguracji kodowania po stronie bazy danych.

Ten post edytował lukaskolista 26.12.2016, 12:28:29
Go to the top of the page
+Quote Post
Tomplus
post 26.12.2016, 13:36:08
Post #4





Grupa: Zarejestrowani
Postów: 1 872
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


Ja osobiście polecam metodę na przepisanie treści.
1. Pobierz dane, na połączeniu w "starym" kodowaniu.
2. Potem zapisz dane, na połączeniu w "nowym" kodowaniu.

Z konwersją danych zawsze były problemy. A takie dwu połączenia elegancko konwertuje polskie znaki z kodowań starych na kodowanie nowe. Nie gubią się żadne znaki jak przy konwersji iconv() czy inne funkcje, które są w sumie dość niepewne.
Go to the top of the page
+Quote Post
hiper0007
post 28.12.2016, 12:30:46
Post #5





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 6.06.2016

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


Cytat(lukaskolista @ 26.12.2016, 12:26:46 ) *
A to ciekawe, ciekawe... Radzę Ci zweryfikować swoją wiedzę na ten temat.

Spróbuj bezpośrednio w phpmyadmin dodać polkie znaki razem z "ó". Jeżeli będzie ok, to problem leży po stronie Twojego skryptu. Jeżeli nie będzie ok, to problem leży w konfiguracji kodowania po stronie bazy danych.


Witam jak wpisze np. Bezpośrednio w phpmyadmin "góra" to jest ok ale wyślę przez skrypt to pojawia sie krzaczki w najlepszym wypadku wszystkie prawidłowo a "ó" &cout: i hmm

Cytat(Tomplus @ 26.12.2016, 13:36:08 ) *
Ja osobiście polecam metodę na przepisanie treści.
1. Pobierz dane, na połączeniu w "starym" kodowaniu.
2. Potem zapisz dane, na połączeniu w "nowym" kodowaniu.

Z konwersją danych zawsze były problemy. A takie dwu połączenia elegancko konwertuje polskie znaki z kodowań starych na kodowanie nowe. Nie gubią się żadne znaki jak przy konwersji iconv() czy inne funkcje, które są w sumie dość niepewne.


Witam mógłbyś trochę bardziej wyjaśnić co to znaczy nowe i stare kodowanie;)
Go to the top of the page
+Quote Post
Tomplus
post 28.12.2016, 17:55:58
Post #6





Grupa: Zarejestrowani
Postów: 1 872
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


Może pośpieszyłem się z radą. Ale nie zapytałem się czy dane które wprowadzałeś do bazy były na kodowaniu UTF-8 czy może innym?

Bo ja kiedyś też zrobiłem tak że poprzestawiałem gdzie się da kodowanie na UTF-8, ale i tak miałem krzaki. Dopiero otwarcie połączenia na poprzednim kodowaniu i przekazanie wartości 1:1 do drugiego połączenia, zapisało kontent w bazie z prawidłowym kodowaniem,
Go to the top of the page
+Quote Post
Niree
post 28.12.2016, 21:52:50
Post #7





Grupa: Zarejestrowani
Postów: 220
Pomógł: 18
Dołączył: 5.02.2016
Skąd: Polska

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


Cytat(lukaskolista @ 26.12.2016, 12:26:46 ) *
A to ciekawe, ciekawe... Radzę Ci zweryfikować swoją wiedzę na ten temat.

Spróbuj bezpośrednio w phpmyadmin dodać polkie znaki razem z "ó". Jeżeli będzie ok, to problem leży po stronie Twojego skryptu. Jeżeli nie będzie ok, to problem leży w konfiguracji kodowania po stronie bazy danych.


Gadasz jak potłuczony tongue.gif
Zasugerowałem z własnego doświadczenia. Po bezpośrednim wprowadzeniu do kolumny np. "Płońsk", wywalało mi "P?o?sk" na stronie, dziwiłem się o co chodzi... a chodziło właśnie o polskie znaki, które nie zostały sformatowane bo to była bezpośrednia edycja.

Dopiero zrobiłem sobie na testowej stronie formularz i UPDATE tego wpisu. Przy UPDATE dałem SET ... "Płońsk", a w MySQL zrobiło się "PÅ‚oÅ„sk", na stronie przy charset=utf-8, wyświetlało bardzo dobrze ;-)
Go to the top of the page
+Quote Post
hiper0007
post 28.12.2016, 23:12:05
Post #8





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 6.06.2016

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


Cytat(Tomplus @ 28.12.2016, 17:55:58 ) *
Może pośpieszyłem się z radą. Ale nie zapytałem się czy dane które wprowadzałeś do bazy były na kodowaniu UTF-8 czy może innym?

Bo ja kiedyś też zrobiłem tak że poprzestawiałem gdzie się da kodowanie na UTF-8, ale i tak miałem krzaki. Dopiero otwarcie połączenia na poprzednim kodowaniu i przekazanie wartości 1:1 do drugiego połączenia, zapisało kontent w bazie z prawidłowym kodowaniem,


To jest skrypt dodawania nowego tematu

  1.  
  2. require_once "connect.php";
  3. mysqli_report(MYSQLI_REPORT_STRICT);
  4.  
  5. try
  6. {
  7. $polaczenie = new mysqli($host, $db_login, $db_pass, $db_name);
  8. if ($polaczenie->connect_errno!=0)
  9. {
  10. throw new Exception(mysqli_connect_errno());
  11. }
  12. else
  13. {
  14.  
  15.  
  16. $tytul=$_POST['tytul'];
  17. $tresc=$_POST['tresc'];
  18. $datat=date('d-m-Y H:i');
  19. $datate="";
  20. $kod=md5(mt_rand());
  21. $editt=md5(mt_rand());
  22. $closet=md5(mt_rand());
  23. $podzial="sh0";
  24. $views=0;
  25. $punkty=2;
  26. $status='open';
  27. $login=$_SESSION['login'];
  28. $complete='<i class="icon-lock-open"></i>';
  29.  
  30.  
  31. $tytul=htmlentities(trim($tytul),ENT_QUOTES,"UTF-8");
  32. $tresc=htmlentities(trim($tresc),ENT_QUOTES,"UTF-8");
  33.  
  34. //Udana walidacja? Załóżmy, że tak!
  35.  
  36. $wszystko_OK=true;
  37.  
  38.  
  39. //Sprawdzenie poprawności pola Temat
  40.  
  41.  
  42. if((strlen($_POST['tytul'])<10)||(strlen($_POST['tytul'])>100))
  43. {
  44. $wszystko_OK=false;
  45. $_SESSION['blad1']="Temat min. 10 znaków max. 100 znaków!";
  46.  
  47.  
  48. }
  49.  
  50.  
  51. if(empty($_POST['tytul']))
  52. {
  53. $wszystko_OK=false;
  54. $_SESSION['blad1']="Proszę wypełnić pole Temat!";
  55.  
  56. }
  57.  
  58. if((strlen($_POST['tresc'])<10)||(strlen($_POST['tresc'])>1000))
  59. {
  60. $wszystko_OK=false;
  61. $_SESSION['blad2']="Wiadomość min. 10 znaków max. 1000 znaków!";
  62.  
  63.  
  64. }
  65.  
  66.  
  67. if(empty($_POST['tresc']))
  68. {
  69. $wszystko_OK=false;
  70. $_SESSION['blad2']="Proszę wypełnić pole Wiadomość!";
  71.  
  72. }
  73.  
  74. //Zapamiętywanie danych
  75.  
  76.  
  77. $_SESSION['zp_tytul']=$tytul;
  78. $_SESSION['zp_tresc']=$tresc;
  79.  
  80.  
  81. if ($wszystko_OK==true)
  82. {
  83.  
  84. if($polaczenie->query(sprintf("INSERT INTO topic VALUES(NULL,'%s' , '%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",mysqli_real_escape_string($polaczenie,$tytul),mysqli_real_escape_string($polaczenie,$tresc),mysqli_real_escape_string($polaczenie,$datat),mysqli_real_escape_string($polaczenie,$datate),mysqli_real_escape_string($polaczenie,$podzial),mysqli_real_escape_string($polaczenie,$kod),mysqli_real_escape_string($polaczenie,$editt),mysqli_real_escape_string($polaczenie,$closet),mysqli_real_escape_string($polaczenie,$views),mysqli_real_escape_string($polaczenie,$punkty),mysqli_real_escape_string($polaczenie,$complete),mysqli_real_escape_string($polaczenie,$status),mysqli_real_escape_string($polaczenie,$_SESSION['idu']))))
  85. {
  86.  
  87.  
  88.  
  89. // Usuwanie zmiennych sesyjnych zapamietujacych dane w formularzu
  90.  
  91. if(isset($_SESSION['zp_tytul'])) unset($_SESSION['zp_tytul']);
  92. if(isset($_SESSION['zp_tresc'])) unset($_SESSION['zp_tresc']);
  93.  
  94. // usuwanie zmienny informujacych o bledzie
  95. if(isset($_SESSION['blad1'])) unset($_SESSION['blad1']);
  96. if(isset($_SESSION['blad2'])) unset($_SESSION['blad2']);
  97.  
  98.  
  99. $_SESSION['finish1']="Temat został dodany! Dziękujemy!";
  100.  
  101.  
  102.  
  103. }else{
  104.  
  105. throw new Exception($polaczenie->error);
  106. }
  107.  
  108.  
  109. }
  110.  
  111. $polaczenie->close();
  112. }
  113.  
  114. }
  115. catch(Exception $e)
  116. {
  117. //echo '<br />Informacja developerska: '.$e;
  118. $_SESSION['serwer']="Błąd serwera! Przepraszamy za utrudnienia i prosimy o dodanie tematu w innym terminie.";
  119. header('Location:serwer.php');
  120. }
  121.  


gdzie umieścić informacje o kodowaniu utf-8

Ten post edytował hiper0007 28.12.2016, 23:36:07
Go to the top of the page
+Quote Post
Tomplus
post 28.12.2016, 23:30:58
Post #9





Grupa: Zarejestrowani
Postów: 1 872
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


po 14 linii coś takiego:
  1. $polaczenie->set_charset("utf8")
Go to the top of the page
+Quote Post
hiper0007
post 28.12.2016, 23:49:14
Post #10





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 6.06.2016

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


Cytat(Tomplus @ 28.12.2016, 23:30:58 ) *
po 14 linii coś takiego:
  1. $polaczenie->set_charset("utf8")


Wszystko jest elegancko oprócz litery "ó"
Po dodaniu do bazy tematu o tresci "ańaa aaśałaa aaęaaąaa aaćaaaaóaaaażaaaaaź"

Dostaje rezultat w phpmyadmin "ańaa aaśałaa aaęaaąaa aaćaaaa&oacute;aaaażaaaaaź"

Wyszystko ładnie sie konwertuje oprócz litery "ó";)



Ten post edytował hiper0007 28.12.2016, 23:51:09
Go to the top of the page
+Quote Post
viking
post 29.12.2016, 01:41:37
Post #11





Grupa: Zarejestrowani
Postów: 6 376
Pomógł: 1116
Dołączył: 30.08.2006

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


Mieszasz obiekty ze stylem strukturalnym. Nie masz tam gdzieś przypadkiem tinymce albo inny edytor?

  1. mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
  2. try {
  3. $polaczenie = new mysqli($host, $db_login, $db_pass, $db_name);
  4. $polaczenie->set_charset("utf8");
  5. $stmt = $polaczenie->prepare('INSERT INTO topic VALUES(?, ?...)');
  6. $stmt->bind_param('ss...', $tytul, $tresc, ...);
  7. $stmt->execute();
  8.  
  9. } catch (mysqli_sql_exception $e) {
  10. echo $e->getMessage();
  11. }


Ten post edytował viking 29.12.2016, 02:15:56


--------------------
Go to the top of the page
+Quote Post
lukaskolista
post 29.12.2016, 14:52:43
Post #12





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Cytat
Gadasz jak potłuczony tongue.gif
Zasugerowałem z własnego doświadczenia. Po bezpośrednim wprowadzeniu do kolumny np. "Płońsk", wywalało mi "P?o?sk" na stronie, dziwiłem się o co chodzi... a chodziło właśnie o polskie znaki, które nie zostały sformatowane bo to była bezpośrednia edycja.

Kolego cienki jesteś smile.gif a do tego wypisujesz bzdury, w które jeszcze ktoś uwierzy. Poczytaj o kodowaniu w MySQL, np. utf-8.
Jeśli piszesz z własnego doświadczenia, to widocznie masz za małe.

Co do tematu: wprowadzasz treść przez jakiś edytor, czy zwykłe pole tekstowe?
Cytat
...najlepszym wypadku wszystkie prawidłowo a "ó" &cout: i hmm

Wygląda to jak jakaś dziwna (nieistniejąca) encja html. Jest to o tyle istotne, że poprawna encja dla "ó" to & oacute; (celowo ze spacją, bo edytor forum zamienia na ó). Jeżeli zrobiłeś literówkę i jednak dostajesz & oacute;, to użyj zamiast encode to decode dla encji, do czego odniosłem się poniżej.

Swoją drogą po co zamieniasz znaki specjalne HTML na encje:
  1. $tresc=htmlentities(trim($tresc),ENT_QUOTES,"UTF-8");
?

Ten post edytował lukaskolista 29.12.2016, 15:23:38
Go to the top of the page
+Quote Post
hiper0007
post 1.01.2017, 20:45:59
Post #13





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 6.06.2016

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


Cytat(lukaskolista @ 29.12.2016, 14:52:43 ) *
Kolego cienki jesteś smile.gif a do tego wypisujesz bzdury, w które jeszcze ktoś uwierzy. Poczytaj o kodowaniu w MySQL, np. utf-8.
Jeśli piszesz z własnego doświadczenia, to widocznie masz za małe.

Co do tematu: wprowadzasz treść przez jakiś edytor, czy zwykłe pole tekstowe?

Wygląda to jak jakaś dziwna (nieistniejąca) encja html. Jest to o tyle istotne, że poprawna encja dla "ó" to & oacute; (celowo ze spacją, bo edytor forum zamienia na ó). Jeżeli zrobiłeś literówkę i jednak dostajesz & oacute;, to użyj zamiast encode to decode dla encji, do czego odniosłem się poniżej.

Swoją drogą po co zamieniasz znaki specjalne HTML na encje:
  1. $tresc=htmlentities(trim($tresc),ENT_QUOTES,"UTF-8");
?


Zabezpieczam formularz przed niechcianymi znakami niebezpiecznymi dla skryptu...

" to użyj zamiast encode to decode dla encji,"

mozesz mi to wyjaśnić troche prościej... wink.gif Przy okazji życze wszystkim forowiczą szczęśliwego nowego roku;)

&oacute;

Ten post edytował hiper0007 1.01.2017, 20:49:06
Go to the top of the page
+Quote Post
mariio81
post 2.01.2017, 00:13:33
Post #14





Grupa: Zarejestrowani
Postów: 46
Pomógł: 0
Dołączył: 10.03.2011

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


Ja używam w bazie kodowania "utf8_general_ci" a w php utf8 bez bom i nie mam żadnych problemów z polskimi znakami.
Go to the top of the page
+Quote Post
lukaskolista
post 2.01.2017, 08:28:50
Post #15





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Cytat
Zabezpieczam formularz przed niechcianymi znakami niebezpiecznymi dla skryptu...

" to użyj zamiast encode to decode dla encji,"

mozesz mi to wyjaśnić troche prościej... wink.gif Przy okazji życze wszystkim forowiczą szczęśliwego nowego roku;)

Nic nie zabezpieczasz, a jak już to skrypt wyświetlający dane z formularza, ale takie zabezpieczenie powinno być właśnie w tym skrypcie. Spróbuj teraz wyszukać w przesłanych formularzach tych ze znakiem np. > w traści - będziesz musiał szykać encji html i szukać po encji, jest to bez sensu.
Encje enkoduje się przed wyświetleniem kodu html a nie przed zapisem do bazy.

Skoro już wiemy, że z formularza przychodzi encja html to nie wiem w czym problem - kodowanie z bazą jest ok, po prostu do skryptu w treści z formularza kontaktowego trafia już ta encja (którą nazwałeś krzakami) lub jest tworzona gdzieś w skrypcie przed zapisem.

Ten post edytował lukaskolista 2.01.2017, 08:33:27
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: 26.04.2025 - 00:02