Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Import danych do MySQL z Excela przez PMA i problem z kodowaniem
kecajs
post 27.10.2019, 19:02:39
Post #1





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 23.04.2010

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


Dzień dobry,
od dwóch dni przekopuję się przez książki, fora i rózne dokumentacje odnośnie sytuacji, w której się znalazłem, jednkaże - bez sukcesu.
Tak wygląda sytuacja.
Strona jest kodowana w utf8, w phpMyAdmin kodowanie znaków serwera ustawione jest na UTF-8 Unicode (utf8) i jest jeszcze w ustawieniach ogólnych parametr "Sortowanie połączenia z serwerem", ustawione na utf8_general_ci. Z kolei metoda porównywania napisów w samej bazie jest ustawiona na utf8_general_ci, choć doczytałem, że nie jest to parametr kluczowy, bo nei określa strony kodowej.
Dane utworzone i zapisane zostały w MS Excel. Na potrzeby bazy zapisałem plik jako CSV (rozdzielany przecinkami), następnie w Notepad++ przekonwertowałem zawartość na format UTF-8 i zapisałem. Tak przygotowany wsad zaimportowałem do MySQL, wykorzystując PMA. Przy imporcie kodowanie znaków pliku ustawione były jako utf-8, zaś format - CSV. Po imporcie polskie znaki w bazie są prawidłowo interpretowane.
Problem pojawia się, kiedy dane z bazy zaciągane są na stronę www. Na chwilę obecną wszystko robione jest lokalnie, z wykorzystaniem ostatniej wersji aplikacji WebServ (wersje: Apache 2.2.22; PHP 5.3.20; MySQL 5.5.21; Perl 5.14.2; MySQL Control 0.9.4; phpMyAdmin 3.5.5).
Dodatkowo, śladem porad z forum dokonałem konwersji strony kodowej zarówno bazy, jak i tabel komendami:
  1. ALTER DATABASE 'nazwa' DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

  1. ALTER TABLE 'tabela' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Bez zmian. Do łączenia się z bazą korzystam ze skryptu, wykorzystującego klasę dbconn o treści:
  1. <?php
  2.  
  3. abstract class Singleton {
  4.  
  5. protected static $_instance;
  6.  
  7. protected function __construct() {
  8.  
  9. }
  10.  
  11. public static function instance() {
  12.  
  13. }
  14.  
  15. }
  16.  
  17. class dbconn extends Singleton {
  18.  
  19. private $_conn;
  20. private $server = 'localhost';
  21. private $login = 'user';
  22. private $password = 'pass';
  23. private $database = 'database';
  24.  
  25. protected function __construct() {
  26. $this->_conn = mysql_connect($this->server, $this->login, $this->password) or die(mysql_error());
  27. mysql_select_db($this->database, $this->_conn) or die(mysql_error());
  28. }
  29.  
  30. public static function instance() {
  31. if (is_null(self::$_instance)) {
  32. self::$_instance = new dbconn();
  33. }
  34. return self::$_instance;
  35. }
  36.  
  37. public function query($query) {
  38. return mysql_query($query);
  39. }
  40.  
  41. public function insert($query) {
  42. if (mysql_query($query)) {
  43. } else {
  44. return 0;
  45. }
  46. }
  47.  
  48. public function select($query) {
  49. return mysql_num_rows(mysql_query($query));
  50. }
  51.  
  52. public function escape($string) {
  53. return htmlspecialchars(strip_tags($string));
  54. }
  55.  
  56. }
  57. ?>

Czytałem, że mozna zmienić kodowanie podczas łączenia się z bazą, ale nie mam pojęcia jak i w którym miejscu.
Będę wdzięczny za konstruktywne wskazówki, bez odsyłania do innych postów, for, czy porad "w ciemno" - wiele z nich już przerabiałem.
Pozdrawiam,
Jacek
Go to the top of the page
+Quote Post
viking
post 27.10.2019, 19:20:28
Post #2





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


Korzystasz z przestarzałych wersji oprogramowania w tym rozszerzenia mysql którego już nie ma w php. Poczytaj
https://prophp.pl/article/3/kodowanie_znakow_na_stronach_www


