PDO были затронуты строк во время выполнения оператора

Я нашел много способов использовать инструкцию 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 не для подготовленных операторов? Любые предложения?

Ответы

Ответ 1

Попробуйте $q->rowCount(). Подготовленные операторы возвращают количество затронутых строк с помощью этого метода.

Ответ 2

$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.';
}

Ответ 3

Примечание: при обновлении таблицы с одинаковыми значениями rowCount() всегда будет возвращаться 0. Это нормальное поведение. Вы можете изменить его самостоятельно, начиная с PHP 5.3, создав объект PDO со следующим атрибутом:

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

rowCount() затем вернет, сколько строк ваш запрос-запрос действительно найден/сопоставлен.

Ответ 4

PDO rowCount() из подготовленных операторов возвращает затронутые строки, если это a UPDATE, DELETE или INSERT. В противном случае он возвращает количество строк, возвращаемых из инструкции SELECT.

Ответ 5

Я думаю, что 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"