проблема
Я получаю 0 результатов при поиске арабского слова в базе данных MySQL с помощью SELECT
запрос с PHP.
Однако тот же точный запрос дает результаты в альтернативных клиентах, а именно в SQLBuddy и подобных. Все закодировано в UTF-8.
Код
<?php
$host = "localhost";
$username = "hans_wehr_client";
// i know my security is a joke :)
$password = "hans_wehr";
$database = "hans_wehr";
$conn = new mysqli($host, $username, $password, $database);
if ($conn == TRUE){
$search = $_GET["search"];
$encoded_search = utf8_encode($search);
echo $encoded_search."<br>";
header('Content-Type: text/html; charset=utf-8');
$sql = "SELECT * FROM dictionary WHERE ARABIC LIKE '$search'";
echo $sql."<br>";
mysqli_query($conn,"SET NAMES 'utf8'");
mysqli_query($conn,'SET CHARACTER SET utf8');
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
// output data of each row
while($row = mysqli_fetch_assoc($result)) {
header('Content-Type: text/html; charset=utf-8');
echo $row["ARABIC"]. " - Meaning: " . $row["ENGLISH1"]. " " . $row["ENGLISH2"]. "<br>";
}
}else {
echo "0 results";
}
}
?>
Прежде чем моды получат вилы, я должен разобраться в логике устранения неполадок.
utf-8
с помощью header('Content-Type:
text/html; charset=utf-8');
и выполнил запросы mysqli_query($conn,"SET NAMES 'utf8'");
а также mysqli_query($conn,'SET CHARACTER SET utf8');
это прояснило ???????
а также Ùؤتا
База данных Charset. Моя база данных и столбцы установлены в UTF-8.
Другие клиенты работают. SQLBuddy / MySQL native client / PHPMyAdmin работают, потому что выполнение одного и того же точного запроса дает результат. Поэтому я, кажется, на одной кровавой лодке с ему. Запрос SELECT * FROM dictionary WHERE ARABIC LIKE 'آخَر، أُخرى'
возвращает результат на SQLbuddy, но не на PHP.
Возможное решение:
Выполнение запроса SELECT * FROM dictionary WHERE ARABIC LIKE 'آخَر، أُخرى'
дает мне результат.
Однако выполнение запроса с UTF-8, закодированная версия арабского слова возвращает 0 результатов. SELECT * FROM dictionary WHERE ARABIC LIKE 'آخَر، أُخرى'
Я думаю, что это имитирует PHP.
UTF-8, Версия арабского слова получается путем декодирования автоматически закодированного URL-адреса $ [_ GET] параметра, т.е. %26%231570%3B%26%231582%3B%26%231614%3B%26%231585%3B%26%231548%3B+%26%231571%3B%26%231615%3B%26%231582%3B%26%231585%3B%26%231609%3B
Может ли быть так, что MySQLi на самом деле запрашивает UTF-8 version
вместо настоящего арабского слова? Поэтому не нашли соответствия, так как они разные?
Если так, как я могу явно сказать PHP не URL кодировать мой критерий поиска и, следовательно, передать его как есть?
Так как согласно моей теории о фольге, http://localhost/hans_wehr/search_ar.php?search=آخَر، أُخرى
будет работать, но http://localhost/hans_wehr/search_ar.php?search=%26%231570%3B%26%231582%3B%26%231614%3B%26%231585%3B%26%231548%3B+%26%231571%3B%26%231615%3B%26%231582%3B%26%231585%3B%26%231609%3B
Входы будут с благодарностью.
Используйте html_entity_decode () для вашего значения $ _GET [«search»]
<?php
$host = "localhost";
$username = "hans_wehr_client";
// i know my security is a joke :)
$password = "hans_wehr";
$database = "hans_wehr";
$conn = new mysqli($host, $username, $password, $database);
if ($conn == TRUE){
$search = $_GET["search"];
$encoded_search =html_entity_decode($search, ENT_COMPAT, 'UTF-8');
echo $encoded_search."<br>";
header('Content-Type: text/html; charset=utf-8');
$sql = "SELECT * FROM dictionary WHERE ARABIC LIKE '$encoded_search'";
echo $sql."<br>";
mysqli_query($conn,"SET NAMES 'utf8'");
mysqli_query($conn,'SET CHARACTER SET utf8');
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
// output data of each row
while($row = mysqli_fetch_assoc($result)) {
header('Content-Type: text/html; charset=utf-8');
echo $row["ARABIC"]. " - Meaning: " . $row["ENGLISH1"]. " " . $row["ENGLISH2"]. "<br>";
}
}else {
echo "0 results";
}
}
?>
Других решений пока нет …