PHP PDO и двойной доступ к базе данных для одиночной записи

100
11

У меня есть база данных ms доступа 2010 с расширением *.accdb и мне удается подключиться к базе данных с помощью PDO и ODBC-драйвера.

Я попытался удалить либо *.mdb либо *.accdb и получить сообщение об ошибке, я не знаю, зачем ему нужны расширения.

Это POC:

<?php
$dbName = 'here be path';
$db = new PDO("odbc:DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=$dbName; Uid=; Pwd=;");

$sql = "SELECT MAX(ID) as MaxID from tbl";
$result = $db->query($sql);

foreach($result as $r) {
var_dump($r);
}

Странным является результат:

array (size=2)
'MaxID' => string '21411' (length=5)
0 => string '21411' (length=5)

Почему я получаю 2 записи для одного ожидаемого результата? Как я могу получить только это:

    array (size=1)
'MaxID' => string '21411' (length=5)

Во-вторых, как я могу оптимизировать PDO, чтобы получить только один результат без foreach?

спросил(а) 2015-07-20T21:22:00+03:00 5 лет, 3 месяца назад
1
Решение
90

Вы получаете удвоенные результаты, потому что стиль выборки по умолчанию установлен на PDO::FETCH_BOTH:

(по умолчанию): возвращает массив, индексированный как с именем столбца, так и с номером столбца с 0-индексом, возвращаемым в результирующий набор

Таким образом, вы можете вызывать элементы в массиве с номером индекса или фактическим именем ключа.

$result[0] or $result['MaxID'] will return the same result.

Если вы не хотите, чтобы дубликаты меняли ваш стиль, например, PDO::FETCH_ASSOC:

$result = $db->query($sql);
$result->fetchAll(PDO::FETCH_ASSOC);

foreach($result as $r) {
var_dump($r);
}

Подробнее о стилях выборки вы можете найти в документации.

ответил(а) 2015-07-20T21:27:00+03:00 5 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема