0

这很有趣,我的意思是令人难以置信的沮丧。

我通过 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();
}
4

1 回答 1

1

长叹一声。问题在于我的 javascript,而不是 php。我在我的 api 中对此进行了测试,在我有点大的应用程序中,有几件事会调用它。还有一个我不知道的额外 ajax 调用(它被错误留在代码中)并且它没有发送任何数据,所以我在 api 中的测试脚本在没有数据的情况下运行,因此清空了数据库字段在我写信之后。当然,将数据直接输入脚本效果很好,因为两个调用都在做同样的事情。

不幸的是,当我剥离我的 php 代码时,我使用了相同的文件名/位置。更不幸的是,它的成功让mysqli我走得更远,让我更加坚信问题出在 PDO 上。事实证明,它只是改变了最后响应的 ajax 调用。

因此,我希望在调试过程中学会了不要有太多的隧道视野。

于 2013-09-05T07:54:51.800 回答