Php получает имена столбцов для более старой версии ms-access (.mdb)

PDOStatement :: getColumnMeta не поддерживает драйвер Microsoft Access (* .mdb). Как я могу получить имена полей динамически с помощью PDO?

Примечание: Я не стал бы заранее знаю sql-запрос. $ sql ниже предназначен только для демонстрации.

$dbh = new PDO("odbc:Driver = {Microsoft Access Driver 
                (*.mdb)};Dbq=C:\database.mdb;Uid=Admin");

// Sample SQL could be used
$sql = "SELECT name, SUM(b) AS sumvalue FROM table GROUP BY name";

$result = $dbh->query($sql);
$data = [];
while ($row = $result->fetch()) {
    for ($i = 0; $i < $result->columnCount(); $i++) {
        $col = $result->getColumnMeta($i);   //<------ This line not supported

        $fieldName = $col['name'];
        if (!isset($data[$fieldName])) $data[$fieldName] = [];
        array_push($data[$fieldName], $row[$fieldName]);
    }
}

// Get JSON result
echo json_encode($data);

Чего вы на самом деле пытаетесь достичь с помощью этого кода?

Mike 24.03.2018 04:00

@Mike Получить результат в формате JSON из запроса SQL. Пока заранее знать SQL-запрос не буду.

Clinton Lam 24.03.2018 04:02

Почему ты не можешь просто сделать $result->fetchAll(PDO::FETCH_ASSOC);? Это помещает имена столбцов в ассоциативный массив, что, похоже, вы пытаетесь сделать здесь.

Mike 24.03.2018 04:07

@Mike пробует $ result-> fetchAll (PDO :: FETCH_ASSOC)

Clinton Lam 24.03.2018 04:13

Выложил как ответ. Дай мне знать, если это работает.

Mike 24.03.2018 04:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
382
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте что-нибудь подобное:

<?php
$fName = '';
$sumVal = '';
$pdoStr = 'odbc:Driver = {Microsoft Access Driver (*.mdb)};Dbq=C:\database.mdb;Uid=Admin"';
$dbh = new PDO($pdoStr);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql = "SELECT name, SUM(b) AS sumvalue FROM table GROUP BY name";
$result = $dbh->query($sql);
$data = $result->fetchAll();
// here, you only have two fields, "name" and "sumvalue", so, you need to use these fields only, so this will work
foreach($data as $row) {
    $fName = row['Name'];
    $sumVal = row['sumvalue'];
    // ...
}
?>

Надеюсь, что поможет!

Мир!

Мне нужно получать названия полей на ходу. Я не знаю заранее названия полей.

Clinton Lam 24.03.2018 03:53

это самый простой способ получить значения из столбцов в операторе PDO, поскольку строка PDO имеет значение, после соединения со строкой команды одинаковы для всех

Armando Marques da S Sobrinho 24.03.2018 03:56

поэтому вам нужно выполнить цикл из вашей таблицы и получить каждый столбец по его имени, обратите внимание, что имя - это имя столбца в таблице, поскольку они названы окончательно или названы программно, например "sumvalue"

Armando Marques da S Sobrinho 24.03.2018 04:00

Может быть как финансово, так и программно. Я не буду знать заранее sql-запрос.

Clinton Lam 24.03.2018 04:04

физически это "b", программно "sumvalue", вы не можете получить несуществующий столбец

Armando Marques da S Sobrinho 24.03.2018 04:05

В этом примере мне нужно получить в качестве результата 'name' и 'sumvalue'.

Clinton Lam 24.03.2018 04:06

и в моем примере он будет возвращен как значение, попробуйте его увидеть

Armando Marques da S Sobrinho 24.03.2018 04:07

Позвольте нам продолжить обсуждение в чате.

Clinton Lam 24.03.2018 04:08
Ответ принят как подходящий

Вам не нужно использовать getColumnMeta() для получения имени столбца. Если вы используете PDO::FETCH_ASSOC, имена столбцов будут ключами ассоциативного массива. Вы можете просто перебрать это:

$results = $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);

$data = [];
foreach ($results as $row) {
    foreach ($row as $key => $value) {
        $data[$key][] = $value;
    }
}

// Get JSON result
echo json_encode($data);

Примечание. Вы также можете сделать это режимом выборки по умолчанию для этого соединения:

$dbh = new PDO("odbc:Driver = {Microsoft Access Driver 
            (*.mdb)};Dbq=C:\database.mdb;Uid=Admin");
$dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

Таким образом, вам не нужно указывать его каждый раз, когда вы используете fetch() / fetchAll().

Спасибо, это все, что мне нужно.

Clinton Lam 24.03.2018 04:23

Другие вопросы по теме