PHP MySQLi准备语句用“非标准”字符修剪字符串?

时间:2014-02-21 23:30:39

标签: php mysqli prepared-statement

我遇到了一个奇怪的问题,我以前从未遇到过准备好的陈述。我正在使用内置的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'的textarea中,输入以下字符串:

  

爱丽丝喜欢鲍勃的猫。

请注意,撇号不是常规'类型,而是我从电子邮件中复制该行所得到的(在OS X的邮件应用程序中)。

当textarea作为表单的一部分提交时,存储在表中字段中的值为:

  

爱丽丝喜欢鲍勃

其余的被切断了。我已尽可能多地调试,我知道以下情况属实:

  1. $ _POST ['description']变量的值在放入bind_param函数之前是正确的。
  2. 数据库表应该使用UTF8(我已经尝试过utf8_bin和utf8_unicode_ci的排序规则,但似乎都不起作用)。
  3. 当我使用类似phpMyAdmin的东西输入相同的字符串时,它可以正常工作。
  4. 我原本以为这是一个编码问题,但是第(3)点似乎与此相矛盾,所以我唯一留下的就是我设置语句的方式有问题。

    如果有人能说出一些亮点,那将是最有帮助的。

2 个答案:

答案 0 :(得分:0)

事实证明它与我最初怀疑的编码相关。 this question中的最佳答案解决了这个问题,但是我仍然无法解释为什么不仅仅错误地显示字符(或者错误地存储它),字符串在那时被切断了。如果有人对为什么会发生这种情况有实际答案,那么如果仅出于学术原因,我们将非常感激!

答案 1 :(得分:-3)

在插入

之前,您需要转义字符串
<?php
$str = "Is your name O'reilly?";

// Outputs: Is your name O\'reilly?
echo addslashes($str);
?>

从PHP文档中获取的示例。

您可能还需要考虑安全性 - 将后期数据插入SQL而不进行验证绝不是一个好主意。