PDO 错误:“SQLSTATE[HY000]: General error” 更新数据库时
Posted
技术标签:
【中文标题】PDO 错误:“SQLSTATE[HY000]: General error” 更新数据库时【英文标题】:PDO error: " SQLSTATE[HY000]: General error " When updating database 【发布时间】:2012-10-10 09:05:09 【问题描述】:使用 PDO 更新数据库时出现错误。 我是 PDO 的新手,所以问题可能很小,我只是不明白。 这个错误的有趣之处在于,该命令运行良好,并且数据库确实得到了更新。 但它仍然向我返回一个错误。
代码:
try
$stmt = $pdo->prepare("UPDATE $page SET $section = :new_content WHERE $section = '$old_content'");
$stmt->execute(array(
'new_content' => $new_content
));
$result = $stmt->fetchAll();
echo "Database updated!";
catch(PDOException $e)
echo 'ERROR UPDATING CONTENT: ' . $e->getMessage();
错误: 错误更新内容:SQLSTATE[HY000]:一般错误
我真的不知道问题可能出在哪里,因为它非常模糊,而且我无法找到有同样问题的人。
【问题讨论】:
您很容易受到 SQL 注入的影响,即使您(部分/不正确地)使用准备好的语句和占位符。仅仅因为您是提供插入数据的人并不意味着您不能自己注入。 你指的是变量 $page 和 $section 吗?它们都取自 html 元素的固定 ID。所以你是说即使它们也可能有害?$old_content
对我来说是一个大红旗。 ANY 进入查询字符串的动态数据可能是有害的。仅仅因为您将其从数据库中取出并不意味着它是安全的。例如考虑像@987654323@ 这样的东西。您转义了新更新的名称,但从数据库中提取了原始名称,现在您已经为自己注入了一个语法错误。
嗯,好的。我从来没想过这点。谢谢马克。
您正在尝试获取 UPDATE 查询
【参考方案1】:
你不使用 fetchAll(),就像在
$result = $stmt->fetchAll();
带有更新或插入查询。删除此语句应该可以解决问题。
【讨论】:
如果不是这样,那么执行更新查询的正确方法是什么? @deeperDATA,只要执行语句就足够了。只有选择查询才需要调用 fetchAll()。 我建议正确的方法是update()。尝试使用它来更新您的表格【参考方案2】:请注意,此错误的另一个可能原因是,如果您在现有父 $stmt 循环内使用变量 $stmt 进行第二次数据库调用。
$stmt = $conn->query($sql);
while ($row = $stmt->fetch()) //second use of $stmt here inside loop
【讨论】:
这是我的问题,显然 PDO 不喜欢被重置的变量。 @MattCavanagh 你介意分享一下你是如何解决这个问题的吗?我现在遇到了... 我很傻,但我才意识到我在循环中使用了相同的变量名$stmt
。我已经使它独一无二了 $stmt_delete
并且它有效。
是的,这也是我遇到的问题。
@candlejack 在循环内使用与 $stmt 不同的变量以上是关于PDO 错误:“SQLSTATE[HY000]: General error” 更新数据库时的主要内容,如果未能解决你的问题,请参考以下文章
使用 PDO 连接到远程 MYSQL 服务器,导致相同的错误 SQLSTATE[HY000] [2002] [重复]
PHP/PDO 错误:SQLSTATE[HY000] 无法连接:Adaptive Server 不可用或不存在(严重性 9)
SQLSTATE[HY000] [2002] 资源暂时不可用 - mysql - innodb 和 pdo
什么会导致间歇性 SQLSTATE[HY000] [2002] Debian Lenny 上的 php PDO mysql 没有此类文件或目录错误? [复制]