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

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

В идеале без выполнения запроса. Только путём его парсинга (не самостоятельно, конечно, а средствами MySQL). Команда "SHOW COLUMNS" работает только с таблицами и представлениями. Можно создать временную таблицу или представление и получить список полей, но это не лучший вариант.
...
Рейтинг: 0 / 0
10.05.2015, 21:36
    #38955493
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP+MySQL: получить список полей произвольного SELECT-запроса
Можно выполнить запрос с добавлением 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
10.05.2015, 22:11
    #38955501
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP+MySQL: получить список полей произвольного SELECT-запроса
Я не знаю, как получить имена столбцов из PDOStatemant.
Всю жизнь только fetchAll(PDO::FETCH_ASSOC) использовал. Сейчас - приходится эквилибристикой заниматься...

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

На какой-то фигне застрял конкретно. Бесит...
...
Рейтинг: 0 / 0
10.05.2015, 22:25
    #38955506
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP+MySQL: получить список полей произвольного SELECT-запроса
fetch(PDO::FETCH_OBJ)
возвращает объект (имена полей = именам столбцов), но если добавть LIMIT 0, то возвращает false
...
Рейтинг: 0 / 0
10.05.2015, 22:32
    #38955507
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP+MySQL: получить список полей произвольного SELECT-запроса
Предварительный вывод: из PDOStatement имена полей для пустой выборки никак не вытащишь.
А ведь даже в Access такая задача решает без проблем...
...
Рейтинг: 0 / 0
10.05.2015, 22:34
    #38955509
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP+MySQL: получить список полей произвольного SELECT-запроса
автор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
11.05.2015, 01:40
    #38955541
Mikebond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP+MySQL: получить список полей произвольного SELECT-запроса
Cyrax_02,
авторВ идеале без выполнения запроса.
"...prepare" ?
не?
...
Рейтинг: 0 / 0
11.05.2015, 02:44
    #38955545
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP+MySQL: получить список полей произвольного SELECT-запроса
автор"...prepare" ?
Вы у меня спрашиваете или я на форуме спрашиваю ?
Выполняю prepare - дальше что ?
...
Рейтинг: 0 / 0
11.05.2015, 03:05
    #38955546
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP+MySQL: получить список полей произвольного SELECT-запроса
Похоже, о сложных вещах спрашиваю. Никто не знает...
...
Рейтинг: 0 / 0
11.05.2015, 04:29
    #38955550
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP+MySQL: получить список полей произвольного SELECT-запроса
авторМожно выполнить запрос с добавлением LIMIT 0 (или с заменой, если LIMIT в нем уже есть)
Корректную замену выполнить очень непросто. Формат записи у LIMIT'а не один. Плюс слово "LIMIT" может присутствовать в составе строковых констант.
...
Рейтинг: 0 / 0
11.05.2015, 09:04
    #38955571
sxq
sxq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP+MySQL: получить список полей произвольного SELECT-запроса
...
Рейтинг: 0 / 0
11.05.2015, 14:06
    #38955726
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP+MySQL: получить список полей произвольного SELECT-запроса
sxqэто не годится?
http://php.net/manual/ru/pdostatement.getcolumnmeta.php
в паре с http://php.net/manual/ru/pdostatement.columncount.php
Не годится. Однозначно.
Этот метод работает слишком примитивно, например, не разворачивает "COUNT(*)".
...
Рейтинг: 0 / 0
11.05.2015, 14:10
    #38955730
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP+MySQL: получить список полей произвольного SELECT-запроса
Тьфу. Чего-то не то пишу. Смотря на "COUNT(*)", подумал о "SELECT *"
Нужно попробовать. Только вот смущает "экспериментальный" характер функции...
...
Рейтинг: 0 / 0
12.05.2015, 00:30
    #38955986
sxq
sxq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP+MySQL: получить список полей произвольного SELECT-запроса
вашу задачу она решает на отлично, вы хотите получить имена колонок - вы их получите, экспериментальная она по причине скорей всего из-за сложности определения типов данных, это определяется плохо, по крайней мере в MySql.
Я пользуюсь этой функцией уже несколько лет, все прекрасно работает на всех последних версиях PHP
...
Рейтинг: 0 / 0
12.05.2015, 05:03
    #38956000
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP+MySQL: получить список полей произвольного SELECT-запроса
авторЯ пользуюсь этой функцией уже несколько лет, все прекрасно работает на всех последних версиях PHP Преимущество (PDOStatement::getColumnMeta()) перед (mysqli + fetch_fields()) - независимость от СУБД
...
Рейтинг: 0 / 0
12.05.2015, 10:52
    #38956162
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP+MySQL: получить список полей произвольного SELECT-запроса
Cyrax_02авторЯ пользуюсь этой функцией уже несколько лет, все прекрасно работает на всех последних версиях PHP Преимущество (PDOStatement::getColumnMeta()) перед (mysqli + fetch_fields()) - независимость от СУБДМожно подумать, что у вас все SQL-запросы независимы от СУБД :)
...
Рейтинг: 0 / 0
12.05.2015, 14:18
    #38956479
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP+MySQL: получить список полей произвольного SELECT-запроса
авторМожно подумать, что у вас все SQL-запросы независимы от СУБД :)
Промолчу... иначе придётся раскрыть свой инструментарий...
...
Рейтинг: 0 / 0
13.05.2015, 01:42
    #38956942
Mikebond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP+MySQL: получить список полей произвольного SELECT-запроса
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
14.05.2015, 12:41
    #38958522
Cyrax_02
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP+MySQL: получить список полей произвольного SELECT-запроса
авторт.е. для того чтобы получить метаданные "execute" выполнять не обязательно.
Там есть 2 примера содержащих "prepare + execute + metadata". Если закоментировать строчки с "execute", то результат не изменится.
А Ваш вариант - не то же самое, что prepare + execute(c LIMIT 0) + getColumnMeta ?
...
Рейтинг: 0 / 0
15.05.2015, 00:45
    #38959315
Mikebond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP+MySQL: получить список полей произвольного SELECT-запроса
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
Период между сообщениями больше года.
01.05.2017, 22:13
    #39446973
Serjik_ms
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP+MySQL: получить список полей произвольного SELECT-запроса
Вот как я решил (проверено 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
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP+MySQL: получить список полей произвольного SELECT-запроса / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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