PDO在执行语句期间受到影响

时间:2012-05-09 19:05:11

标签: php mysql pdo prepared-statement

我已经找到了很多方法来使用exec语句进行PDO,但我不确定它对我有帮助。我的理解是我必须对预准备语句使用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不是用于准备语句吗?有什么建议吗?

5 个答案:

答案 0 :(得分:35)

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

答案 1 :(得分:19)

$q->rowCount()返回受上一个(已执行的)SQL语句影响的行数,其中$q是准备好的语句,通常称为$stmt

所以大多数阅读此内容的用户可能需要以下内容:

$pdo = new PDO($dsn, $username, $password);
$sql = "UPDATE tb_users  SET authState=1 WHERE id = ? AND authPass = ?";
$stmt = $dbh->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.';
}

答案 2 :(得分:13)

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

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

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

答案 3 :(得分:0)

来自预准备语句的PDO rowCount()会返回受影响的行,如果它是UPDATEDELETEINSERT语句。否则,它返回从SELECT语句返回的行数。

答案 4 :(得分:-2)

我认为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”