PHP, MySQL, PDO - Get result from UPDATE query?

2020-04-01 08:14发布

I am updating a row in a table, and trying to return the updated row, as per this SO answer.

My code is the following:

$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();
}

But I always get the following error

SQLSTATE[HY000]: General error

Which seems to be due to the $stmt->fetchAll(), according to this SO answer. If I take that line out, the row is updated appropriately.

So, how do I run the multi-query statement (multi-statement query!?) using PDO, and obtain the results from the SELECT?

EDIT 1

I DO NOT need the count of the rows updated. I need the actual ID of the row.

Table Schema

  id   |   someCol  |  status
 ----- |   -------  |  ------
   1   |     123    |    0
   2   |     456    |    0
   3   |     789    |    0
   4   |     012    |    0
  • Look at the table,
  • find the first status=0,
  • update the row,
  • return the id of the row that was updated

The count is of zero interest to me, as the query has LIMIT 1 hard-coded into it.

The whole point of the line

count($stmt->fetchAll());

Is a pass/fail condition.

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

EDIT 2

Obviously this issue is simple to get around with two separate queries. I would prefer to have this in one single query. Both a preference, as well as an opportunity to learn.

标签: php mysql pdo
3条回答
▲ chillily
2楼-- · 2020-04-01 08:30

You're right about getting the exception SQLSTATE[HY000] for $stmt->rowCount();

The problem is, you cannot fetch an UPDATE query because these queries simply don't return values. To circumvent this, use rowCount().

As written in the PHP documentation, PDOStatement::rowCount() returns the number of rows affected by a DELETE, INSERT, or UPDATE statement.

Check out this example.

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

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

?>
查看更多
一夜七次
3楼-- · 2020-04-01 08:42

You need to do the SELECT @update_id as a separate query -- you can't put multiple queries in a single statement. So do:

$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();
}
查看更多
ゆ 、 Hurt°
4楼-- · 2020-04-01 08:45

It's failing on ->fetchAll() because an UPDATE query does not return any rows/data.

What you want to do, is check out PDO::rowCount(). This returns the count of how many rows have been affected by your query.

echo $stmt->rowCount();

This was posted assuming you're trying to check if your query was successful.

查看更多
登录 后发表回答