Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在空表上选择,但仍获取列名_Php_Mysql_Pdo - Fatal编程技术网

Php 在空表上选择,但仍获取列名

Php 在空表上选择,但仍获取列名,php,mysql,pdo,Php,Mysql,Pdo,我想在一个空表上执行SELECT操作,但我仍然希望返回一条包含所有列名的记录。我知道还有其他方法可以从表中获取列名,但我想知道是否可以使用某种SELECT查询 我知道,当我直接在MySQL中运行它时,它可以工作: SELECT * FROM cf_pagetree_elements WHERE 1=0; 但我使用的是PHP+PDO(FETCH_类)。这只会返回一个空对象,而不是一个包含所有列名(包含空值)的行。因此,由于某种原因,该查询不适用于PDO FETCH_类 $stmt = $this

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

我知道,当我直接在MySQL中运行它时,它可以工作:

SELECT * FROM cf_pagetree_elements WHERE 1=0;
但我使用的是PHP+PDO(FETCH_类)。这只会返回一个空对象,而不是一个包含所有列名(包含空值)的行。因此,由于某种原因,该查询不适用于PDO FETCH_类

$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

有人知道我是否可以尝试其他方法吗?

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

SELECT * FROM cf_pagetree_elements LIMIT 1;
或者你可以简单地

DESC cf_pagetree_elements;
每个字段处理一行

其中1=0
对我不起作用。它总是返回
空集

您可以尝试:

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

不确定具体的PHP+PDO方法(可能会有复杂情况),但这是获取列标题(字段名)的标准方法。

您可以使用元数据

 $cols = mysql_query("SHOW COLUMNS FROM $tableName", $conn);
这将给出一个解释表格结构的结果集。您可以很容易地用PHP解析结果

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

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

但不推荐

其他回答,他们发布了关于SHOW COLUMNS和信息方案的信息。 OP明确表示:“我知道还有其他方法可以从表中获取列名,但我想知道是否可以使用某种SELECT查询。”

学习阅读


无论如何,回答你的问题;不,你不能。不能从空表中选择行。空表中甚至没有包含空值的行

然而,有一个技巧可以用来实现这一点

创建一个名为“dummy”的附加表,其中只有一列和一行:

表格:虚拟

dummy_id: 1
就这些。现在,您可以执行如下select语句:

SELECT * FROM dummy LEFT OUTER JOIN your_table ON 1=1
这将始终返回一行。但是,它也包含“dummy_id”列。不过,您可以忽略这一点,随意处理(空)数据


同样,这只是一个使用SELECT语句的技巧。没有默认方法可以完成此操作。

这将列出任何支持getColumMeta的PDO驱动程序查询的列。我将其用于SQL server,即使在具有别名表、子查询和联合的非常复杂的查询中也能正常工作。即使结果为零,也为我提供列

<?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 />";
    }

?>

除此之外,还有一种解决方案甚至不需要虚拟表

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

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

只需设置您的语句,并使用它来获取一系列有用的信息:

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

针对Oracle或MySQL的完整解决方案

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

对于任何表格(带行或不带行)


$qr=实际上,您可以从带有pdo的空查询中获取列名。使用getColumnMeta函数更好地添加限制1-因为此表可能会被填充一些day@YourCommonSense好主意。这就是答案。所选答案需要特权才能创建表。需要使用SELECT确定列名的原因很可能是因为特权限制了人们以另一种方式确定列名。
$stmt->execute();
$meta= array();
foreach(range(0, $stmt->columnCount() - 1) as $column_index)
   {
    array_push($meta,$stmt->getColumnMeta($column_index));
   }
    $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);
    }