这很有趣,我的意思是非常令人沮丧。
我通过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文件。
Non-working output Working output
这两者之间的唯一区别是$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();
}
答案 0 :(得分:1)
大规模叹息。问题是我的javascript,而不是PHP。我在我的api中测试了这个,在我的大型应用程序中,有几个东西会调用它。还有一个额外的ajax调用,我不知道(它在代码中被错误地留下)并且它没有发送任何数据,所以我在api中的测试脚本运行时没有数据,因此清空了数据库字段就在我写信之后。当然,直接将数据输入到脚本中的效果很好,因为两个调用都做了同样的事情。
不幸的是,当我删除我的php代码时,我使用了相同的文件名/位置。
更不幸的是mysqli
的成功让我更进一步,在我的脑海中凝固了这个问题与PDO有关。事实证明,它只是改变了最后响应的ajax调用。
因此,我希望在完成调试过程时学会不要拥有如此多的隧道视野。