15:16

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Здравствуйте. Очередной раз туплю, поэтому заранее извиняюсь.

Дано:
- 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:30

Cherka Trova
Как я люблю Windows... руки бы поотрывал их программистам от любви.
1. При соединении сразу после mysql_connect делаем mysql_set_charset("utf8").
2. Проверить кодировку самого файла скрипта, из которого совершается вызов. По умолчанию блокнот и ему подобные сохраняют файлы в win-1251.
02.11.2013 в 15:39

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Masque, 1. При соединении сразу после mysql_connect делаем mysql_set_charset("utf8").

Эм... а если вот, допустим, ошибка как раз при подключении? Хочет пользователь подключиться к MySQL, но ввёл неправильный хост? Соединение не удалось, но ошибка сгенерировалась. Как в этом случае?
Попробовал вставить перед mysql_connect - ошибку вообще не выдало, а mysql_errno выдала "0"


2. Проверить кодировку самого файла скрипта, из которого совершается вызов. По умолчанию блокнот и ему подобные сохраняют файлы в win-1251.

Не, тут всё уже проверено. Я ж написал. Я все файлы принципиально в UTF сохраняю. Причём без BOM. Ибо были уже проблемы с этим.
02.11.2013 в 15:43

Cherka Trova
Ryuzaki_rnd, пользователь вводит хост... нда, я бы такого делать не стал.
Но уж если задумывать, то я бы все же использовал mysql_connect( {данные} ) or die( {текст сообщения} )
02.11.2013 в 15:52

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Masque, нда, я бы такого делать не стал.

Ну тут уж каждому своё. Просто вот, допустим, есть необходимость работать с несколькими серверами. Поэтому, в одном случае пользователь напишет localhost, чтобы работать с локальным сервером, а в другом случае надо указать адрес удалённого сервера, чтобы поработать с ним.


Но уж если задумывать, то я бы все же использовал mysql_connect( {данные} ) or die( {текст сообщения} )

Но тут есть проблема - сообщение-то наше. А надо, чтобы именно то, которое от MySQL приходит. Пользователь же должен понять, что именно не так - ошибся сервером, или в логине/пароле опечатался. Или вообще ему права урезали.
02.11.2013 в 16:00

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Забавно... в xampp\mysql\share\errmsg-utf8.txt фразы "Этот хост неизвестен. " нет. Возникает ещё один вопрос - откуда тогда это сообщение берётся? Или его php генерирует?

Вот собсно полный текст, если надо (mysql_errno и mysql_error): 2002: php_network_getaddresses: getaddrinfo failed: Этот хост неизвестен.
02.11.2013 в 16:24

Cherka Trova
Ну а что мешает подставлять в текст сообщения, который выдает mysql_error?

По поводу ошибки: по ней ясно видно, что это ошибка доступа именно к хосту. Т.е. до mysql соединение не доходит. Проверьте настройки сокета, портов и т.д. (заодно проверьте запущен ли мускул вообще)
02.11.2013 в 16:49

Не думай, как получилось так - подумай, как это исправить.
У меня сразу вызывает вопрос. А поставить отдельно апачь, пхп и мускуль, а потом связать это все, есть возможность? Геммороя много, но работает надежнее чем это Xamp и иже с ним.
02.11.2013 в 17:11

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Masque, Ну а что мешает подставлять в текст сообщения, который выдает mysql_error?

Типа вывод mysql_error в переменную, а потом переменную выводить? То же самое получается, пробовал уже.


По поводу ошибки: по ней ясно видно, что это ошибка доступа именно к хосту. Т.е. до mysql соединение не доходит. Проверьте настройки сокета, портов и т.д. (заодно проверьте запущен ли мускул вообще)

Вопрос в том, откуда это сообщение - из php или из mysql? Сам MySQL работает, это точно. Я просто намеренно ввожу не тот хост, чтобы посмотреть как ошибки выводятся.


У меня сразу вызывает вопрос. А поставить отдельно апачь, пхп и мускуль, а потом связать это все, есть возможность? Геммороя много, но работает надежнее чем это Xamp и иже с ним.

Это геморно, да. ХАМРР хорош именно тем, что он портативен. Всегда с собой, всегда настроен как надо. Проблем "из коробки" никогда с ним не было.
02.11.2013 в 18:09

Cherka Trova
Ryuzaki_rnd, как может mysql выдавать ошибки, если соединение до него не дошло?
02.11.2013 в 18:11

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Masque, А, ну да, туплю. Тады вопрос, как php рассказать, что мне надо в utf сообщения выдавать?
03.11.2013 в 04:23

Sanctus Satanas
Ryuzaki_rnd, что забавно, если сделать mb_detect_encoding(mysql_error())
Ну, не стоит ожидать чудес от этой функции, она реализована левой пяткой и не использует даже частотность букв в алфавитах, а даже это бы не давало никаких гарантий (вспоминаем «Bush hid the facts» и прочие шутки с notepad'ом). На самом деле, если в строке всего несколько символов, то и человек не всегда смог бы определить кодировку, не зная, что там могло бы быть написано и на каком языке.

php_network_getaddresses: getaddrinfo failed: Этот хост неизвестен
Думаю, этот текст отдаёт Windows. В XP он лежит прямо в kernel32.dll и, кстати, в UTF-16LE. Не уверен, что малой кровью удастся заставить Windows отдавать это в желаемой кодировке.
03.11.2013 в 11:23

Cherka Trova
--==SS==--, ох, спасибо. А то я признаться, подзамучился искать его в php. Оказывается, все еще веселее.
Тогда остается прописать свои тексты для подобных ошибок и по case(mysql_errno) выдавать их. Хотя бы эту цифру кодировкой не испортишь.
03.11.2013 в 11:35

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, Masque, Спасибо. Значит для подобных частных случаев буду просто обрабатывать номер ошибки и выводить сообщение сам.)

У меня правда тогда ещё один вопросик. У меня это выдаётся как ошибка 2002. Это она всегда такая будет? Или может меняться в зависимости от каких-нибудь настроек?
03.11.2013 в 11:59

Cherka Trova
Ryuzaki_rnd, ну если только Майкрософт не ввел свою знаковую систему, о которой я не в курсе, то код ошибки должен быть один и тот же что на Win, что на Lin.
03.11.2013 в 16:03

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Masque, Я не о том. Окей, русскую часть генерирует система, php её ловит, идентифицирует, добавляет своё и всё вместе выдаёт в выводе mysql_error(). Но вот код ошибки, кто гененирует? Мне почему-то кажется что php. Отсюда и вопрос, возможно ли в php менять нумерацию ошибок или же это всё жёстко стандартизированно.

Просто, в том же mysql'евском файлике, содержимое которого приводил ниже, есть параметр, отвечающий за нумерацию ошибок: start-error-number 1000

Не, я как бы понимаю, что смысла менять нумерацию ошибок нет. Я вообще не могу представить, нафиг это надо, но вот зачем-то же такой параметр ввели.

На самом деле, для моей задачи инфы уже более чем достаточно и сейчас я интересуюсь уже просто из интереса.)
03.11.2013 в 20:04

Sanctus Satanas
Ryuzaki_rnd, Но вот код ошибки, кто гененирует? Мне почему-то кажется что php. Отсюда и вопрос, возможно ли в php менять нумерацию ошибок или же это всё жёстко стандартизированно.
Код ошибки здесь генерирует 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.