pdo_sqlsrv:如何识别提取“ false”是错误还是空的记录集?

时间:2018-10-30 11:11:54

标签: php sql-server pdo

如果记录集为空以及存在实际错误,则 fetch 方法均返回false。此处介绍的方法使您可以轻松识别正在发生的事情:

ensure that PDO fetch method result "false" is a error or empty result

它与pdo_mysql一起很好地工作,但是即使记录集为空,pdo_sqlsrv也会引发错误。这是预期的行为吗?有可能避免这些错误吗?

编辑:错误为“活动结果集中没有更多行”,当您尝试获取已完全获取的记录集时,将产生此错误。 pdo_mysql不会发生这种情况,它只会返回false。

编辑2:我终于更详细地了解了这个问题:第一次,您获取一个空的记录集将得到FALSE,然后,如果再次获取,则会出现一个错误。 pdo_mysql不会发生这种情况(而且我很确定PDO pgsql和sqlite也不会发生这种情况):您仍然会出错而不产生错误。

这是代码的简化版本:

// 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();
    }
}

输出:

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.

0 个答案:

没有答案