PHP PDO将javascript对象(ajax)中的字符串保存为空字段

时间:2013-09-05 04:34:05

标签: php mysql ajax json pdo

这很有趣,我的意思是非常令人沮丧。

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

1 个答案:

答案 0 :(得分:1)

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

不幸的是,当我删除我的php代码时,我使用了相同的文件名/位置。 更不幸的是mysqli的成功让我更进一步,在我的脑海中凝固了这个问题与PDO有关。事实证明,它只是改变了最后响应的ajax调用。

因此,我希望在完成调试过程时学会不要拥有如此多的隧道视野。