Надстрочный знак в PHP, вызывающий запрос MySQLi select для поиска 0 строк


Я использую PHP 5.3.3 и MySQL 5.1.61. В рассматриваемом столбце используется кодировка UTF-8, а файл PHP кодируется в UTF-8 без спецификации.

При выполнении запроса MySQLi с 2 символами в SQLyog в Windows запрос выполняется правильно и отображается правильный результат поиска.

Если я сделаю тот же самый точный запрос на PHP, он будет выполнен, но покажет 0 affected_rows.

Вот что я попробовал:

  • Используя оба типа вместо =
  • Изменение кодировка PHP-файла в ANSI, UTF-8 без спецификации и UTF-8
  • Выполнение "УСТАНОВИТЬ ИМЕНА utf-8" и "latin1" перед выполнением запроса
  • Заголовок Did ('Тип содержимого: текст/html; кодировка=UTF-8'); в PHP
  • Побег с помощью MYSQLI::real_escape_string
  • Выполнение filter_var($строка, FILTER_SANITIZE_STRING)
  • Попробовал привязку MySQLi stmt

Единственный способ, которым я мог бы заставить его работать должным образом, - это если бы я поменял 2 на % и изменил = на КАК в PHP.

Как я могу правильно выполнить запрос на PHP при использовании 2?

Author: Sawtaytoes, 2012-09-05

1 answers

Вы должны быть в состоянии заставить запрос работать, обеспечив следующее:

Подготовка PHP для UTF-8

Сначала вам нужно убедиться, что страницы PHP, которые будут выдавать эти запросы, обслуживаются как страницы в кодировке UTF-8. Это обеспечит правильное отображение любых выходных данных UTF-8, поступающих из базы данных. В Firefox вы можете проверить, так ли это, посетив интересующую вас страницу и используя пункт меню Просмотреть информацию о странице. Когда вы это сделаете, вы должны увидеть UTF-8 в качестве значения для кодировки страницы . Если страница не отображается в формате UTF-8, вы можете сделать это одним из двух способов. Либо вы можете установить кодировку в вызове на header(), например:

header('Content-Type: text/html; charset=UTF-8');

Или вы можете использовать тег meta в блоке head вашей страницы:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

Подготовка MySQL для UTF-8

Далее вам нужно убедиться, что база данных настроена на использование кодировки UTF-8. Это может быть задано на сервере, в базе данных, таблице или столбце уровни. Если вы находитесь на общем хосте, вы, вероятно, можете управлять только уровнями таблиц и столбцов своей иерархии. Если у вас есть контроль над сервером или базой данных, вы можете проверить, какую кодировку символов они используют, выполнив следующие две команды:

SHOW VARIABLES LIKE 'character_set_system';
SHOW VARIABLES LIKE 'character_set_database';

Изменение кодировки уровня базы данных может быть выполнено с помощью команды, подобной этой:

(CREATE | ALTER) DATABASE ... DEFAULT CHARACTER SET utf8;

Чтобы увидеть, какую кодировку символов использует таблица, просто выполните:

SHOW CREATE TABLE myTable;

Аналогично, вот как изменить уровень таблицы кодировка:

(CREATE | ALTER) TABLE ... DEFAULT CHARACTER SET utf8;

Я рекомендую установить кодировку как можно выше в иерархии. Таким образом, вам не нужно помнить о том, чтобы вручную настроить его для новых таблиц. Теперь, если ваша кодировка символов для таблицы еще не установлена в UTF-8, вы можете попытаться преобразовать ее с помощью оператора alter следующим образом:

ALTER TABLE ... CONVERT TO CHARACTER SET utf8;

Будьте очень осторожны при использовании этого оператора! Если в ваших таблицах уже есть значения UTF-8, они могут быть повреждены при попытке преобразовать. Однако есть несколько способов обойти это .

Принуждение MySQLi использовать UTF-8

Наконец, перед подключением к базе данных убедитесь, что вы выполнили соответствующий вызов, чтобы сообщить, что вы используете кодировку UTF-8. Вот как:

$db = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);

// Change the character set to UTF-8 (have to do it early)
if(! $db->set_charset("utf8"))
{
    printf("Error loading character set utf8: %sn", $db->error);
}

Как только вы это сделаете, все, надеюсь, будет работать так, как ожидалось. Единственные символы, о кодировке которых вам нужно беспокоиться, - это большая пятерка для HTML: <, >, ', ", and &. Вы можете справиться с этим, используя htmlspecialchars() функция.

Если вы хотите прочитать больше (и получить ссылки на дополнительные ресурсы), не стесняйтесь ознакомиться со статьями, которые я написал об этом процессе. Есть две части: Юникод и Веб: Часть 1 и Юникод и Веб: Часть 2. Удачи!

 3
Author: Jonah Bishop, 2012-09-05 14:11:01