首页 > 解决方案 > 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,所以这真的让我很沮丧。感谢您的所有评论。

标签: phpmysqldatabasepdofirebird

解决方案


在 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 有选项,其他的默认小写。


推荐阅读