Я нашел много способов использовать инструкцию 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()
вернет количество строк, которые ваш запрос-обновление действительно нашел / сопоставил.
rowCount()
из подготовленных операторов возвращает затронутые строки, если это 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"