2009-06-13 3 views
1

EDIT: после обратной связи с моим оригинальным сообщением я изменил текст, чтобы уточнить мою проблему.Проблемы с кодированием в PHP/MySQL

У меня есть следующий запрос (псевдо-код):

$conn = mysql_connect('localhost', 'mysql_user', 'mysql_password'); 
mysql_query("SET NAMES 'utf8'; COLLATE='utf8_danish_ci';"); 

mysql_query("SELECT id FROM myTable WHERE name = 'Fióre`s måløye'", $conn); 

Это возвращает 0 строк.

В моем логфайле, я вижу это:

255 Connect  [email protected] on 
255 Query  SET NAMES 'utf8'; COLLATE='utf8_danish_ci' 
255 Init DB  norwegianfashion 
255 Query  SELECT id FROM myTable WHERE name = 'Fióre`s måløye' 
255 Quit 
  • Если я выполнить запрос непосредственно в PhpMyAdmin, я получаю результат.
  • Таблица кодировки: UTF-8
  • кодирование HTML страницы: UTF-8
  • Я могу добавить записи (из формы ввода), где имена используются акценты (например, «Fióre`s Hasselberg»)
  • я могу читать записи с акцентом при использовании -> «имя, как„$ Метка_строки%“»
  • информация в БД выглядит хорошо

Я понятия не имею, почему я не могу выбрать ни одной строки, имя которого имеет акцент символов.

Я действительно надеюсь, что кто-то может мне помочь.

ОБНОВЛЕНИЕ 1: Я пришел к компромиссу. Я буду конвертировать акценты с htmlentities при хранении данных и html_entity_decode при извлечении данных из БД. Кажется, это работает.

Единственный недостаток, который я вижу до сих пор, заключается в том, что я не могу читать имена в cleartext, используя phpMySQL.

+2

Можете ли вы разместить вызов функции так, как вы ее используете в своем сценарии? И можете ли вы напечатать $ sql и посмотреть, как он выглядит? –

+0

Готово. Если я возьму полученный sql и использую его непосредственно в PHPMyADmin, он отлично работает. Я получаю результат, который хочу. – Steven

+0

Какую кодировку вы используете в своем PHP-файле, где вы объявляете этот запрос выше? Вы также должны использовать UTF-8, чтобы не было конфликтов. – Gumbo

ответ

2

Как и другие ответы показывают, это очень похоже, как проблема кодирования. Я предлагаю включить ведение журнала запросов (http://dev.mysql.com/doc/refman/5.1/en/query-log.html), поскольку он может показать вам, что база данных действительно получает.

UPDATE: я, наконец, нашел страницу, объясняющую грязные детали PHP и UTF-8 (http://www.phpwact.org/php/i18n/charsets). Кроме того, убедитесь, что вы прочитали это (http://niwo.mnsys.org/saved/~flavell/charset/form-i18n.html), чтобы понять, как получить правильные данные, возвращаемые из сообщений формы.

+0

Вкратце журнал регистрирует только подключение/разъединение. Я запускаю MySQL на своей Win XP. Вы знаете, как получить более подробную информацию о регистрации? – Steven

+1

Просто прочтите руководство. Согласно http://dotnot.org/blog/archives/2005/01/11/query-logging-in-mysql-on-windows/, нет никаких проблем при регистрации протоколов. Однако у меня нет установок MySQL (и даже меньше XP), поэтому я не могу это подтвердить. –

+0

Блестящий Мартин. Я получил журнал и теперь вижу причину проблемы. Имя входа = «Церковь». Я считаю, что проблема с Юникодом. Но я не знаю, что еще я могу сделать, чтобы все это в UTF8 - я думал, что у меня все есть в utf8. – Steven

0

Возможно, попробуйте проверить сообщения об ошибках после вызова запроса (если вы еще не выполняете это вне этой функции). Это может сказать вам, что именно не так.

Как отметил Артем, распечатка фактического запроса - это хорошая идея - иногда все не так, как вы ожидаете от них.

+0

Ошибка не возникает. Он просто возвращает 0 строк. – Steven

0

Это может быть проблема с кодировкой, «в Церкви может быть причудливым персонажем. PHPMyAdmin может быть UTF-8, и ваш собственный сайт PHP может быть iso-latin1.

+0

Nah. Добавление utf8_encode() не помогает. – Steven

+0

Похоже, вы правы. Но я не уверен, как это можно решить. См. Обновление моего сообщения. – Steven

+0

После открытия соединения выполните mysql_set_charset ('utf8'). Кроме того, запустите SQL-запросы «SET CHARACTER SET» utf8 »и« SET NAMES »utf8». – Andomar

4

Я думаю, вы должны скорее вернуться $result, чем $this->query.

Кроме того, вы должны знать об SQL injection и рассмотреть возможность использования mysql_real_escape_string или подготовленных заявлений, чтобы защитить вас от таких атак. addslashes не является надлежащей защитой.

+0

Мой DAL (Data Access Layer) - это класс. Посмотреть последнее сообщение здесь: http://stackoverflow.com/questions/975452/need-some-advice-on-error-handling-in-php-mysql. Поэтому я должен использовать $ this-> query для возврата значения. Я не могу расширить DAL Lass для использования mysqli или PDO (см. Ссылку), но я тестировал SQL-инъекцию, и до сих пор это невозможно сделать, но я буду принимать правильные меры против этого. – Steven

+0

Вы не имеете в виду '$ this-> query_result'? Но зачем это нужно? '$ result' имеет такое же значение, как' $ this-> query_result': возвращаемое значение '$ this-> query()'. – Gumbo

+0

Если вы перепечатываете мой другой пост, я переименовал запрос $ query_result в $ query. И для вышеуказанного кода результат $ был только для тестирования (mysql_num_rows ($ result)). Я обновил выше пример и удалил $ result. – Steven

2

Попробуйте этот запрос. Если вы получите результаты, то это проблема с кавычкой характера в запросе

SELECT * FROM sl_label WHERE name Like 'Church%' 
+0

Это сработало! Одна строка была возвращена, и я вижу, что получившееся имя выглядит так: Church \ u00b4s. Итак, как мне пойти вокруг исправления обратного символа? Ни addlashes, ни mysql_real_escape_string не пропускают символ. – Steven

+0

Используйте ту же кодировку символов на стороне клиента, что и таблица. – nos

+0

Он использует тот же chr. кодирование. Таблица UTF8, и я даже могу попробовать utf8_encode() на входе без всякой удачи. – Steven

0

Я смотрю на эту линию

mysql_query("SET NAMES 'utf8'; COLLATE='utf8_danish_ci';"); 

, и я думаю, что это может быть ошибка. С ';' вы отправляете два запроса на сервер, но COLLATE - это предложение, а не юридическое заявление самостоятельно. Попробуйте:

mysql_query("SET NAMES 'utf8' COLLATE 'utf8_danish_ci'"); 

Если предложение COLLATE не принимаются сервером, вы можете быть с проблемой вашей колонки этикетки, имеющей danish_ci сверки, но заявления, поступающие имеют по умолчанию (ВЕРЫ utf_general_ci) в. Нельзя совместить символы с акцентом, но шаблон работает, потому что представление для основных символов ascii одинаково.

+0

Привет, Стивен. ';' это не проблема. Думаю, я нашел решение. Не то, что я хочу, но он работает. Я буду использовать htmlentities для хранения значений и html_entity_decode при извлечении значений. – Steven

+0

* Я имел в виду Стива, а не Стивена :) – Steven

Смежные вопросы