PDO 是执行语句期间受影响的行

Posted

技术标签:

【中文标题】PDO 是执行语句期间受影响的行【英文标题】:PDO were rows affected during execute statement 【发布时间】:2012-05-18 08:21:00 【问题描述】:

我找到了许多方法来使用 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 不是用于准备好的语句?有什么建议吗?

【问题讨论】:

警告:如果值已经设置(更新执行两次,可能来自双击提交按钮)第二次会导致错误,即使数据是美好的。为了用户体验,之后做一个 select 语句来查看记录是否存在并且值正确 select authState from tb_users where id = ? and authPass = ? 可能更可靠。没有结果意味着 id 或密码不存在。 (附:我希望你对密码进行哈希处理!看看 pbdkf2!) 【参考方案1】:

$q-&gt;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.';

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

我不知道这是一件事!!都是的!【参考方案3】:

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

【讨论】:

请记住,默认情况下,MySQL 返回实际更改的行数,而不是 where 子句匹配的行数(使用与现有值相同的值发出更新不会更改行) 我知道很多人都在寻找这个问题,从我在整个网络上阅读的内容来看,快速响应做得很好! $f 说完了就没有必要了,可以这样结束: if($q->rowCount()) ... 使用:$q->rowCount() 出现错误:$f->rowCount() 是的,爱上了它。使用$q->rowCount(),这个答案可以改成正确的吗?【参考方案4】:

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

【讨论】:

【参考方案5】:

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

ex:
TABLEid=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"

【讨论】:

这会返回 0,因为 MySQL 足够聪明地检查该值是否仍与初始值相同并忽略更新

以上是关于PDO 是执行语句期间受影响的行的主要内容,如果未能解决你的问题,请参考以下文章

PDO预编译语句执行查询与DML操作

PDO中执行SQL语句

PHP PDO Update语句总是返回0行受影响的rowCount()

SSIS 执行 SQL 任务,受 MERGE 语句影响的行(Oracle 和 SQL Server)

通过 RAW plpgsql 中的 UPDATE 语句获取受影响的行

返回受 UPDATE 语句影响的行数