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