2012-03-01 6 views
6

У меня возникла проблема с подготовленным оператором PDO и rowCount, возвращающим неправильное количество затронутых строк.PDO rowCount не возвращает правильное количество затронутых строк

У меня есть простой тест базы данных:

create table test (
    boolean var1; 
); 

Тогда я следующий код теста:

$sth = $pdo->prepare("INSERT into test (var1) VALUES (:val)"); 
$sth->execute(array(':val' => true)); 
echo $sth->rowCount(); 

возвращающий, как и ожидалось: 1 строки пострадавших

И когда я вставляю недопустимый тип и сбой вставки:

$sth = $pdo->prepare("INSERT into test (var1) VALUES (:val)"); 
$sth->execute(array(':val' => 20)); 
echo $sth->rowCount(); 

Который возвращается, как и ожидалось: 0 ряды пострадавших

Однако, когда у меня есть несколько вставок -

$sth = $pdo->prepare("INSERT into test (var1) VALUES (:val)"); 

$sth->execute(array(':val' => true)); 
echo $sth->rowCount() . ", "; 

$sth->execute(array(':val' => 20)); 
echo $sth->rowCount(); 

Результаты в: 1, 1

И если я переворачивать порядок выполнения я получаю : 0, 1

Почему rowCount() - Затронутые строки не устанавливаются в ноль в команде fail после завершения ss заявление?

Я бегу PHP 5.3.6-13 и Postgresql 9.1

+1

Просто включите исключения для PDO и получить лучший способ обработка таких случаев – zerkms

+1

Это имеет смысл для меня, потому что вы повторно использовали одно и то же PDOStatement. Если для каждого утверждения требуется отдельный rowCount, подготовьте второй оператор. – Ozzy

ответ

2

Мне кажется, что $sth->execute(array(':val' => true)) завершается успешно, таким образом, увеличивая rowCount, но $sth->execute(array(':val' => 20)) не делает. Вот состояние rowCount для $sth на каждом этапе:

$sth = $pdo->prepare("INSERT into test (var1) VALUES (:val)"); 

# No successful DML queries have been done with the $sth yet. 
# rowCount == 0 

$sth->execute(array(':val' => true)); 
echo $sth->rowCount() . ", "; 

# rowCount increases because of a successful INSERT statement 
# rowCount == 1 

$sth->execute(array(':val' => 20)); 
echo $sth->rowCount(); 

# rowCount does not increase due to failed INSERT statement 
# rowCount == 1 

Теперь давайте рассмотрим, что в обратном порядке:

$sth = $pdo->prepare("INSERT into test (var1) VALUES (:val)"); 

# No successful DML queries have been done with the $sth yet. 
# rowCount == 0 

$sth->execute(array(':val' => 20)); 
echo $sth->rowCount(); 

# rowCount does not increase due to failed INSERT statement 
# rowCount == 0 

$sth->execute(array(':val' => true)); 
echo $sth->rowCount() . ", "; 

# rowCount increases because of a successful INSERT statement 
# rowCount == 1 
Смежные вопросы