在空表上选择但仍然获得列名

时间:2012-06-01 16:29:23

标签: php mysql pdo

我想在一个空表上做一个SELECT,但我仍然希望得到一个包含所有列名的记录。我知道还有其他方法可以从表中获取列名,但我想知道是否可以使用某种SELECT查询。

我知道这个在我直接在MySQL中运行时有效:

SELECT * FROM cf_pagetree_elements WHERE 1=0;

但我正在使用PHP + PDO(FETCH_CLASS)。这只是给我一个空对象而不是一个包含所有列名的行(带有空值)。因此,出于某种原因,查询不适用于PDO FETCH_CLASS。

$stmt = $this->db->prepare ( $sql );
$stmt->execute ( $bindings );
$result = $stmt->fetchAll ( \PDO::FETCH_CLASS, $class );
print_r($result); // Empty object... I need an object with column names

任何人都知道我是否可以尝试另一种方法?

9 个答案:

答案 0 :(得分:7)

添加到w00 answered,有一个甚至不需要虚拟表的解决方案

SELECT tbl.* 
FROM (SELECT 1) AS ignore_me 
    LEFT JOIN your_table AS tbl 
        ON 1 = 1 
LIMIT 1 

在MySQL中,您可以将WHERE 1 = 1更改为WHERE 1

答案 1 :(得分:6)

发布有关SHOW COLUMNS和信息方案的其他答案。 OP清楚地说:" 我知道还有其他方法可以从表中获取列名,但我想知道是否可以使用某种SELECT查询。 "

学会阅读。


无论如何,回答你的问题;不,你不能。您无法从空表中选择一行。从空表开始,甚至没有空值的行。

然而,您可以申请这样做。

创建一个名为' dummy'的附加表格。只有一列和一行:

表:虚拟

dummy_id: 1

这就是全部。现在你可以这样做一个select语句:

SELECT * FROM dummy LEFT OUTER JOIN your_table ON 1=1

这将始终返回一行。但它包含' dummy_id'专栏也是。然而,您可以忽略该行为并使用您想要的(空)数据。

再说一次,这只是一个用SELECT语句来做的技巧。没有默认的方法来完成这项工作。

答案 2 :(得分:1)

你可以尝试:

SELECT * FROM information_schema.columns
WHERE table_name = "cf_pagetree_elements"

不确定您的特定PHP + PDO方法(可能存在复杂性),但这是获取列标题(字段名称)的标准方法。

答案 3 :(得分:1)

这将列出支持getColumMeta的PDO驱动程序的ANY查询列。我在SQL服务器上使用它,即使在使用别名表,子查询和联合的非常复杂的查询上也能正常工作。即使结果为零,也给我列

<?php 


    // just an example of an empty query.
    $query =$PDOdb->query("SELECT  * from something where 1=0; "); 
    for ($i=0; $i<$query->columnCount(); $i++) {
        echo $query->getColumnMeta($i)['name']."<br />";
    }

?>

答案 4 :(得分:0)

即使没有PDO,数据库也不会在没有至少一行的情况下返回结构。您可以这样做并忽略数据行:

SELECT * FROM cf_pagetree_elements LIMIT 1;

或者你可以简单地

DESC cf_pagetree_elements;

每个字段处理一行。

WHERE 1=0对我不起作用。它总是返回empty set

答案 5 :(得分:0)

SHOW COLUMNS FROM cf_pagetree_elements;

这将给出一个解释表结构的结果集。您可以使用PHP轻松解析结果。

另一种方法是查询信息模式表:

SELECT column_name FROM information_schema.columns WHERE table_name='cf_pagetree_elements';

虽然不是真的推荐!

答案 6 :(得分:0)

用于SQLSVR的最新PDO肯定可以与get列元一起使用。

只需设置您的语句并使用它来获取有用的信息数组:

$stmt->execute();
$meta= array();
foreach(range(0, $stmt->columnCount() - 1) as $column_index)
   {
    array_push($meta,$stmt->getColumnMeta($column_index));
   }

答案 7 :(得分:0)

Oracle 或 MySQL 的完整解决方案

对于任何或某些列(我的目标是获取与数据库中完全相同的任意列,无论大小写)

对于任何表(w 或 w/o 行)

    $qr = <<<SQL
SELECT $cols 
FROM (SELECT NULL FROM DUAL)
LEFT JOIN $able t ON 1 = 0
SQL;

    $columns = array_keys($con->query($qr)->fetchAll(PDO::FETCH_ASSOC)[0]);

    if($cols === "*") {
        array_shift($columns);
    }

答案 8 :(得分:-1)

你可以使用MetaData;

 $cols = mysql_query("SHOW COLUMNS FROM $tableName", $conn);