这很有趣,我的意思是令人难以置信的沮丧。
我通过 ajax 调用将此数据传递给我的 php 文件:{"html":"<div>I'm a div!!</div>"}
我想通过说我确实理解不将 json 保存到数据库的原因来作为下一个陈述的序言,但它在这里确实有用。
当我将此数据保存到数据库字段时,该字段为空。现在看到这个:
$in1 = file_get_contents('php://input'); //from ajax
var_dump($in1);
$in2 = '{"html":"<div>I\'m a div!!</div>"}';
var_dump($in2);
我的 ajax 调用的价值:
string(33) "{"html":"<div>I'm a div!!</div>"}"
string(33) "{"html":"<div>I'm a div!!</div>"}"
完全一样!然而,$in2
将保存到数据库就好了!!虽然$in1
产生一个空字段!
可以肯定的是,考虑一下:
if ($in1 === $in2) { echo "They're equal!"; }
想一想……它们完全相等,但一个会正确保存,另一个不会。惊人。
此外:mysqli
不存在此问题,因此将其缩小为 PDO 问题。
$query = "UPDATE plugin_instances SET config=(?) WHERE id=2";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("s", $in1);
$stmt->execute(); //correct value in the db!!
我现在已经删除了所有内容,这是整个 php 文件。
这两者之间的唯一区别是结果$stmt->rowCount()
。正确更新字段的样本说int(0)
和清空它的样本int(1)
。
$db = new PDO('mysql:host=localhost;dbname=disarray', 'root', 'temp');
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
var_dump($db);
$params = [':foo'=>'{"html":"<div>I\'m a div!!</div>"}'];
var_dump($params);
$params = [':foo'=>file_get_contents('php://input')];
var_dump($params);
$query = "UPDATE plugin_instances SET config=:foo WHERE id=2";
var_dump($query);
try {
$stmt = $db->prepare($query);
var_dump($stmt);
$stmt->execute($params);
var_dump($stmt);
var_dump($stmt->rowCount());
}
catch (PDOException $e) {
echo $e->getMessage();
}