Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Здравствуйте. Очередной раз туплю, поэтому заранее извиняюсь.
Дано:
- XAMPP 3.2.1 for win, стянутый сайта апача.
- страничка в utf-8 (+ дополнительно указано meta charset="UTF-8" в хеде)
Проблема: при выводе mysql_error() русский текст выводится ромбиками. Если вручную поменять в огнелисе кодировку на cp1251 то всё становится кракозябрами, а ромбики нормальным русским текстом.
Полез в xampp\mysql\share\errmsg-utf8.txt, его содержание вот тут: pastebin.com/csDV5TmF
Смутило "russian=rus koi8r". Пробовал менять на utf-8 - толку ноль.
Причём, что забавно, если сделать mb_detect_encoding(mysql_error()), то возвращается UTF-8.
Собсно вопрос - что можно поковырять, чтобы оно а) нормально отображало русский б) если нельзя, то хотя бы, чтоб на инглише всё было.
Дано:
- XAMPP 3.2.1 for win, стянутый сайта апача.
- страничка в utf-8 (+ дополнительно указано meta charset="UTF-8" в хеде)
Проблема: при выводе mysql_error() русский текст выводится ромбиками. Если вручную поменять в огнелисе кодировку на cp1251 то всё становится кракозябрами, а ромбики нормальным русским текстом.
Полез в xampp\mysql\share\errmsg-utf8.txt, его содержание вот тут: pastebin.com/csDV5TmF
Смутило "russian=rus koi8r". Пробовал менять на utf-8 - толку ноль.
Причём, что забавно, если сделать mb_detect_encoding(mysql_error()), то возвращается UTF-8.
Собсно вопрос - что можно поковырять, чтобы оно а) нормально отображало русский б) если нельзя, то хотя бы, чтоб на инглише всё было.
-
-
02.11.2013 в 15:301. При соединении сразу после mysql_connect делаем mysql_set_charset("utf8").
2. Проверить кодировку самого файла скрипта, из которого совершается вызов. По умолчанию блокнот и ему подобные сохраняют файлы в win-1251.
-
-
02.11.2013 в 15:39Эм... а если вот, допустим, ошибка как раз при подключении? Хочет пользователь подключиться к MySQL, но ввёл неправильный хост? Соединение не удалось, но ошибка сгенерировалась. Как в этом случае?
Попробовал вставить перед mysql_connect - ошибку вообще не выдало, а mysql_errno выдала "0"
2. Проверить кодировку самого файла скрипта, из которого совершается вызов. По умолчанию блокнот и ему подобные сохраняют файлы в win-1251.
Не, тут всё уже проверено. Я ж написал. Я все файлы принципиально в UTF сохраняю. Причём без BOM. Ибо были уже проблемы с этим.
-
-
02.11.2013 в 15:43Но уж если задумывать, то я бы все же использовал mysql_connect( {данные} ) or die( {текст сообщения} )
-
-
02.11.2013 в 15:52Ну тут уж каждому своё. Просто вот, допустим, есть необходимость работать с несколькими серверами. Поэтому, в одном случае пользователь напишет localhost, чтобы работать с локальным сервером, а в другом случае надо указать адрес удалённого сервера, чтобы поработать с ним.
Но уж если задумывать, то я бы все же использовал mysql_connect( {данные} ) or die( {текст сообщения} )
Но тут есть проблема - сообщение-то наше. А надо, чтобы именно то, которое от MySQL приходит. Пользователь же должен понять, что именно не так - ошибся сервером, или в логине/пароле опечатался. Или вообще ему права урезали.
-
-
02.11.2013 в 16:00Вот собсно полный текст, если надо (mysql_errno и mysql_error): 2002: php_network_getaddresses: getaddrinfo failed: Этот хост неизвестен.
-
-
02.11.2013 в 16:24По поводу ошибки: по ней ясно видно, что это ошибка доступа именно к хосту. Т.е. до mysql соединение не доходит. Проверьте настройки сокета, портов и т.д. (заодно проверьте запущен ли мускул вообще)
-
-
02.11.2013 в 16:49-
-
02.11.2013 в 17:11Типа вывод mysql_error в переменную, а потом переменную выводить? То же самое получается, пробовал уже.
По поводу ошибки: по ней ясно видно, что это ошибка доступа именно к хосту. Т.е. до mysql соединение не доходит. Проверьте настройки сокета, портов и т.д. (заодно проверьте запущен ли мускул вообще)
Вопрос в том, откуда это сообщение - из php или из mysql? Сам MySQL работает, это точно. Я просто намеренно ввожу не тот хост, чтобы посмотреть как ошибки выводятся.
У меня сразу вызывает вопрос. А поставить отдельно апачь, пхп и мускуль, а потом связать это все, есть возможность? Геммороя много, но работает надежнее чем это Xamp и иже с ним.
Это геморно, да. ХАМРР хорош именно тем, что он портативен. Всегда с собой, всегда настроен как надо. Проблем "из коробки" никогда с ним не было.
-
-
02.11.2013 в 18:09-
-
02.11.2013 в 18:11-
-
03.11.2013 в 04:23Ну, не стоит ожидать чудес от этой функции, она реализована левой пяткой и не использует даже частотность букв в алфавитах, а даже это бы не давало никаких гарантий (вспоминаем «Bush hid the facts» и прочие шутки с notepad'ом). На самом деле, если в строке всего несколько символов, то и человек не всегда смог бы определить кодировку, не зная, что там могло бы быть написано и на каком языке.
php_network_getaddresses: getaddrinfo failed: Этот хост неизвестен
Думаю, этот текст отдаёт Windows. В XP он лежит прямо в kernel32.dll и, кстати, в UTF-16LE. Не уверен, что малой кровью удастся заставить Windows отдавать это в желаемой кодировке.
-
-
03.11.2013 в 11:23Тогда остается прописать свои тексты для подобных ошибок и по case(mysql_errno) выдавать их. Хотя бы эту цифру кодировкой не испортишь.
-
-
03.11.2013 в 11:35У меня правда тогда ещё один вопросик. У меня это выдаётся как ошибка 2002. Это она всегда такая будет? Или может меняться в зависимости от каких-нибудь настроек?
-
-
03.11.2013 в 11:59-
-
03.11.2013 в 16:03Просто, в том же mysql'евском файлике, содержимое которого приводил ниже, есть параметр, отвечающий за нумерацию ошибок: start-error-number 1000
Не, я как бы понимаю, что смысла менять нумерацию ошибок нет. Я вообще не могу представить, нафиг это надо, но вот зачем-то же такой параметр ввели.
На самом деле, для моей задачи инфы уже более чем достаточно и сейчас я интересуюсь уже просто из интереса.)
-
-
03.11.2013 в 20:04Код ошибки здесь генерирует MySQL-клиент в PHP. Однако, сами коды ошибок клиента стандартизированы MySQL: dev.mysql.com/doc/refman/5.7/en/error-messages-... — думаю, на это можно полагаться.
Просто, в том же mysql'евском файлике, содержимое которого приводил ниже, есть параметр, отвечающий за нумерацию ошибок: start-error-number 1000
Файл используется при компиляции MySQL. Я не знаю, зачем его положили в XAMPP.
Не, я как бы понимаю, что смысла менять нумерацию ошибок нет. Я вообще не могу представить, нафиг это надо, но вот зачем-то же такой параметр ввели.
Этот параметр не для пользователей, а для разработчиков MySQL. Влияет на нумерацию ошибок внутри файла (впрочем, на его основе генерируются и заголовочные файлы с кодами и текстом ошибок). Почему они решили не хардкодить число 1000? Да чёрт его знает; скорее всего, для красоты. Однако, например, в популярном форке MariaDB это ключевое слово встречается ещё один раз: чтобы собственные номера ошибок MariaDB начинались с 1900.