Ответ 1
Попробуйте $q->rowCount()
. Подготовленные операторы возвращают количество затронутых строк с помощью этого метода.
Я нашел много способов использовать инструкцию 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. Тем не менее, мне нужно знать, действительно ли он нашел строку для обновления, а затем успешно ее обновил. Другими словами, мне нужны затронутые строки. Когда он отправляется в Google, он продолжает приходить к команде exec, но, по моему мнению, exec не для подготовленных операторов? Любые предложения?
Попробуйте $q->rowCount()
. Подготовленные операторы возвращают количество затронутых строк с помощью этого метода.
$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.';
}
Примечание: при обновлении таблицы с одинаковыми значениями rowCount()
всегда будет возвращаться 0
. Это нормальное поведение. Вы можете изменить его самостоятельно, начиная с PHP 5.3, создав объект PDO со следующим атрибутом:
<? php
$p = new PDO($dsn, $user, $pass, array(PDO::MYSQL_ATTR_FOUND_ROWS => true));
?>
rowCount()
затем вернет, сколько строк ваш запрос-запрос действительно найден/сопоставлен.
PDO rowCount()
из подготовленных операторов возвращает затронутые строки, если это a UPDATE
, DELETE
или INSERT
. В противном случае он возвращает количество строк, возвращаемых из инструкции SELECT
.
Я думаю, что PDO rowCount() бесполезен в MySQL с одним запросом UPDATE. потому что он всегда возвращает 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"