【问题标题】:PHP, MySQL, PDO - Get result from UPDATE query?PHP、MySQL、PDO - 从 UPDATE 查询中获取结果?
【发布时间】:2016-10-06 17:00:53
【问题描述】:

我正在更新表中的一行,并尝试根据this SO answer 返回更新后的行。

我的代码如下:

$sql = "SET @update_id := '';
        UPDATE testing SET status='1', id=(SELECT @update_id:=id)
        WHERE status='0' LIMIT 1; 
        SELECT @update_id;";

$db->beginTransaction();
try{
    $stmt = $db->prepare($sql);
    $stmt->execute();

    echo count($stmt->fetchAll());

    $db->commit();
}catch(Exception $e){
    echo $e->getMessage();
    exit();
}

但我总是收到以下错误

SQLSTATE[HY000]:一般错误

这似乎是由于$stmt->fetchAll(),根据this SO answer。如果我把那条线去掉,那行就会适当地更新。

那么,如何使用 PDO 运行多查询语句(多语句查询!?),并从SELECT 获取结果?

编辑 1

需要更新行的计数。我需要行的实际 ID

表架构

  id   |   someCol  |  status
 ----- |   -------  |  ------
   1   |     123    |    0
   2   |     456    |    0
   3   |     789    |    0
   4   |     012    |    0
  • 看表,
  • 找到第一个status=0,
  • 更新行,
  • 返回更新行的id

我对计数的兴趣为零,因为查询已将LIMIT 1 硬编码到其中。

线的整个点

count($stmt->fetchAll());

是通过/失败条件。

if(count ==1){
    ... do something with the returned id ...
}else{
    ... do something else ...
}

编辑 2

显然,这个问题很容易通过两个单独的查询来解决。我宁愿在一个查询中使用它。既是偏好,也是学习的机会。

【问题讨论】:

  • 您是否在此处尝试检查您的查询是否成功?
  • 如果你总是用LIMIT 1$stmt->execute() 更新一行,那么尝试获取更新行的计数有什么意义呢?@ 987654331@ 将返回操作的真或假。
  • @Fred-ii- 在问题的第一句话中,“......并试图返回更新的行......”。
  • @TheDrot t如果计数为 1,那么将有一个结果要读取,我可以继续使用该代码。如果计数为零,则没有结果,它可以停在那里。
  • 答案在下面,看一看;-)

标签: php mysql pdo


【解决方案1】:

->fetchAll() 失败,因为 UPDATE 查询不返回任何行/数据。

您想要做的是查看PDO::rowCount()。这将返回受您的查询影响的行数。

echo $stmt->rowCount();

这是在您尝试检查您的查询是否成功时发布的。

【讨论】:

  • 查看已编辑的问题。我不关心计数,问题中也没有说明。
  • @Birrel 看看 Barmar 的回答。
【解决方案2】:

对于$stmt->rowCount(); 获取异常 SQLSTATE[HY000] 是对的

问题是,您无法获取 UPDATE 查询,因为这些查询根本不返回值。要避免这种情况,请使用 rowCount()。

如 PHP 文档中所述,PDOStatement::rowCount() returns the number of rows affected by a DELETE, INSERT, or UPDATE statement.

看看这个例子。

<?php
/* Updating rows from the PICNIC table*/
$update = $dbh->prepare('UPDATE ... PICNIC');
$update->execute();

/* Return the number of rows affected */
   echo $updateCount = $update->rowCount();

?>

【讨论】:

  • 刚刚注意到您已将 Limit 设置为 1。您是否打算验证更新查询是否通过?
  • 查看已编辑的问题。我不关心计数,问题中也没有说明。
【解决方案3】:

您需要将SELECT @update_id 作为单独的查询执行——您不能将多个查询放在一个语句中。这样做:

$sql = "SET @update_id := '';
        UPDATE testing SET status='1', id=(SELECT @update_id:=id)
        WHERE status='0' LIMIT 1";
try{
    $db->beginTransaction();
    $db->query($sql); // no need for prepare/execute since there are no parameters
    $stmt = $db->query("SELECT @update_id");
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    $id = $row['@update_id'];
    $db->commit();
} catch (Exception $e) {
    echo $e->getMessage();
    $db->rollBack();
    exit();
}

【讨论】:

  • 如果是“无法完成”的场景,由于 PDO 的限制,那么两个查询就足够了。非常感谢。
  • @Birrel 只有 mysqli 有一种方法可以在一次调用中进行多个查询,mysqli_multi_query。但它是一个 PITA,我从未见过使用它的令人信服的论据。
  • 请记住,如果这是另一个事务的一部分,这将不起作用。 MySQL 不支持嵌套事务。
  • @AlxVallejo 对于任何创建事务的代码都是如此,它并不特定于此。他的原始代码有事务,问题只是关于如何执行两条语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
  • 2015-01-29
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 2018-03-13
相关资源
最近更新 更多