За последние 24 часа нас посетили 22707 программистов и 1215 роботов. Сейчас ищут 786 программистов ...

Небольшой вопрос по PHP + MySQL

Тема в разделе "PHP для новичков", создана пользователем Jakenxgar2, 9 май 2016.

  1. Jakenxgar2

    Jakenxgar2 Новичок

    С нами с:
    9 май 2016
    Сообщения:
    16
    Симпатии:
    0
    Всем привет. Есть небольшой вопрос

    Вот пример кода 1:

    PHP:
    1. $dbc = mysqli_connect('name_server', 'name_user','pass_user','name-DB') or die('Sorry, not_cnnct');
    PHP:
    1. $query = "INSERT INTO name_table (clmn1, clmn2, clmn3, clmn4, clmn5) " .
    2. "VALUES ('Lat_A', 'Lat_B', 'Lat_C', 'Lat_D', 'Lat_E')" ;
    PHP:
    1. $result = mysqli_query($dbc, $query) or die('Sorry, data_clmns_not_add');
    PHP:
    Этот код срабатывает и в таблицу БД добавляются данные



    Вот пример кода 2 (аналогичный, изменения только в значениях для столбцов):

    PHP:
    1. $dbc = mysqli_connect('name_server', 'name_user','pass_user','name-DB') or die('Sorry, not_cnnct');
    2.  
    3. $query = "INSERT INTO name_table (clmn1, clmn2, clmn3, clmn4, clmn5) " .
    4. "VALUES ('Kir_А', 'Kir_Б', 'Kir_В', 'Kir_Г', 'Kir_Д')" ;
    5.  
    6. $result = mysqli_query($dbc, $query) or die('Sorry, data_clmns_not_add');
    7.  
    Этот код срабатывает наполовину, т.е. в итоге выводится data_clmns_not_add

    Я так думаю, что проблемы наверное в кодировке, и не распознаются кириллические буквы?
    1.png
     
    #1 Jakenxgar2, 9 май 2016
    Последнее редактирование модератором: 10 май 2016
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Ничего не понятно, запрос в PHPMyAdmin работает?
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    https://php.ru/forum/threads/pro-kodirovku-i-bazu.56793/
    --- Добавлено ---
    Таблица Имя таблицы. Это потрясающе! Дружище, ты наверное свой запрос "адаптировал" прежде чем сюда выложить? Потому что имя таблицы в тексте не совпадает с картинкой. Так вот, не надо использовать кириллицу в именах.

    И ещё, используй mysqli_error чтобы знать в чём ошибка. Мы за тебя отлаживать не должны.
     
  4. Jakenxgar2

    Jakenxgar2 Новичок

    С нами с:
    9 май 2016
    Сообщения:
    16
    Симпатии:
    0
    Итак, я создал в MySQL новую БД и назвал ее db_for_frmphp, а в ней создал пятиколоночную таблицу - tble_1. У обоих сравнение UTF8-general-ci

    Потом я написал небольшой код, такой же как и был, с небольшими изменениями. Суть кода: пользователь вводит значения , а PHP код заносит их в БД и начал тестировать код.

    1. Сначала были цифры - удачно
    2. Потом латиница - удачно
    3. Потом кириллица - удачно, но в самой MySQL вместо введенных символов были какие то кракозябры. Код HTML и PHP написан в Notepad++, и там выставлена кодировка UTF-8 без BOM
    Скриншоты ниже
    Сравнения.png Код html.png Код PHP.png 1 - ввод в БД чисел.png 1- числа добавились.png 2 - ввод в БД латиницы.png 2- латиница добавилась.png 3 - ввод в БД кириллицы.png 3- кириллица добавилась.png
    --- Добавлено ---
    Подскажете куда копать и в каком направлении, может вина в phpmyadmin?
    По поводу добавления MySQL_error - как это сделать? И будет ли смысл, ошибки как таковой вроде нет ...
    Сейчас сделаю запрос непосредственно из PHPMYADMIN с добавлением кириллицы, результаты выложу ниже.
     
  5. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    В PHPMyAdmin кодировка переачи данных может стоять не правильная, там на главной странице пишет вместе с версиями
     
  6. Jakenxgar2

    Jakenxgar2 Новичок

    С нами с:
    9 май 2016
    Сообщения:
    16
    Симпатии:
    0
    Подскажете куда копать и в каком направлении, может вина в phpmyadmin? SQL-запрос из PMA.png результат SQL-запроса из PMA.png
    По поводу добавления MySQL_error - как это сделать? И будет ли смысл, ошибки как таковой
    --- Добавлено ---
    @denis01привет
    Стоит кодировка utf8mb4_unicode_ci
    mpagepma.png
    --- Добавлено ---
    @artoodetoo да я в пеинте заменил нормальное название на то, что на картинке, чтобы было понятнее. На самом деле там было сложнопроизносимое название на латинице =)
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    не в MySQL, а в phpmyadmin.

    это 100% признак, что ты не указал set names. я ссылку для кого давал? ты сюда пришел за знаниями или картинок повыкладывать?
    получил подсказку — разберись с ней. что непонятно спроси. нам твои простыни на пять экранов нафиг не интересно рассматривать.
    --- Добавлено ---
    ты, блин, не понимаешь, что цитировать или копировать кусок картинки не получится. еще раз вместо листинга картинку запостишь — получишь бан.
     
  8. Jakenxgar2

    Jakenxgar2 Новичок

    С нами с:
    9 май 2016
    Сообщения:
    16
    Симпатии:
    0
    @artoodetoo, то-есть код должен выглядеть :
    Код (Text):
    1. <?php
    2.  
    3. header('Content-type: text/html; charset=UTF-8');
    4.  
    5. $per_clmn1 = $_POST['html_clmn1'];
    6. $per_clmn2 = $_POST['html_clmn2'];
    7. $per_clmn3 = $_POST['html_clmn3'];
    8. $per_clmn4 = $_POST['html_clmn4'];
    9. $per_clmn5 = $_POST['html_clmn5'];
    10.  
    11. $dbc = mysqli_connect('localhost','root','','db_for_frmphp') or die('Sorry, not connect');
    12. mysqli_set_charset($link, "utf8");
    13. $query = "INSERT INTO tble_1 (clmn1, clmn2, clmn3, clmn4, clmn5) " .
    14. "VALUES ('$per_clmn1', '$per_clmn2', '$per_clmn3', '$per_clmn4', '$per_clmn5' )";
    15.  
    16. $result = mysqli_query($dbc, $query) or die('Извините, данные не добавлены');
    17.  
    18. mysqli_close($dbc);
    19.  
    20.  
    21. ?>
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    типа того. только разберись где у тебя $dbc, а где $link. надо включить вывод всех предупреждений, тогда такие косяки будешь вылавливать до того, как они превратятся в неразрешимую проблему. http://phpfaq.ru/debug

    и or die('Извините, данные не добавлены') можешь заменить на or die('ОШИБКА: '.mysqli_error($dbc));
     
  10. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    и скроллить бесит ппц.

    по теме:

    К твоей проблеме можно провести аналогию для понимания.

    Представь, что твоя php страница и база данных - это разные страны, а кодировка - это язык, на котором они общаются.
    Ты отправляешь из России в Арабские Эмираты (где все говорят по арабски) письмо и в заголовке указываешь, что оно на английском языке, а оно на самом деле на русском. Тот кто отвечает за прием почты не знает ни английского ни русского. Он видит в заголовке, что письмо на английском и передает письмо англо-арабскому переводчику. А тот ничего не может понять.
    Так как мы имеем дело с машиной а не с людьми, переводчик переведёт и занесёт в БД. И ему без разницы. Ему сказали что это английский.

    Поэтому язык должен быть одинаковым и на странице, и при передаче от страницы к БД, и в полях таблицы.

    Я использую utf-8, utf 8, utf-8_general_ci и не знаю проблем с кодировкой...
     
  11. Jakenxgar2

    Jakenxgar2 Новичок

    С нами с:
    9 май 2016
    Сообщения:
    16
    Симпатии:
    0
    @TeslaFeo так я вроде тоже везде указал что использую utf-8
    1. Кодировка в блокноте - UTF-8 без BOM
    2. Внутри кода, в начале, указано charset=UTF-8
    3. База и таблицы - сравнение UTF-8_general_ci
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    +1
    не совсем так. язык должен быть одинаковым на странице и в объявлении set names (mysql_set_charset). храниться в базе он может в иной кодировке, сервер MySQL с этим справляется, если его правильно информировать.

    но лучше везде utf8. и если версия сервера позволяет, то лучше там сделать utf8mb4 чтобы всякие иероглифы и эмодзи могли сохраниться.
     
  13. Jakenxgar2

    Jakenxgar2 Новичок

    С нами с:
    9 май 2016
    Сообщения:
    16
    Симпатии:
    0
    @artoodetoo немного не понял, код в итоге выглядит так:
    Код (Text):
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml" lang="ru" xml:lang="ru">
    3. <head>
    4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    5. <meta name="description" lang="ru" content="Сниппет" />
    6. <meta name="description" lang="en" content="Snippet" />
    7. <meta name="keywords" content="Слово1, Слово2, Слово3" />
    8. <meta name="keywords" content="Word1, Word2, Word3" />
    9. <link type="text/css" rel="stylesheet" href="CSS/stylescr.css" media="screen" />
    10. <link type="text/css" rel="stylesheet" href="CSS/styleprt.css" media="print" />
    11. <link type="text/css" rel="stylesheet" href="CSS/stylehhd.css" media="handheld" />
    12. <title>Залоговок</title>
    13. </head>
    14.  
    15. <body>
    16.  
    17. <?php
    18.  
    19. header('Content-type: text/html; charset=UTF-8');
    20.  
    21. $per_clmn1 = $_POST['html_clmn1'];
    22. $per_clmn2 = $_POST['html_clmn2'];
    23. $per_clmn3 = $_POST['html_clmn3'];
    24. $per_clmn4 = $_POST['html_clmn4'];
    25. $per_clmn5 = $_POST['html_clmn5'];
    26.  
    27. $dbc = mysqli_connect('localhost','root','','db_for_frmphp') or die('Внимание, ошибка соединения с базой: '.mysqli_error($dbc));
    28. mysqli_set_charset($link, "utf8");
    29. $query = "INSERT INTO tble_1 (clmn1, clmn2, clmn3, clmn4, clmn5) " .
    30. "VALUES ('$per_clmn1', '$per_clmn2', '$per_clmn3', '$per_clmn4', '$per_clmn5' )";
    31.  
    32. $result = mysqli_query($dbc, $query) or die('Внимание, ошибка при занесении данных в БД: '.mysqli_error($dbc));
    33.  
    34. mysqli_close($dbc);
    35.  
    36.  
    37. ?>
    38. <a href="index.html" title="Вернуться назад">Вернуться назад</a>
    39.  
    40.  
    41. </body>
    42. </html>
    и при запуске, он показывает ошибку

    Notice
    : Undefined variable: link in C:\Server\data\htdocs\frmph\kod.php on line 28
    Warning: mysqli_set_charset() expects parameter 1 to be mysqli, null given in C:\Server\data\htdocs\frmph\kod.php on line 28

    28 строка это mysqli_set_charset($link, "utf8");
    Неверный синтаксис?

    --- Добавлено ---
    И в том ли месте стоит header ?
     
  14. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    у тебя нет переменной $link
    --- Добавлено ---
    header-ы должны быть ДО любого вывода: до echo, до вывода html, который вне операторных скобок <?php ?>, до первого сообщения об ошибке — до всего.
     
  15. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    $link ....
    это на сколько нужно не понимать что происходит....
     
  16. Jakenxgar2

    Jakenxgar2 Новичок

    С нами с:
    9 май 2016
    Сообщения:
    16
    Симпатии:
    0
    @TeslaFeo насколько я понимаю, то это форум для новичков в PHP, для чайников и прочая, прочая. Я начал изучать PHP три дня назад, и я естественно не могу все знать. Изучаю по книге, книга англоязычная. Дошло дело до переноса данных из PHPкода в БД MySQL, там используется латиница везде и все норм, а про киррилицу ничего не говорится. Я спросил совета как новичок, а Вы мне пишете будто я пишу на PHP годы и не знаю как объявлять переменные. Спасибо!
     
  17. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Jakenxgar2, что такое переменная (variable по-англицки) в книге должно объясняться до баз данных. Вернитесь к началу, если возникают такие вопросы
     
  18. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    @Jakenxgar2, прости пожалуйста. не хотел обидеть. и писать этого не хотел.. вырвалось...

    когда что то знаешь, кажется что все должны знать... Вот такая вот ошибка...
    --- Добавлено ---
    на русском полно инфы в интернете..
     
  19. Jakenxgar2

    Jakenxgar2 Новичок

    С нами с:
    9 май 2016
    Сообщения:
    16
    Симпатии:
    0
    @mkramer про переменную это был просто тривиальный пример =)))
    @TeslaFeo да ничо, я уже привык
    --- Добавлено ---
    @artoodetoo, посмотри пожалуйста, ниже код - который заработал и кириллица добавилась, есть какой-то неправильный момент?
    Код (PHP):
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml" lang="ru" xml:lang="ru">
    3. <head>
    4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    5. <meta name="description" lang="ru" content="Сниппет" />
    6. <meta name="description" lang="en" content="Snippet" />
    7. <meta name="keywords" content="Слово1, Слово2, Слово3" />
    8. <meta name="keywords" content="Word1, Word2, Word3" />
    9. <link type="text/css" rel="stylesheet" href="CSS/stylescr.css" media="screen" />
    10. <link type="text/css" rel="stylesheet" href="CSS/styleprt.css" media="print" />
    11. <link type="text/css" rel="stylesheet" href="CSS/stylehhd.css" media="handheld" />
    12. <title>Залоговок</title>
    13. </head>
    14.  
    15. <body>
    16.  
    17. <?php
    18.  
    19. header('Content-type: text/html; charset=UTF-8');
    20.  
    21. $per_clmn1 = $_POST['html_clmn1'];
    22. $per_clmn2 = $_POST['html_clmn2'];
    23. $per_clmn3 = $_POST['html_clmn3'];
    24. $per_clmn4 = $_POST['html_clmn4'];
    25. $per_clmn5 = $_POST['html_clmn5'];
    26.  
    27. $dbc = mysqli_connect('localhost','root','','db_for_frmphp') or die('Внимание, ошибка соединения с базой: '.mysqli_error($dbc));
    28. mysqli_set_charset($dbc, "utf8");
    29. $query = "INSERT INTO tble_1 (clmn1, clmn2, clmn3, clmn4, clmn5) " .
    30. "VALUES ('$per_clmn1', '$per_clmn2', '$per_clmn3', '$per_clmn4', '$per_clmn5' )";
    31.  
    32. $result = mysqli_query($dbc, $query) or die('Внимание, ошибка при занесении данных в БД: '.mysqli_error($dbc));
    33.  
    34.  
    35.  
    36. ?>
    37. <a href="index.html" title="Вернуться назад">Вернуться назад</a>
    38.  
    39.  
    40. </body>
    41. </html>
    --- Добавлено ---
    header в данном случае стоит до любого вывода, а если допустим есть html заголовок типа <h1>, то код примет вид:
    Код (PHP):
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml" lang="ru" xml:lang="ru">
    3. <head>
    4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    5. <meta name="description" lang="ru" content="Сниппет" />
    6. <meta name="description" lang="en" content="Snippet" />
    7. <meta name="keywords" content="Слово1, Слово2, Слово3" />
    8. <meta name="keywords" content="Word1, Word2, Word3" />
    9. <link type="text/css" rel="stylesheet" href="CSS/stylescr.css" media="screen" />
    10. <link type="text/css" rel="stylesheet" href="CSS/styleprt.css" media="print" />
    11. <link type="text/css" rel="stylesheet" href="CSS/stylehhd.css" media="handheld" />
    12. <title>Залоговок</title>
    13. </head>
    14.  
    15. <body>
    16.  
    17. header('Content-type: text/html; charset=UTF-8');
    18.  
    19. <h1>ДОБАВЛЕННЫЙ ЗАГОЛОВОК 1 УРОВНЯ</h1>
    20.  
    21. <?php
    22. $per_clmn1 = $_POST['html_clmn1'];
    23. $per_clmn2 = $_POST['html_clmn2'];
    24. $per_clmn3 = $_POST['html_clmn3'];
    25. $per_clmn4 = $_POST['html_clmn4'];
    26. $per_clmn5 = $_POST['html_clmn5'];
    27.  
    28. $dbc = mysqli_connect('localhost','root','','db_for_frmphp') or die('Внимание, ошибка соединения с базой: '.mysqli_error($dbc));
    29. mysqli_set_charset($dbc, "utf8");
    30. $query = "INSERT INTO tble_1 (clmn1, clmn2, clmn3, clmn4, clmn5) " .
    31. "VALUES ('$per_clmn1', '$per_clmn2', '$per_clmn3', '$per_clmn4', '$per_clmn5' )";
    32.  
    33. $result = mysqli_query($dbc, $query) or die('Внимание, ошибка при занесении данных в БД: '.mysqli_error($dbc));
    34.  
    35.  
    36.  
    37. ?>
    38. <a href="index.html" title="Вернуться назад">Вернуться назад</a>
    39.  
    40.  
    41. </body>
    42. </html>
    --- Добавлено ---
    И если правильно, то возможно ли добавить этот header под тэги <head> ... </head> , куда-нибудь до TITLE, например после <link type ... />
    --- Добавлено ---
    Убрал header и все осталось нормальным, добавляется нормальная кириллица в базу и ничего не кракозябрится
    Может из-за того, что у меня уже объявлен charset=UTF-8 в <meta http-equiv> ?
    --- Добавлено ---
    Сообщение о кодировке своего текста браузеру, так выглядит?
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
     
    #19 Jakenxgar2, 10 май 2016
    Последнее редактирование модератором: 10 май 2016
  20. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Ещё есть заголовки HTTP, бывает что веб-сервер там указывает кодировку, и она приоритет имеет перед кодировкой в meta charset.
     
  21. Jakenxgar2

    Jakenxgar2 Новичок

    С нами с:
    9 май 2016
    Сообщения:
    16
    Симпатии:
    0
    @denis01а есть пример кода заголовка HTTP, пожалуйста
     
  22. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
  23. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
     
  24. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Это тоже вывод. Поэтому header должен быть до html-кода внутри php-файла. Иначе работоспособность будет зависеть от настроек хостинга
     
  25. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Капец, как трудно объяснять простые вещи. Смотри вот этот фрагмент:
    Код (PHP):
    1. <html>
    2. <head>
    3. <title>Test</title>
    4. </head>
    5. <body>
    6. <?php
    7.  
    8. echo 'Hello!';
    9.  
    10. ?>
    11. </body>
    12. </html>
    Для PHP любой набор байтов это программа. То, что находится внутри операторных скобок <?php и ?> это команды. А то что вне этих скобок это операция вывода. Мой пример выше фактически выполняется так:
    Код (PHP):
    1. <?php
    2. echo "<html>\n";
    3. echo "<head>\n";
    4. echo "<title>Test</title>\n";
    5. echo "</head>\n";
    6. echo "<body>\n";
    7. echo 'Hello!';;
    8. echo "</body>\n";
    9. echo "</html>\n";
    Понял, нет?

    Когда я говорю "помести header() до любого вывода, это значит, что он должен быть до любого вывода. А <!DOCTYPE…> это уже вывод. А надо, блин, ДО него. Вот так:
    Код (PHP):
    1. <?php
    2. header(...);
    3. // возможно еще какие-то команда, потом скобка закрывается и идет вывод:
    4. ?>
    5. <!DOCTYPE html...
    6. ...
    --- Добавлено ---
    Читай книги уровня PHP для чайников