php - pdo_sqlsrv:如何识别 fetch "false" 是错误还是空记录集?
问题描述
如果记录集为空并且存在实际错误,则 fetch 方法返回false 。此处描述的方法使您可以轻松识别正在发生的事情:
它适用于 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.
解决方案
推荐阅读
- go - 将 Markdown 转换为 pdf - 不可读的字体
- flutter - 在 Flutter Web 中构建发布后,kReleaseMode 仍然为 false
- sql - Oracle SQL查询使用两个where子句获取差异值
- python - 将下拉菜单添加到 bootstrap3 导航栏
- python - 从 Starlette 中的同步迭代器通过 websocket 发送数据
- node.js - 它将 --"name":null,"message":null.--- 存储在数据库中
- c# - 如何在控制台中创建登录名,我使用存储在文件 c# 中的用户名和密码进行身份验证
- javascript - 我怎样才能从对象链中获得两个对象长度
- ansible - 运行 win_command 任务时引用转义的问题
- python - 添加控件时碰撞检测不起作用