PDO rowCount не возвращает правильное количество затронутых строк - PullRequest
6 голосов
/ 01 марта 2012

У меня проблема с подготовленным оператором 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 () - Затронутые строки не установлены в ноль в операторе сбоя после оператора успеха?

Я использую php 5.3.6-13 и Postgresql 9.1

1 Ответ

2 голосов
/ 11 ноября 2013

Мне кажется, что $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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...