MySQL SELECT на арабском Word возвращает 0 результатов на PHP, но на SQLBuddy / phpMyAdmin

проблема

Я получаю 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";
}
}

?>

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

  1. Кодирование. Я установил кодировку страницы на utf-8 с помощью header('Content-Type:
    text/html; charset=utf-8');
    и выполнил запросы mysqli_query($conn,"SET NAMES 'utf8'"); а также mysqli_query($conn,'SET CHARACTER SET utf8');это прояснило ??????? а также Ùؤتا
    вынесено вместо арабских слов вопрос. Это своего рода другой
    вопрос. Источник. а также Source2.
  2. База данных Charset. Моя база данных и столбцы установлены в UTF-8.

  3. Другие клиенты работают. 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 '&#1570;&#1582;&#1614;&#1585;&#1548; &#1571;&#1615;&#1582;&#1585;&#1609;' Я думаю, что это имитирует 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

Входы будут с благодарностью.

0

Решение

Используйте html_entity_decode ():

Используйте 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";
}
}

?>
2

Другие решения

Других решений пока нет …