php - MySQL vs Firebird:使用 PDO 访问 PHP 中的查询列
问题描述
据我了解,无论我使用什么数据库,使用 PDO 都应该是相同的结果。我在以下代码中对此进行了测试,该代码已连接到两个单独的数据库。
$sth = $pdo->query('SELECT * FROM posts');
while($result = $sth->fetch(PDO::FETCH_BOTH)){
echo $result[1] . '<br>';
};
MySQL数据库:
$dsn = 'mysql:host=' . $server . ';dbname=' . $dbname;
$pdo = new PDO($dsn, $username, $password);
火鸟数据库:
$dsn = "firebird:dbname=" . $server . ":" . $dbname;
$pdo = new PDO($dsn, $username, $password);
MySQL 连接工作正常,而 Firebird 连接仅适用于编号数组 - FETCH_NUM 和使用索引位置时的 FETCH_BOTH。这是它应该的样子还是我的 Firebird 连接有问题?我将来需要使用 Firebird DB,所以这真的让我很沮丧。感谢您的所有评论。
解决方案
在 Firebird 中,默认情况下,主要是出于历史原因,除非您在对象名称(字段名称、表格等)上使用双引号,否则它们是大写的 -d 并且在内部以大写形式存储。
因此,您在结果集中收到的列名是大写的,因此您应该使用大写的方式来处理它们,例如$row['FIELD_NAME']
.
或者,在 PHP 中,PDO 驱动程序有一个用于连接的特殊标志PDO::ATTR_CASE => PDO::CASE_LOWER/NATURAL/UPPER
,可以在内部为您调整所需的情况。
例如:
$source = $d['kind'].':'.'dbname='.$d['host'].':'.$d['base'].';charset='.$d['charset'];
$options = $d['options'] + [
\PDO::ATTR_CASE => \PDO::CASE_LOWER,
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
];
$connection = new \PDO($source, $d['user'], $d['password'], $options);
Firebird 并不是唯一一个这样做的人。默认情况下,Oracle 还以大写形式存储元数据。一些 DBMS 有选项,其他的默认小写。
推荐阅读
- azure - 生产 Web api 托管、容器的 Web 应用程序还是 azure 容器实例?
- python - `import pandas` 错误为 `ModuleNotFoundError: No module named 'pandas.msgpack'`
- batch-file - 如何在 cmd 中模拟“ENTER”键?
- vue.js - 如何在 Vuex 模块中使用 mapGetters
- javascript - 无法从 localStorage 为我在 Nuxt 中的身份验证初始化 Vuex 存储
- java - 写入和读取 txt 文件
- sql - 在一个表的不同行和不同列中查找相同的值 SQL
- python - 有没有办法更简洁地打印特定数字的倍数?
- vimeo - 在基于 Vimeo 表单的上传中不尊重 redirect_url
- python - python中的NARX示例-训练和预测