【发布时间】:2014-02-21 23:30:39
【问题描述】:
我遇到了一个奇怪的问题,我以前从未遇到过准备好的语句。我正在使用内置的 PHP MySQLi 函数将数据插入数据库。
代码如下所示:
$mysqli = new mysqli("localhost", "user", "pass", "test");
$mysqli->set_charset('utf8');
$stmt = $mysqli->prepare("INSERT INTO `lines` (`description`) VALUES (?)");
$stmt->bind_param("s", $_POST['description']);
$stmt->execute();
在名为“description”的文本区域中,输入以下字符串:
爱丽丝喜欢鲍勃的猫。
请注意,撇号不是常规的 ' 类型,而是我从电子邮件中复制该行(在 OS X 的邮件应用程序中)得到的。
当文本区域作为表单的一部分提交时,存储在表中的字段中的值为:
爱丽丝喜欢鲍勃
其余的被切断。我已经尽我所能进行了调试,并且我知道以下内容是正确的:
- $_POST['description'] 变量的值在放入 bind_param 函数之前是正确的。
- 数据库表应该使用 UTF8(我尝试了 utf8_bin 和 utf8_unicode_ci 的排序规则,但似乎都不起作用)。
- 当我使用 phpMyAdmin 之类的工具输入相同的字符串时,它可以工作。
我最初认为这是一个编码问题,但第 (3) 点似乎与此相矛盾,所以我唯一剩下的就是我设置语句的方式有问题。
如果有人能提供一些启示,那将是最有帮助的。
【问题讨论】:
-
你的问题中没有证据可以让你责怪mysqli。只要您未能发布可以证明 mysqli 准备语句中存在错误的可重现测试用例,就可以使用这些标签标记您的问题。
-
我将问题标记为 MySQLi,因为它涉及 MySQLi。我从来没有说过这是 MySQLi 的错误,但是这个站点上有些人使用 MySQLi,并且可能以前遇到过它。也没有证据表明我的问题属于“HTML”领域,您一直坚持用它来标记它。这不是 HTML 问题。
-
嗯,这似乎是一个编码问题。检查源字符串的编码,然后相应地更改 SET NAMES 参数
标签: php mysqli prepared-statement