2015-04-08 8 views
0

У меня возникла странная проблема, которая в течение дня ударила меня по спине.PHP PDO rowCount возвращает -1 в операторе SELECT

У меня есть следующий код:

$today = date("m/d/Y"); 
$sql = "SELECT * FROM msgs WHERE is_errata = 0 AND kill_date >= '$today' AND msg_date <= '$today' ORDER BY msg_date"; 
$ps = $pdo->prepare($sql); 
if (!$ps) { 
    echo "PDO::errorInfo():"; 
    print_r($pdo->errorInfo()); 
}else{ 
    $ps->execute(); 
    $number_of_rows = $ps->rowCount(); 

Когда я показываю значение $ number_of_rows, она всегда отображает -1, даже когда я получаю результаты.

У кого-нибудь еще есть эта проблема?

О, и база данных, которую я использую, не является MySQL, а прекрасным MS Access. Я подозреваю, что это может быть проблемой.

ответ

1

rowCount() метод НЕ возвращает количество строк из SELECT заявление. Это распространенная ошибка.

PDOStatement :: ROWCOUNT() возвращает число строк, пострадавших от последней DELETE, INSERT или UPDATE заявление, выполненных с помощью соответствующего объекта PDOStatement. Если последний оператор SQL, выполняемый соответствующим PDOStatement, был инструкция SELECT, некоторые базы данных могут возвращать количество строк , возвращенных этим оператором. Однако это поведение не гарантируется для всех баз данных и не должно полагаться на переносные приложения .

Более подробную информацию вы можете найти на странице documentation.

Таким образом, чтобы получить количество строк, вам необходимо написать SELECT с помощью sql COUNT(*). В вашем случае:

$sql = "SELECT COUNT(*) AS `count` FROM msgs WHERE is_errata = 0 AND kill_date >= '$today' AND msg_date <= '$today' ORDER BY msg_date"; 

или с помощью PHP:

$number_of_rows = count($ps->fetchAll()); 

Вы должны также научиться готовить в запросе правильный путь

+0

После этого я не могу перебирать «foreach». Есть ли обходной путь? – l0pan

-1

Вы должны использовать iterator_count для подсчета строк, т.е.

$number_of_rows = iterator_count($ps);