PHP,MySQL,PDO - 从UPDATE查询中获取结果?

时间:2016-06-06 23:37:08

标签: php mysql pdo

我正在更新表格中的一行,并按照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]:常规错误

根据this SO answer,这似乎是$stmt->fetchAll()所致。如果我将该行删除,则该行将被适当更新。

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

编辑1

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

表架构

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

该计数对我来说没有任何意义,因为查询已将LIMIT 1硬编码到其中。

该行的全部内容

count($stmt->fetchAll());

是通过/失败条件。

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

编辑2

显然,这个问题很容易解决两个单独的查询。我希望在一个查询中有这个。既有偏好,也有学习的机会。

3 个答案:

答案 0 :(得分:3)

关于获取connect的异常SQLSTATE [HY000]

你是对的

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

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

查看此示例。

$stmt->rowCount();

答案 1 :(得分:2)

您需要将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();
}

答案 2 :(得分:1)

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

您想要做什么,请查看PDO::rowCount()。这将返回查询影响的行数。

echo $stmt->rowCount();

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