Надстрочный знак в 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?
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. Удачи!