Mau*_*wer 22 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 />';
}
Run Code Online (Sandbox Code Playgroud)
问题是查询本身没有错误并且执行正常,因此没有失败存储在$ f中.但是,我需要知道它是否确实找到要更新的行,然后成功更新它.换句话说,我需要受影响的行.当谷歌搜索这样的时候,它会继续写入exec语句,但根据我的理解,exec不是用于准备语句吗?有什么建议?
Mar*_*c B 40
试试$q->rowCount()
.准备好的语句将通过该方法返回受影响的行数.
Mar*_*oma 20
$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.';
}
Run Code Online (Sandbox Code Playgroud)
bod*_*di0 14
附注:当更新具有相同值的表时,rowCount()
将始终返回0
.这是正常行为.您可以通过创建具有以下属性的PDO对象,自PHP 5.3起自行更改:
<? php
$p = new PDO($dsn, $user, $pass, array(PDO::MYSQL_ATTR_FOUND_ROWS => true));
?>
Run Code Online (Sandbox Code Playgroud)
在rowCount()
随后将返回多少行的更新询问居然发现/匹配.