pdo_sqlsrv: como reconhecer se a busca "false" é um erro ou um conjunto de registros vazio?
Obusca método @ retorna false se o conjunto de registros estiver vazio e se houver um erro real. O método descrito aqui permite que você reconheça facilmente o que está acontecendo:
garantir que o resultado do método de busca DOP "false" seja um erro ou um resultado vazio
Funciona bem com pdo_mysql, no entanto, pdo_sqlsrv gera um erro mesmo quando o conjunto de registros está vazio. Esse é o comportamento pretendido? É possível evitar esses erros?
EDIT: o erro é "Não há mais linhas no conjunto de resultados ativo" e é produzido quando você tenta buscar um conjunto de registros que já foi completamente buscado. Isso não acontece com o pdo_mysql, que retorna apenas false.
EDIT 2: Finalmente entendi o problema mais detalhadamente: oprimeira ve você busca um conjunto de registros vazio e obtém FALSE; se você buscar novamente, recebe um erro. Isso não acontece com o pdo_mysql (e tenho certeza de que isso também não acontece com o PDO pgsql e sqlite): você ainda fica falso sem gerar erro
qui está uma versão simplificada do códig
// sqlsrv connection
$conn = new PDO("sqlsrv:Server=....;Database=....", "user", "password", array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ));
// mysql connection
// $conn = new PDO('mysql:host=....;dbname=....', 'user', 'password', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
$sql = "drop table if exists test;";
$res = $conn->query($sql);
$sql = "create table test (name varchar(10));";
$res = $conn->query($sql);
$sql = "insert into test (name) values ('Alice');";
$res = $conn->query($sql);
$sql = "select * from test";
$res = $conn->query($sql);
// fetch first record
$row = fetch_row_db($res);
var_dump($row);
// fetch again
$row = fetch_row_db($res);
var_dump($row);
// fetch again
$row = fetch_row_db($res);
var_dump($row);
function fetch_row_db(&$res)
{
try {
return $res->fetch();
}
catch(PDOException $e){
echo 'Error during record fetching.';
exit();
}
}
SAÍDA
MySQL
array(2) { ["name"]=> string(5) "Alice" [0]=> string(5) "Alice" } bool(false) bool(false)
sqlsrv
array(2) { ["name"]=> string(5) "Alice" [0]=> string(5) "Alice" } bool(false) Error during record fetching.