【问题标题】:Special Characters into MySQL using PHP使用 PHP 将特殊字符导入 MySQL
【发布时间】:2019-11-11 14:28:26
【问题描述】:

我在我的数据库中设置了一个表来从包含特殊字符的 json 文件中加载记录。我正在使用以下 PHP 代码上传记录。

<!DOCTYPE html>
<html>
<head>
    <title>Insert Records</title>
</head>

<body>
<h1>Insert OER Records from JSON File</h1>

<h2>Outputs:</h2>

<?php

ini_set('memory_limit','2000M');

$url = 'path/filename.json';
$contents = file_get_contents($url);
$contents = utf8_encode($contents);
$results = json_decode($contents, true);

include 'connection.php'; 
// Counter for number of records (x)
$x = 0;

foreach($results as $key => $value) {
    $x = $x + 1;    

    foreach($value as $k => $v) {

            $type = $value['type'];
            $title = $value['title'];
            $title = str_replace("'", "\'", $title);
            $title = str_replace("(", "\(", $title);
            $title = str_replace(")", "\)", $title);
            $author = $value['author'];
            $author = str_replace("'", "\'", $author);
            $author = str_replace("(", "\(", $author);
            $author = str_replace(")", "\)", $author);
            $link = $value['link'];
            $source = $value['source'];
            $source = str_replace("'", "\'", $source);
            $source = str_replace("(", "\(", $source);
            $source = str_replace(")", "\)", $source);
            $description = str_replace("'", "\'", $description);
            $description = str_replace("(", "\(", $description);
            $description = str_replace(")", "\)", $description);
            $description = $value['description'];
            $base_url = $value['base_url'];
            $isbn_number = $value['isbn_number'];
            $e_isbn_number = $value['e_isbn_number'];
            $publication_date = $value['publication_date'];
            $license = $value['license'];
            $subject = $value['subject'];
            $image_url = $value['image_url'];
            $review = $value['review'];
            $language = $value['language'];
            $loc_collection = $value['loc_collection'];
            $license_url = $value['image_url'];
    }

    $sql = "INSERT INTO oer_search (type, title, author, link, source, description, base_url, isbn_number, e_isbn_number, publication_date, license, subject, image_url, review, language, license_url) VALUES ('$type', '$title', '$author', '$link', '$source', '$description', '$base_url', '$isbn_number', '$e_isbn_number', '$publication_date', '$license', '$subject', '$image_url', '$review', '$language', '$license_url')";


    if (mysqli_query($conn, $sql)) {

    } else {
        echo "Error: " . $sql . "<br>" . mysqli_error($conn);
    }

}

echo "This many records were entered into the database: " . $x;
    mysqli_close($conn);

?>
<br/><br/><br/><br/><br/>

</body>
</html>

我的数据库设置为 utf8_general_ci。但是,带有特殊字符的记录无法正确显示。我得到这样的结果MuhÌ£ammad Kurd Ê»AliÌ。有什么我遗漏的吗?

【问题讨论】:

标签: php mysql


【解决方案1】:

您没有正确使用 mysqli。 (不是你的错,因为 PHP 手册解释得不够清楚)

要打开与 mysqli 的连接,您至少必须执行以下操作:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // enable error reporting
$conn = new mysqli($servername, $username, $password, $dbname);
$conn->set_charset('utf8');

set_charset() 方法确保发送到 DB 的数据使用正确的字符集。没有它,数据可能会被破坏。

您还必须使用此行启用正确的 mysqli 错误报告:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

如果没有它,您将需要使用mysqli_error($conn) 来检查错误,如果滥用,可能会将敏感信息泄露给用户。

不要使用utf8_encode()。大多数时候你不需要这个功能。除非您真的知道自己在做什么,否则请摆脱它。

警告:
utf8_general_ci 是一个非常古老且过时的字符集。如果您使用 MySQL 5.5.3 或更高版本或 MariaDB,您应该使用 utf8mb4 字符集。见What is the difference between utf8mb4 and utf8 charsets in MySQL?

【讨论】:

  • 这有助于让记录正确加载到数据库中,但现在我遇到了它们在我的网站上的显示方式的问题。这是一个例子Tat?wi?r al-ta?li?m al-s?ina??i? fi? al-?Ira?q。我将元标记设置为 UTF-8。
  • 您是否阅读了我在 cmets 中您的问题下链接的文章?
  • 知道了!我忘记在我的配置文件中将charset=utf8 添加到我的 PDO 连接中。感谢@Dharman 的帮助!
【解决方案2】:

您必须在文件中使用相同的编码。

您的数据库已在 utf8 中创建,您的 php 文件已在您的 php 文件 crud 中使用此代码。

    mysqli_query("SET NAMES 'utf8'");
    mysqli_query('SET character_set_connection=utf8');
    mysqli_query('SET character_set_client=utf8');
    mysqli_query('SET character_set_results=utf8');

【讨论】:

    猜你喜欢
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多