php - 阿拉伯语单词上的 MySQL SELECT 在 PHP 上返回 0 结果,但在 SQLBuddy/phpMyAdmin 上返回 0 结果

标签 php mysql utf-8 arabic-support

问题

当我使用 SELECT 在 MySQL 数据库中搜索阿拉伯语单词时,得到 0 个结果用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'); ,这清除了 ???????Ùؤتا 渲染而不是阿拉伯文字问题。这是一种不同的 问题。 Source.Source2.
  2. 数据库字符集。我的数据库和列设置为 UTF-8。

  3. 其他客户端工作。 SQLBuddy/MySQL native 客户端/PHPMyAdmin 似乎工作正常,因为运行完全相同的查询会产生结果。因此,我似乎与him.在同一条血腥的船上。查询SELECT * FROM dictionary WHERE ARABIC LIKE 'آخَر، أُخرى'在 SQLbuddy 上返回结果,但在 PHP 上返回 nada。

可能的解决方案:

运行查询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

我们将不胜感激。

最佳答案

使用 html_entity_decode():

对 $_GET["search"] 值使用 html_entity_decode()

<?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";
    }
}

?>

关于php - 阿拉伯语单词上的 MySQL SELECT 在 PHP 上返回 0 结果,但在 SQLBuddy/phpMyAdmin 上返回 0 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37477377/

相关文章:

mysql - 对单个插入进行多个 MySQL 查询

PHP/MySQL/GWT 合并字符串序列,不重复排列

c++ - 将字符串从 UTF-8 转换为 ISO-8859-1

导入时的postgresql和排序规则问题

php - 在两个单独的表查询之间切换 PHP MySQL

php - 每个用户一个 session ,新登录时断开旧 session 吗?

MySQL 在单个资源 ID 上连接 3 个表

iphone - 在 iPhone 中使用 UTF-8 进行编码和解码

php - Uncaught Error : Call to undefined function mysql_select_db()

来自 MySQL 的 PHP 图像表