【问题标题】:PHP PDO is saving string from javascript object (ajax) as empty fieldPHP PDO 将来自 javascript 对象(ajax)的字符串保存为空字段
【发布时间】:2013-09-05 04:34:04
【问题描述】:

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

我正在通过 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-&gt;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();
}

【问题讨论】:

  • 当时我真的不会让执行在捕获PDOException 之后继续。最好让那个坏男孩不被抓到,然后再追上它。此外,将$params=false 更改为$params=array() 意味着您不需要检查它,只需运行$stmt-&gt;execute($params)
  • 没有。我不是电脑,而是人。打算运行的代码没有被读取。我可以从问题的陈述中看出一个错字。不将某些内容保存在数据库中的 PDO 是无稽之谈。所以,只有一个愚蠢的错字仍然是一个原因。
  • 是的。某种错字或类似的错误。你做了很多正确的事情来调查这个问题,但你仍然需要更多。更清晰的测试用例,更多的proofcode。如果我是你,我会在与 PDO 内容相同的文件中编写带有证明代码的 mysqli 内容,运行它,然后将整个代码与输出一起发布。但是要继续,您需要了解这肯定不是 PDO 的错,而是您的错。使用 PDO 的人太多了,但没有人遇到这样的问题。
  • 再一次,您如何验证确实发生了错误?从内存中,MySQL 将为不进行任何更改的 UPDATE 语句返回行计数为零,因此您不能依赖PDOStatement::rowCount。您需要在运行 SELECT 查询的数据库中(最好通过控制台) 以验证结果。
  • @Phil,很抱歉浪费了您的时间 :( 我确实在这个过程中学到了很多东西,非常感谢您对我的态度。

标签: php mysql ajax json pdo


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-21
    • 2017-04-14
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多