Как получить количество затронутых строк из mssql-запроса в php pdo - PullRequest
0 голосов
/ 14 марта 2019

Я меняю свой php-проект с использования mysql на mssql. когда я использую if ($query->rowCount() == 0) { с mysql это работает хорошо, но с mssql я получаю отрицательное значение, которое не является правильным. Поэтому я попытался использовать $count = count($query->fetchAll()); с mssql, что дает мне положительное значение, подобное при использовании mysql, но я получаю ошибку Я использую Php драйверы для SQL Server

Неустранимая ошибка: необработанное исключение PDO: SQLSTATE [IMSSP]: в активном наборе результатов больше нет строк. Поскольку этот набор результатов нельзя прокручивать, данные больше не могут быть извлечены.

Нужна помощь с этой проблемой

1 Ответ

0 голосов
/ 14 марта 2019

Документация про PDOStatement :: rowCount ясна.

Возвращает количество строк, добавленных, удаленных или измененных. Если последний SQL оператор, выполненный связанным PDOStatement, был SELECT оператор, курсор PDO :: CURSOR_FWDONLY возвращает -1. Курсор PDO :: CURSOR_SCROLL ABLE возвращает количество строк в набор результатов.

Если вы хотите использовать rowCount() для SELECT операторов, вам нужно использовать PDO::CURSOR_SCROLLABLE:

<?php  
#
$server = "server\instance,port";  
$dbname = "database";
$uid = "uid";  
$pwd = "pwd";  

# Connection
$conn = new PDO("sqlsrv:server=$server ; Database = $dbname", $uid, $pwd);  

# SELECT statement
$query = "SELECT * FROM Table1";  
$stmt = $conn->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));  
$stmt->execute();  
echo $stmt->rowCount();  

# End
$stmt = null;
$conn = null;
?>   

Когда вы используете $count = count($query->fetchAll());, ваш набор результатов уже получен после $query->fetchAll() вызова. Если вы попытаетесь вызвать методы PDOStatement::fetch или PDOStatement::fetchAll, вы получите эту ошибку.

Попробуйте следующий подход:

<?php

...
$result = $query->fetchAll(); 
$count = count($result);
foreach ($result as $row) {

}
...

?>
...