我正在更新表格中的一行,并按照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
该计数对我来说没有任何意义,因为查询已将LIMIT 1
硬编码到其中。
该行的全部内容
count($stmt->fetchAll());
是通过/失败条件。
if(count ==1){
... do something with the returned id ...
}else{
... do something else ...
}
编辑2
显然,这个问题很容易解决两个单独的查询。我希望在一个查询中有这个。既有偏好,也有学习的机会。
答案 0 :(得分:3)
关于获取connect
的异常SQLSTATE [HY000]
问题是,您无法获取UPDATE查询,因为这些查询根本不会返回值。要避免这种情况,请使用rowCount()。
查看此示例。
$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();
这是在您尝试检查查询是否成功的情况下发布的。