Всем привет. Есть небольшой вопрос Вот пример кода 1: PHP: $dbc = mysqli_connect('name_server', 'name_user','pass_user','name-DB') or die('Sorry, not_cnnct'); PHP: $query = "INSERT INTO name_table (clmn1, clmn2, clmn3, clmn4, clmn5) " . "VALUES ('Lat_A', 'Lat_B', 'Lat_C', 'Lat_D', 'Lat_E')" ; PHP: $result = mysqli_query($dbc, $query) or die('Sorry, data_clmns_not_add'); PHP: mysqli_close($dbc); Этот код срабатывает и в таблицу БД добавляются данные Вот пример кода 2 (аналогичный, изменения только в значениях для столбцов): PHP: $dbc = mysqli_connect('name_server', 'name_user','pass_user','name-DB') or die('Sorry, not_cnnct'); $query = "INSERT INTO name_table (clmn1, clmn2, clmn3, clmn4, clmn5) " . "VALUES ('Kir_А', 'Kir_Б', 'Kir_В', 'Kir_Г', 'Kir_Д')" ; $result = mysqli_query($dbc, $query) or die('Sorry, data_clmns_not_add'); mysqli_close($dbc); Этот код срабатывает наполовину, т.е. в итоге выводится data_clmns_not_add Я так думаю, что проблемы наверное в кодировке, и не распознаются кириллические буквы?
https://php.ru/forum/threads/pro-kodirovku-i-bazu.56793/ --- Добавлено --- Таблица Имя таблицы. Это потрясающе! Дружище, ты наверное свой запрос "адаптировал" прежде чем сюда выложить? Потому что имя таблицы в тексте не совпадает с картинкой. Так вот, не надо использовать кириллицу в именах. И ещё, используй mysqli_error чтобы знать в чём ошибка. Мы за тебя отлаживать не должны.
Итак, я создал в MySQL новую БД и назвал ее db_for_frmphp, а в ней создал пятиколоночную таблицу - tble_1. У обоих сравнение UTF8-general-ci Потом я написал небольшой код, такой же как и был, с небольшими изменениями. Суть кода: пользователь вводит значения , а PHP код заносит их в БД и начал тестировать код. 1. Сначала были цифры - удачно 2. Потом латиница - удачно 3. Потом кириллица - удачно, но в самой MySQL вместо введенных символов были какие то кракозябры. Код HTML и PHP написан в Notepad++, и там выставлена кодировка UTF-8 без BOM Скриншоты ниже --- Добавлено --- Подскажете куда копать и в каком направлении, может вина в phpmyadmin? По поводу добавления MySQL_error - как это сделать? И будет ли смысл, ошибки как таковой вроде нет ... Сейчас сделаю запрос непосредственно из PHPMYADMIN с добавлением кириллицы, результаты выложу ниже.
В PHPMyAdmin кодировка переачи данных может стоять не правильная, там на главной странице пишет вместе с версиями
Подскажете куда копать и в каком направлении, может вина в phpmyadmin? По поводу добавления MySQL_error - как это сделать? И будет ли смысл, ошибки как таковой --- Добавлено --- @denis01привет Стоит кодировка utf8mb4_unicode_ci --- Добавлено --- @artoodetoo да я в пеинте заменил нормальное название на то, что на картинке, чтобы было понятнее. На самом деле там было сложнопроизносимое название на латинице =)
не в MySQL, а в phpmyadmin. это 100% признак, что ты не указал set names. я ссылку для кого давал? ты сюда пришел за знаниями или картинок повыкладывать? получил подсказку — разберись с ней. что непонятно спроси. нам твои простыни на пять экранов нафиг не интересно рассматривать. --- Добавлено --- ты, блин, не понимаешь, что цитировать или копировать кусок картинки не получится. еще раз вместо листинга картинку запостишь — получишь бан.
@artoodetoo, то-есть код должен выглядеть : Код (Text): <?php header('Content-type: text/html; charset=UTF-8'); $per_clmn1 = $_POST['html_clmn1']; $per_clmn2 = $_POST['html_clmn2']; $per_clmn3 = $_POST['html_clmn3']; $per_clmn4 = $_POST['html_clmn4']; $per_clmn5 = $_POST['html_clmn5']; $dbc = mysqli_connect('localhost','root','','db_for_frmphp') or die('Sorry, not connect'); mysqli_set_charset($link, "utf8"); $query = "INSERT INTO tble_1 (clmn1, clmn2, clmn3, clmn4, clmn5) " . "VALUES ('$per_clmn1', '$per_clmn2', '$per_clmn3', '$per_clmn4', '$per_clmn5' )"; $result = mysqli_query($dbc, $query) or die('Извините, данные не добавлены'); mysqli_close($dbc); ?>
типа того. только разберись где у тебя $dbc, а где $link. надо включить вывод всех предупреждений, тогда такие косяки будешь вылавливать до того, как они превратятся в неразрешимую проблему. http://phpfaq.ru/debug и or die('Извините, данные не добавлены') можешь заменить на or die('ОШИБКА: '.mysqli_error($dbc));
и скроллить бесит ппц. по теме: К твоей проблеме можно провести аналогию для понимания. Представь, что твоя php страница и база данных - это разные страны, а кодировка - это язык, на котором они общаются. Ты отправляешь из России в Арабские Эмираты (где все говорят по арабски) письмо и в заголовке указываешь, что оно на английском языке, а оно на самом деле на русском. Тот кто отвечает за прием почты не знает ни английского ни русского. Он видит в заголовке, что письмо на английском и передает письмо англо-арабскому переводчику. А тот ничего не может понять. Так как мы имеем дело с машиной а не с людьми, переводчик переведёт и занесёт в БД. И ему без разницы. Ему сказали что это английский. Поэтому язык должен быть одинаковым и на странице, и при передаче от страницы к БД, и в полях таблицы. Я использую utf-8, utf 8, utf-8_general_ci и не знаю проблем с кодировкой...
@TeslaFeo так я вроде тоже везде указал что использую utf-8 1. Кодировка в блокноте - UTF-8 без BOM 2. Внутри кода, в начале, указано charset=UTF-8 3. База и таблицы - сравнение UTF-8_general_ci
+1 не совсем так. язык должен быть одинаковым на странице и в объявлении set names (mysql_set_charset). храниться в базе он может в иной кодировке, сервер MySQL с этим справляется, если его правильно информировать. но лучше везде utf8. и если версия сервера позволяет, то лучше там сделать utf8mb4 чтобы всякие иероглифы и эмодзи могли сохраниться.
@artoodetoo немного не понял, код в итоге выглядит так: Код (Text): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ru" xml:lang="ru"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="description" lang="ru" content="Сниппет" /> <meta name="description" lang="en" content="Snippet" /> <meta name="keywords" content="Слово1, Слово2, Слово3" /> <meta name="keywords" content="Word1, Word2, Word3" /> <link type="text/css" rel="stylesheet" href="CSS/stylescr.css" media="screen" /> <link type="text/css" rel="stylesheet" href="CSS/styleprt.css" media="print" /> <link type="text/css" rel="stylesheet" href="CSS/stylehhd.css" media="handheld" /> <title>Залоговок</title> </head> <body> <?php header('Content-type: text/html; charset=UTF-8'); $per_clmn1 = $_POST['html_clmn1']; $per_clmn2 = $_POST['html_clmn2']; $per_clmn3 = $_POST['html_clmn3']; $per_clmn4 = $_POST['html_clmn4']; $per_clmn5 = $_POST['html_clmn5']; $dbc = mysqli_connect('localhost','root','','db_for_frmphp') or die('Внимание, ошибка соединения с базой: '.mysqli_error($dbc)); mysqli_set_charset($link, "utf8"); $query = "INSERT INTO tble_1 (clmn1, clmn2, clmn3, clmn4, clmn5) " . "VALUES ('$per_clmn1', '$per_clmn2', '$per_clmn3', '$per_clmn4', '$per_clmn5' )"; $result = mysqli_query($dbc, $query) or die('Внимание, ошибка при занесении данных в БД: '.mysqli_error($dbc)); mysqli_close($dbc); ?> <a href="index.html" title="Вернуться назад">Вернуться назад</a> </body> </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 ?
у тебя нет переменной $link --- Добавлено --- header-ы должны быть ДО любого вывода: до echo, до вывода html, который вне операторных скобок <?php ?>, до первого сообщения об ошибке — до всего.
@TeslaFeo насколько я понимаю, то это форум для новичков в PHP, для чайников и прочая, прочая. Я начал изучать PHP три дня назад, и я естественно не могу все знать. Изучаю по книге, книга англоязычная. Дошло дело до переноса данных из PHPкода в БД MySQL, там используется латиница везде и все норм, а про киррилицу ничего не говорится. Я спросил совета как новичок, а Вы мне пишете будто я пишу на PHP годы и не знаю как объявлять переменные. Спасибо!
Jakenxgar2, что такое переменная (variable по-англицки) в книге должно объясняться до баз данных. Вернитесь к началу, если возникают такие вопросы
@Jakenxgar2, прости пожалуйста. не хотел обидеть. и писать этого не хотел.. вырвалось... когда что то знаешь, кажется что все должны знать... Вот такая вот ошибка... --- Добавлено --- на русском полно инфы в интернете..
@mkramer про переменную это был просто тривиальный пример =))) @TeslaFeo да ничо, я уже привык --- Добавлено --- @artoodetoo, посмотри пожалуйста, ниже код - который заработал и кириллица добавилась, есть какой-то неправильный момент? Код (PHP): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ru" xml:lang="ru"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="description" lang="ru" content="Сниппет" /> <meta name="description" lang="en" content="Snippet" /> <meta name="keywords" content="Слово1, Слово2, Слово3" /> <meta name="keywords" content="Word1, Word2, Word3" /> <link type="text/css" rel="stylesheet" href="CSS/stylescr.css" media="screen" /> <link type="text/css" rel="stylesheet" href="CSS/styleprt.css" media="print" /> <link type="text/css" rel="stylesheet" href="CSS/stylehhd.css" media="handheld" /> <title>Залоговок</title> </head> <body> <?php header('Content-type: text/html; charset=UTF-8'); $per_clmn1 = $_POST['html_clmn1']; $per_clmn2 = $_POST['html_clmn2']; $per_clmn3 = $_POST['html_clmn3']; $per_clmn4 = $_POST['html_clmn4']; $per_clmn5 = $_POST['html_clmn5']; $dbc = mysqli_connect('localhost','root','','db_for_frmphp') or die('Внимание, ошибка соединения с базой: '.mysqli_error($dbc)); mysqli_set_charset($dbc, "utf8"); $query = "INSERT INTO tble_1 (clmn1, clmn2, clmn3, clmn4, clmn5) " . "VALUES ('$per_clmn1', '$per_clmn2', '$per_clmn3', '$per_clmn4', '$per_clmn5' )"; $result = mysqli_query($dbc, $query) or die('Внимание, ошибка при занесении данных в БД: '.mysqli_error($dbc)); mysqli_close($dbc); ?> <a href="index.html" title="Вернуться назад">Вернуться назад</a> </body> </html> --- Добавлено --- header в данном случае стоит до любого вывода, а если допустим есть html заголовок типа <h1>, то код примет вид: Код (PHP): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ru" xml:lang="ru"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="description" lang="ru" content="Сниппет" /> <meta name="description" lang="en" content="Snippet" /> <meta name="keywords" content="Слово1, Слово2, Слово3" /> <meta name="keywords" content="Word1, Word2, Word3" /> <link type="text/css" rel="stylesheet" href="CSS/stylescr.css" media="screen" /> <link type="text/css" rel="stylesheet" href="CSS/styleprt.css" media="print" /> <link type="text/css" rel="stylesheet" href="CSS/stylehhd.css" media="handheld" /> <title>Залоговок</title> </head> <body> header('Content-type: text/html; charset=UTF-8'); <h1>ДОБАВЛЕННЫЙ ЗАГОЛОВОК 1 УРОВНЯ</h1> <?php $per_clmn1 = $_POST['html_clmn1']; $per_clmn2 = $_POST['html_clmn2']; $per_clmn3 = $_POST['html_clmn3']; $per_clmn4 = $_POST['html_clmn4']; $per_clmn5 = $_POST['html_clmn5']; $dbc = mysqli_connect('localhost','root','','db_for_frmphp') or die('Внимание, ошибка соединения с базой: '.mysqli_error($dbc)); mysqli_set_charset($dbc, "utf8"); $query = "INSERT INTO tble_1 (clmn1, clmn2, clmn3, clmn4, clmn5) " . "VALUES ('$per_clmn1', '$per_clmn2', '$per_clmn3', '$per_clmn4', '$per_clmn5' )"; $result = mysqli_query($dbc, $query) or die('Внимание, ошибка при занесении данных в БД: '.mysqli_error($dbc)); mysqli_close($dbc); ?> <a href="index.html" title="Вернуться назад">Вернуться назад</a> </body> </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" />
Ещё есть заголовки HTTP, бывает что веб-сервер там указывает кодировку, и она приоритет имеет перед кодировкой в meta charset.
https://tools.ietf.org/html/rfc2616#section-3.4 Пример как отправить из PHP PHP: header('Content-Type: text/html; charset=utf-8');
Это тоже вывод. Поэтому header должен быть до html-кода внутри php-файла. Иначе работоспособность будет зависеть от настроек хостинга
Капец, как трудно объяснять простые вещи. Смотри вот этот фрагмент: Код (PHP): <html> <head> <title>Test</title> </head> <body> <?php echo 'Hello!'; ?> </body> </html> Для PHP любой набор байтов это программа. То, что находится внутри операторных скобок <?php и ?> это команды. А то что вне этих скобок это операция вывода. Мой пример выше фактически выполняется так: Код (PHP): <?php echo "<html>\n"; echo "<head>\n"; echo "<title>Test</title>\n"; echo "</head>\n"; echo "<body>\n"; echo 'Hello!';; echo "</body>\n"; echo "</html>\n"; Понял, нет? Когда я говорю "помести header() до любого вывода, это значит, что он должен быть до любого вывода. А <!DOCTYPE…> это уже вывод. А надо, блин, ДО него. Вот так: Код (PHP): <?php header(...); // возможно еще какие-то команда, потом скобка закрывается и идет вывод: ?> <!DOCTYPE html... ... --- Добавлено --- Читай книги уровня PHP для чайников