2012-02-24 3 views
4

Есть ли способ получить имена столбцов запроса, который не возвращает данные?Извлечь имена столбцов из пустого результата запроса MySQL

Я использую (несколько) сложные запросы, такие как:

SELECT 
    i.*, 
    ic1.permalink as category_permalink, 
    ic1.title as category_title, 
    ic1.sid as category_sid, 
    ic2.permalink as hook_category_permalink, 
    ic2.title as hook_category_title, 
    ic2.sid as hook_category_sid 
FROM item i 
    LEFT JOIN item_to_item_category itic ON i.sid = itic.item_sid 
    LEFT JOIN item_category ic1 ON ic1.sid = itic.item_category_sid 
    LEFT JOIN item_category ic2 ON ic1.hook = ic2.sid 
WHERE i.uid = '' 
LIMIT 0,1 

Результат этого запроса будет пустым из-за WHERE i.uid = "". Есть ли способ найти имена столбцов, когда нет результата?

Обратите внимание: я знаю о решениях с использованием DESCRIBE и select column_name from information_schema.columns where table_name='person';, но мне нужно более гибкое решение, соответствующее этим многоколоночным запросам.

Обратите внимание, что я все еще использую исходное расширение PHP MySQL (так что MySQLi и PDO).

Кто-нибудь?

+1

Я думаю, что я знаю, что вы пытаетесь достичь, но не могли бы вы изменить свой вопрос, чтобы включить некоторые контекст? Зачем вам нужно знать заголовки столбцов для запроса, который не возвращает данные? –

+0

По крайней мере, укажите, какое расширение DB вы используете. – outis

+0

Причина, по которой мне нужно это сделать, довольно длинная история. Это для бэк-офиса, который я создал. Расширение DB - это просто расширение PHP MySQL. Пришло время для обновления, так что кажется. – maartenmachiels

ответ

3

Для PDO, попробуйте PDOStatement->getColumnMeta(). Для mysqli существует mysqli_result->fetch_fields(), mysqli_result->fetch_field() и mysqli_result->fetch_field_direct(). Для mysql замените его на PDO или mysqli.

+0

Спасибо за ваш ответ. Пришло время перейти на MySQLi! – maartenmachiels

+0

@maartenmachiels: PDO имеет более удобный интерфейс. См. Ответы на [Получение синтаксиса подготовленных операторов справа] (http://stackoverflow.com/q/9425405/) для некоторых примеров. – outis

1

Предполагая, что вы вызываете запрос из PHP. Вы можете позвонить по номеру mysqli_fetch_fields даже с помощью запроса emtpy.

1

Описание: Простой класс, основанный на mysqli. Этот метод также будет работать и в пустых таблицах. Конечно, добавьте свою собственную проверку ошибок по мере необходимости.

Успех вернет численный индекс имен столбцов из таблицы $.
Отказ или не строковый ввод будет возвращен FALSE.

class mysqlz extends mysqli { 

    function fetch_table_columns($table) { 
     if(!is_string($table)) { 
      return false; 
     } elseif($obj = $this->query("SHOW COLUMNS FROM " . $table)) { 
       while($fields = $obj->fetch_object()) { 
        $columns[] = $fields->Field; 
       } 
       return $columns; 
     } else { 
      return false; 
     } 
    } 
} 

Для использования, первый экземпляр базы данных, как обычно:
$mysql = new mysqlz($host, $user, $pass, $database);

Затем вызывается метод, чтобы получить имена столбцов:
$columns = $mysql->fetch_table_columns("table_name_here");

В зависимости от вашего стола, результирующий массив должен var_dump() аналогично этому:

array(3) { [0]=> string(2) "id" [1]=> string(10) "first_name" [2]=> string(9) "last_name" }


Если метод возвращает ЛОЖЬ (var_dump возвращает bool(false)), вы можете проверить текущую ошибку с $mysqlz->error. Дополнительные сведения о проверке ошибок см. В руководстве по MySQL mysqli по адресу http://www.php.net/manual/en/book.mysqli.php.

0

Для ADOdb вы можете использовать:

$db->Execute("SELECT ......."); 
$colInfo = $res->FieldTypesArray(); 

Выход аналогичен методу MetaColumns($table), но вы можете использовать его на каждый набор результатов не только для таблиц (включая соединения). Он также работает для пустых результатов или пустых таблиц.

Благодаря outis, Я нашел эту функцию после поиска «fetch_field()» в adoDBs MySQL-драйвер: D

Смежные вопросы