33

我找到了很多方法来使用 PDO 的 exec 语句,但我不确定它是否对我有帮助。我的理解是我必须对准备好的语句使用 execute() 函数。我正在使用来自用户输入的数据更新一行,因此我想使用准备好的语句而不是 query() 调用。

我的代码如下:

$dbh = buildDBConnector(); 
$sql = "UPDATE tb_users 
    SET authState=1
    WHERE id = ? AND authPass = ?";
$q = $dbh->prepare($sql);
$f = $q->execute(array($id,$authPass));
if($f){
    echo '<br />Success<br />';
}else{
    echo '<br />Failure<br />';
}

问题是查询本身没有错误并且执行良好,因此没有失败存储在 $f 中。但是,我需要知道它是否真的找到要更新的行,然后成功更新它。换句话说,我需要受影响的行。当谷歌搜索等时,它不断出现在 exec 语句中,但据我了解, exec 不是用于准备好的语句?有什么建议么?

4

5 回答 5

60

试试$q->rowCount()。准备好的语句将通过该方法返回受影响的行数。

于 2012-05-09T19:08:56.967 回答
27

附注:更新具有相同值的表时,rowCount()将始终返回0. 这是正常行为。自 PHP 5.3 起,您可以通过创建具有以下属性的 PDO 对象来自己更改它:

<? php
$p = new PDO($dsn, $user, $pass, array(PDO::MYSQL_ATTR_FOUND_ROWS => true));
?>

然后rowCount()将返回您的更新查询实际找到/匹配的行数。

于 2017-04-03T08:53:21.770 回答
24

$q->rowCount()返回受最后一个(执行的)SQL 语句影响的行数,$q其中经常调用的准备好的语句$stmt

所以大多数阅读这篇文章的用户可能想要这样的东西:

$pdo = new PDO($dsn, $username, $password);
$sql = "UPDATE tb_users  SET authState=1 WHERE id = ? AND authPass = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute(array($id, $authPass));

if ($stmt->rowCount()){
    echo 'Success: At least 1 row was affected.';
} else{
    echo 'Failure: 0 rows were affected.';
}
于 2014-05-13T09:35:28.337 回答
2

如果PDO是, or语句,rowCount()则准备好的语句中的 PDO 将返回受影响的行。否则,它返回从语句返回的行数。UPDATEDELETEINSERTSELECT

于 2015-04-25T01:44:47.880 回答
-3

我认为 PDO rowCount() 在带有单个 UPDATE 查询的 MySQL 中是没用的。因为它总是返回 0;

ex:
TABLE{id=1, col1="A"}
UPDATE  TABLE SET col1="AA" WHERE id=1;
rowCount will return 0;

also
UPDATE  TABLE SET col1="AA" WHERE id=999;
rowCount will return 0;

so rowCount() is useless in this case.

我尚未使用此查询 UPDATE TABLE SET col1="AA" 进行测试

于 2014-09-28T01:16:48.163 回答