使用 PDO 插入带有特殊字符的值

Posted

技术标签:

【中文标题】使用 PDO 插入带有特殊字符的值【英文标题】:Insert Values with special Characters using PDO 【发布时间】:2015-02-05 14:50:06 【问题描述】:

在“Renè”等名称中插入带有特殊字符的值时遇到问题。名称“Renè”在我的数据库中显示如下:“René”

我试图将数据库中的字段更改为“utf8_general_ci”,但这没有帮助,所以它可能在我的代码中。

该名称来自 JQuery Ajax 请求,我能够在被调用的 .php 文件中正确地回显该名称。

$fullname = $_POST['playersearch'];
echo "<div class='n_ok'><p>Inserted $fullname successfully (PlayerID is $id)</p></div>";

我使用 PDO 连接到我的数据库并指定了 UTF-8 字符集:

$db = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass,array('charset'=>'utf8'));
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

插入数据库发生在这里:

    $stmt = $db->prepare("INSERT INTO PlayerCards (playerName, buyPercentage) VALUES (?, ?)");
    $stmt->bindParam(1, $fullname);
    $stmt->bindParam(2, $buypercentage);

为什么它在我的 MySQL 数据库中看起来如此奇怪?

【问题讨论】:

使用array(PDO::MYSQL_ATTR_INIT_COMMAND =&gt; "SET NAMES utf8")代替array('charset'=&gt;'utf8') 这就是解决方案。谢谢! 不客气。您也可以删除问题。我不需要回答,除非你真的也想要我并结束问题,干杯 我想把它留在这里给有类似问题的其他人。我从一个 php 帮助页面处理了这个原始的 pdo 脚本,所以可能其他人也这样做了,并且有一天会想知道。 在DSN上设置有什么问题,比如mysql:host=$dbhost;dbname=$dbname;charset=utf8? 【参考方案1】:

按照说明书:

http://php.net/manual/en/ref.pdo-mysql.connection.php

它指定PDO中的字符集语法被用作:

$options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
);

另请阅读该页面上的警告:

警告 以下示例中的方法只能用于与 ASCII 共享相同低 7 位表示的字符集,例如 ISO-8859-1 和 UTF-8。使用具有不同表示形式的字符集(例如 UTF-16 或 Big5)的用户必须使用 PHP 5.3.6 及更高版本中提供的字符集选项。

因此,在你的情况下,通过改变

array('charset'=>'utf8')

array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")

如果您希望在连接后运行初始化命令;更多关于这在下面的 cmets 中。


正如菲尔在 cmets 中所说的那样; 连接后无需运行初始化命令。

使用mysql:host=$dbhost;dbname=$dbname;charset=utf8也可以使用。

第 4 个参数(选项数组)用于在连接上设置的特定驱动程序选项(通常是 PDO 属性)。

谢谢菲尔。

【讨论】:

在DSN中设置有什么问题?连接后无需运行初始化命令。 @Phil TBH Phil,我不知道并且很乐意将其添加到我的答案中,并引用您的评论。但是,charset=utf8 是否不等于 OP 使用的 'charset'=&gt;'utf8' 并失败了? 没有。 DSN 字符串用于连接。第 4 个参数(选项数组)用于在连接上设置的特定驱动程序选项(通常是 PDO 属性)。 @Phil 感谢 Phil 的补充信息,我已在我的回答中添加了这些信息,cheers

以上是关于使用 PDO 插入带有特殊字符的值的主要内容,如果未能解决你的问题,请参考以下文章

PHP / MySQL中的PDO和UTF-8特殊字符?

如何在 PHP“回声”中插入带有撇号和其他特殊字符的文本? [复制]

WCF Restful 和带有特殊字符的查询字符串

升级脚本需要更新带有特殊字符的值(换行单引号markdown文本)到字段中,如何兼容性更好

带有特殊字符和数据库的java程序

pdo 在字符串连接中准备