--------------------
Go to the top of the page
+Quote Post
kecajs
post 27.10.2019, 19:54:52
Post #3





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 23.04.2010

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


W takim razie muszę zmieniś serwer, nieprawdaż? Mam zainstalowany drugi serwer - XAMPP, ale tez z kolei ma problem z funkcją mysql_connect (), gdyż PHP jest w wersji 7.3, a ta nie obsługuje już funkcji mysql_connect (). Jak to mogę przerobić? KOd dostępu już przesłałem, teraz zaś wrzucę fragment kodu inicjujący połączenie i wybierający z bazy dane.
  1. <?php
  2. include_once ("db_con.php");
  3.  
  4. $connection = dbconn::instance();
  5. $wynik = $connection->query("SELECT lp, stop, nazw, imie, krypt, d_ur, d_zg, wiek FROM main");
  6. while ($r = mysql_fetch_assoc($wynik)) {
  7. echo '<tr>';
  8. echo '<td width="15" class="table_small">' . $r['lp'] . '</td>';
  9. echo '<td width="100" class="table_small">' . $r['stop'] . '</td>';
  10. echo '<td width="80" class="table_small">' . $r['nazw'] . '</td>';
  11. echo '<td width="100" class="table_small">' . $r['imie'] . '</td>';
  12. echo '<td width="100" class="table_small">' . $r['krypt'] . '</td>';
  13. echo '<td width="100" class="table_small">' . $r['d_ur'] . '</td>';
  14. echo '<td width="100" class="table_small">' . $r['d_zg'] . '</td>';
  15. echo '<td width="20" class="table_small">' . $r['wiek'] . '</td>';
  16. echo "</tr>";
  17. }
  18. ?>

Będę wdzięczny za podsunięcie rozwiązania, które zastąpi mysql i pozwoli się logować do bazy w nowszysch wersjach PHP. Spotkałem się z mysqli czy też PDO - które rozwiązanie będzie lepsze w moim przypadku?

Ten post edytował kecajs 27.10.2019, 22:22:54
Go to the top of the page
+Quote Post
viking
post 28.10.2019, 07:19:15
Post #4





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


Pod względem szybkości wymiany łatwiej będzie pozamieniać na mysqli.


--------------------
Go to the top of the page
+Quote Post
kecajs
post 28.10.2019, 22:00:44
Post #5





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 23.04.2010

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


Na chwilę obecną zmieniłem serwer lokalny na XAMPP, zaś dostęp do bazy odbywa się poprzez mysqli - faktycznie okazało się to prostrze. Jednakże pojawił się problem przy imporcie danych z pliku CSV. Struktura bazy składa siez dwóch tabel (8 i 11 kolumn), bez A.I. bo pierwsza kolumna to "lp", a baza jest stała - nic do niej nie będzie dodawane, chodzi tylko o łatwiejszy sposób prezentacji, niż robienie tabeli na ok. 400 wierszy. Dlatego też nie dokładałem pustej pierwszej kolumny, jak to zalecają na różnych forach. Podczas importu pojawił się błąd "Niewłaściwa suma kolumn w CSV w linii 1". W poprzedniej wersji serwera - WebSerw, nie było żadnych problemów z importem. Na wszelki wypadek jednakże dołożyłem pustą kolumnę i zaczytana został pierwszy wiersz i pojawił się komunikat błędu "Niewłaściwa suma kolumn w CSV w linii 2". NIe mam pojęcia, co namieszałem i gdzie robię błąd. Będę wdzięczny za podpowiedź jak powinieniem zaimportować dane z arkusza Excela do bazy przez phpMyAdmina.

OK, temat ogarnięty, polskie znaki są, połączenie z bazą również - wykorzystałem mysqli.
Podsumowując, problem polegał na zastosowaniu starego oprogramowania (WinServ) i nie obsługiwanej już funkcji -mysql(). Zamiana serwera na XAMPP i wykorzystanie funkcji mysqli() rozwiązało całkowicie problem. Temat do zamknięcia.

Ten post edytował kecajs 28.10.2019, 22:14:52
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: 28.03.2024 - 19:30