【问题标题】:PDO error: " SQLSTATE[HY000]: General error " When updating databasePDO 错误:“SQLSTATE[HY000]: General error” 更新数据库时
【发布时间】: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 查询

标签: php pdo


【解决方案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 不同的变量
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2013-06-20
  • 1970-01-01
  • 2021-01-09
  • 2017-06-17
  • 1970-01-01
相关资源
最近更新 更多