MySQL против Firebird: доступ к столбцам запросов в PHP с помощью PDO - PullRequest
0 голосов
/ 14 января 2019

Из того, что я понял, использование PDO должно быть одинаковым, независимо от того, какую БД я использую. Я проверил это в следующем коде, который я подключил к двум отдельным БД.

$sth = $pdo->query('SELECT * FROM posts');
while($result = $sth->fetch(PDO::FETCH_BOTH)){
    echo $result[1] . '<br>';
};

MySQL DB:

$dsn = 'mysql:host=' . $server . ';dbname=' . $dbname;
$pdo = new PDO($dsn, $username, $password);

БД Firebird:

$dsn = "firebird:dbname=" . $server . ":" . $dbname;
$pdo = new PDO($dsn, $username, $password);

Соединение MySQL работало нормально, в то время как соединение Firebird работало только с пронумерованными массивами - FETCH_NUM и FETCH_BOTH при использовании позиций индекса. Это так и должно быть, или я что-то не так делаю с моим подключением к Firebird? Мне нужно будет работать с БД Firebird в будущем, так что это действительно расстраивает меня. Спасибо за все комментарии.

1 Ответ

0 голосов
/ 16 января 2019

В 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 также хранит метаданные по умолчанию в верхнем регистре. Некоторые СУБД имеют опции, другие по умолчанию в нижнем регистре.

...