powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP+MySQL: получить список полей произвольного SELECT-запроса
23 сообщений из 23, страница 1 из 1
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38955490
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
php + mysql. Имеется произвольный запрос SQL (строка).
Как быстрее всего получить список полей, возвращаемых этим запросом ?

Необходимо учитывать, что запрос может возвращать пустой результат. В этом случае список полей тоже должен быть корректно получен.

В идеале без выполнения запроса. Только путём его парсинга (не самостоятельно, конечно, а средствами MySQL). Команда "SHOW COLUMNS" работает только с таблицами и представлениями. Можно создать временную таблицу или представление и получить список полей, но это не лучший вариант.
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38955493
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно выполнить запрос с добавлением LIMIT 0 (или с заменой, если LIMIT в нем уже есть). В MySQL есть специальная оптимизация для LIMIT 0, которая делает именно то, что требуется - возвращает пустой набор данных с нужными полями.
http://dev.mysql.com/doc/refman/5.5/en/limit-optimization.html LIMIT 0 quickly returns an empty set. This can be useful for checking the validity of a query. It can also be employed to obtain the types of the result columns if you are using a MySQL API that makes result set metadata available.
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38955501
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не знаю, как получить имена столбцов из PDOStatemant.
Всю жизнь только fetchAll(PDO::FETCH_ASSOC) использовал. Сейчас - приходится эквилибристикой заниматься...

Согласно справке,
fetch(PDO::FETCH_COLUMN|PDO::FETCH_GROUP)
должен вернуть массивы значений для всех полей. У меня возвращает хрень какую-то. Без названий столбцов.
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38955502
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласно справке,
fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP)
должен вернуть массивы значений для всех полей. У меня возвращает хрень какую-то. Без названий столбцов.
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38955504
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас 3 дня буду этот fetch обсасывать.
В гугле только mysqli упоминается, в справке - про извлечение столбцов ни слова.

На какой-то фигне застрял конкретно. Бесит...
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38955506
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fetch(PDO::FETCH_OBJ)
возвращает объект (имена полей = именам столбцов), но если добавть LIMIT 0, то возвращает false
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38955507
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предварительный вывод: из PDOStatement имена полей для пустой выборки никак не вытащишь.
А ведь даже в Access такая задача решает без проблем...
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38955509
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторIt can also be employed to obtain the types of the result columns if you are using a MySQL API that makes result set metadata available.
О каком таком API (которое получает метаданные о полях) здесь идёт речь ?
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38955541
Mikebond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cyrax_02,
авторВ идеале без выполнения запроса.
"...prepare" ?
не?
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38955545
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор"...prepare" ?
Вы у меня спрашиваете или я на форуме спрашиваю ?
Выполняю prepare - дальше что ?
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38955546
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже, о сложных вещах спрашиваю. Никто не знает...
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38955550
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМожно выполнить запрос с добавлением LIMIT 0 (или с заменой, если LIMIT в нем уже есть)
Корректную замену выполнить очень непросто. Формат записи у LIMIT'а не один. Плюс слово "LIMIT" может присутствовать в составе строковых констант.
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38955571
sxq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38955726
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sxqэто не годится?
http://php.net/manual/ru/pdostatement.getcolumnmeta.php
в паре с http://php.net/manual/ru/pdostatement.columncount.php
Не годится. Однозначно.
Этот метод работает слишком примитивно, например, не разворачивает "COUNT(*)".
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38955730
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тьфу. Чего-то не то пишу. Смотря на "COUNT(*)", подумал о "SELECT *"
Нужно попробовать. Только вот смущает "экспериментальный" характер функции...
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38955986
sxq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вашу задачу она решает на отлично, вы хотите получить имена колонок - вы их получите, экспериментальная она по причине скорей всего из-за сложности определения типов данных, это определяется плохо, по крайней мере в MySql.
Я пользуюсь этой функцией уже несколько лет, все прекрасно работает на всех последних версиях PHP
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38956000
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЯ пользуюсь этой функцией уже несколько лет, все прекрасно работает на всех последних версиях PHP Преимущество (PDOStatement::getColumnMeta()) перед (mysqli + fetch_fields()) - независимость от СУБД
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38956162
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02авторЯ пользуюсь этой функцией уже несколько лет, все прекрасно работает на всех последних версиях PHP Преимущество (PDOStatement::getColumnMeta()) перед (mysqli + fetch_fields()) - независимость от СУБДМожно подумать, что у вас все SQL-запросы независимы от СУБД :)
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38956479
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМожно подумать, что у вас все SQL-запросы независимы от СУБД :)
Промолчу... иначе придётся раскрыть свой инструментарий...
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38956942
Mikebond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cyrax_02автор"...prepare" ?
Вы у меня спрашиваете или я на форуме спрашиваю ?
Выполняю prepare - дальше что ?

Ну, если использование PDO не критично, то дальше читаем :
mysqli_prepare() + mysqli_stmt_result_metadata()

вкратце:
Если запрос, переданный в mysqli_prepare(), генерирует результирующую таблицу, mysqli_stmt_result_metadata() возвращает объект, с помощью которого можно получить описание этого результирующего набора. В частности, можно получить количество полей и описание каждого отдельного поля.
т.е. для того чтобы получить метаданные "execute" выполнять не обязательно.

Там есть 2 примера содержащих "prepare+ execute + metadata". Если закоментировать строчки с "execute", то результат не изменится.
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38958522
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторт.е. для того чтобы получить метаданные "execute" выполнять не обязательно.
Там есть 2 примера содержащих "prepare + execute + metadata". Если закоментировать строчки с "execute", то результат не изменится.
А Ваш вариант - не то же самое, что prepare + execute(c LIMIT 0) + getColumnMeta ?
...
Рейтинг: 0 / 0
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #38959315
Mikebond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cyrax_02авторт.е. для того чтобы получить метаданные "execute" выполнять не обязательно.
Там есть 2 примера содержащих "prepare + execute + metadata". Если закоментировать строчки с "execute", то результат не изменится.
А Ваш вариант - не то же самое, что prepare + execute(c LIMIT 0) + getColumnMeta ?
Кроме того что это "PDO" vs "mysqli"? По результату - скорее всего одно и то же - метаданные будут получены.

Для варианта c использованием PDO : PDO::prepare и PDO::query возвращают PDOStatement, логично предположить что PDOStatement::getColumnMeta ( int $column ) можно использовать и с/после PDO::prepare без PDOStatement::query. Честно говоря, не пробовал (не было необходимости, а сейчас - облом).
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
PHP+MySQL: получить список полей произвольного SELECT-запроса
    #39446973
Serjik_ms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот как я решил (проверено php 5.6), может кому пригодится) :
Получаем все имена полей таблицы "$tableName" ($this->pdo - ссылка на PDO (подключение к бд)):
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
function tableColnames($tableName) {

        try {

            $sql = "SHOW COLUMNS FROM $tableName";
            $stmt = $this->pdo->prepare($sql);
            $stmt->execute();
            $data = $stmt->fetchAll();

            $count = count($data);
            $x = 0;
            while ($x < $count) {
                $massiv[] = $data[$x]['Field'];
                $x++;
            }

            return $massiv;

        } catch (PDOException $e) {
  
                echo "Ошибка получения имён полей таблицы";

            return false;
        }
    }
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP+MySQL: получить список полей произвольного SELECT-запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]