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 没有此类文件或目录错误? [复制]

SQLSTATE[HY000] [2002] 操作超时

SQLSTATE[HY000] [2002] 权限被拒绝 Laravel PDO 驱动程序(凭证通过工匠迁移工作)