MySQL vs Firebird:使用 PDO 访问 PHP 中的查询列

MySQL vs Firebird: accessing query columns in PHP with PDO

据我了解,无论我使用什么数据库,使用 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 驱动程序有一个 special flag 用于连接,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 有选项,其他的默认为小写。