使用 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 => "SET NAMES utf8")
代替array('charset'=>'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'=>'utf8'
并失败了?
没有。 DSN 字符串用于连接。第 4 个参数(选项数组)用于在连接上设置的特定驱动程序选项(通常是 PDO 属性)。
@Phil 感谢 Phil 的补充信息,我已在我的回答中添加了这些信息,cheers以上是关于使用 PDO 插入带有特殊字符的值的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PHP“回声”中插入带有撇号和其他特殊字符的文本? [复制]