php pdo:获取表的列名

Posted

技术标签:

【中文标题】php pdo:获取表的列名【英文标题】:php pdo: get the columns name of a table 【发布时间】:2011-07-22 15:29:04 【问题描述】:

如何使用 PDO 从表中获取所有列名?

id         name        age
1          Alan        35      
2          Alex        52
3          Amy         15

我想得到的信息是,

id         name        age

编辑:

这是我的尝试,

$db = $connection->get_connection();
$select = $db->query('SELECT * FROM contacts');

$total_column = $select->columnCount();
var_dump($total_column);

for ($counter = 0; $counter < $total_column; $counter ++) 
    $meta = $select->getColumnMeta($counter);
    $column[] = $meta['name'];

print_r($column);

然后我明白了,

Array
(
    [0] => id
    [1] => name
    [2] => age
    ...

)

【问题讨论】:

您想要中的列名,还是查询记录集中的列名?这是以两种不同的方式完成的两种不同的事情。菲尔的回答是前者,JapanPro 的回答是后者! @charles:我想我只想获取表中的列名。我不太明白你所说的查询记录集中的列名是什么意思。但请在上面的编辑中查看我的答案。谢谢。 @lauthiamkok:你在更新后的帖子中这样做了——你正在做一个查询,它返回一组记录,然后你正在获取特定的列名 设置。碰巧结果集中的列名与表中的列名相同。请记住,SQL 列可以有别名。 @lauthiamkok,如果您试图从表中获取列名,那么下面@JapanPro 的答案是最好的方法——使用information_schema 方法。你在做什么做的工作,但不是“正确”的方式。 当你有一个空表时,你的方法会失败,因为没有记录可以从中获取列。 【参考方案1】:

$sql = "选择列名 information_schema.columns 在哪里 table_name = 'myTable'";

php 函数 学分:http://www.sitepoint.com/forums/php-application-design-147/get-pdo-column-name-easy-way-559336.html

function getColumnNames()

    $sql = "SELECT column_name FROM information_schema.columns WHERE table_name = 'myTable'";
    #$sql = 'SHOW COLUMNS FROM ' . $this->table;
    $stmt = $this->connection->prepare($sql);
    try 
        if ($stmt->execute())
        
            $raw_column_data = $stmt->fetchAll(PDO::FETCH_ASSOC);
            foreach($raw_column_data as $outer_key => $array)
            
                foreach($array as $inner_key => $value
                
                    if (!(int)$inner_key)
                    
                        $this->column_names[] = $value;
                    
                
            
        
        return $this->column_names;
    
    catch (Exception $e)
    
        return $e->getMessage(); //return exception
    

【讨论】:

还将schema_name 添加到where +1 表示information_schema 而不是特定于数据库的内容。 @Charles information_schema mysql 不是特定的吗?这个问题没有标记MySQL,所以它可以是任何东西。请注意,我回答中的方法可能也不适用于每个数据库;) @Phil, information_schema 是 ANSI 标准的一部分。它已在 MySQL、PostgreSQL 和 MSSQL 中实现。除非 OP 使用 Oracle 或 SQLite,否则对他来说应该可以正常工作(假设这个答案是他想要的)。 @PawełStawarz 有一个 TABLE_SCHEMA 列指示表和列所属的模式。但是,使用 information_schema 的缺点是可能并非所有用户/帐户都可以访问此系统表。这也比 getColumnMeta() 慢。【参考方案2】:

无需进行二次查询。只需使用内置的 oci_field_name() 函数:

这是一个例子:

oci_execute($stid);                  //This executes

    echo "<table border='1'>\n";
    $ncols = oci_num_fields($stid);
    echo "<tr>";
    for ($i = 1; $i <= $ncols; $i++) 
            $column_name  = oci_field_name($stid, $i);
            echo "<td>$column_name</td>";
    
    echo "</tr>";


    while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) 
            echo "<tr>\n";
            foreach ($row as $item) 
                    echo "    <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "&nbsp;") . "</td>\n";
            
            echo "</tr>\n";
    
    echo "</table>\n";

【讨论】:

他使用的是 PDO,而不是 OCI。另外,我会投票反对你称别人的解决方案“愚蠢”......但我不想不受欢迎。感谢您的尝试!【参考方案3】:

这种方法适用于 SQLite 和 MySQL。它可能适用于其他人,请告诉我您的经验。

存在行时有效 在没有行的情况下工作(使用DELETE FROM table 测试)

代码:

$calendarDatabase = new \PDO('sqlite:calendar-of-tasks.db');    
$statement = $calendarDatabase->query('SELECT *, COUNT(*) FROM data LIMIT 1');
$columns = array_keys($statement->fetch(PDO::FETCH_ASSOC));
array_pop($columns);
var_dump($columns);

我不保证这是符合 ANSI 或其他标准的有效 SQL,但它适用于我。

【讨论】:

如果数据库中有 284,000 行,性能会如何? @miken32 感谢您的说明。更新代码以适用于任意大小的数据库【参考方案4】:
$q = $dbh->prepare("DESCRIBE tablename");
$q->execute();
$table_fields = $q->fetchAll(PDO::FETCH_COLUMN);

必须

$q = $dbh->prepare("DESCRIBE database.table");
$q->execute();
$table_fields = $q->fetchAll(PDO::FETCH_COLUMN);

【讨论】:

【参考方案5】:

只需输入您的数据库名称、用户名、密码(我在哪里标记?)和表名。& Yuuppiii!....您从主数据库中获取所有数据(带有列名)

<?php 

function qry($q)

    global $qry;
    try    
    $host = "?";
    $dbname = "?";
    $username = "?";
    $password = "?";
    $dbcon = new PDO("mysql:host=$host; 
    dbname=$dbname","$username","$password");

catch (Exception $e) 

    echo "ERROR ".$e->getMEssage();



    $qry = $dbcon->query($q);
    $qry->setFetchMode(PDO:: FETCH_OBJ);

    return $qry;




echo "<table>";

/*Get Colums Names in table row */
$columns = array();

$qry1= qry("SHOW COLUMNS FROM Your_table_name");

while (@$column = $qry1->fetch()->Field) 
    echo "<td>".$column."</td>";
    $columns[] = $column;



echo "<tr>";

/* 获取所有数据到 html 表中 * /

$qry2 = qry("SELECT * FROM Your_table_name");

while ( $details = $qry2->fetch()) 

    echo "<tr>";
    foreach ($columns as $c_name) 
    echo "<td>".$details->$c_name."</td>";





echo "</table>";

?>

【讨论】:

【参考方案6】:

我对 SQLite 的贡献

/**
 * Returns an array of column names for a given table.
 * Arg. $dsn should be replaced by $this->dsn in a class definition.
 *
 * @param string $dsn Database connection string, 
 * e.g.'sqlite:/home/user3/db/mydb.sq3'
 * @param string $table The name of the table
 * 
 * @return string[] An array of table names
 */
public function getTableColumns($dsn, $table) 
   $dbh = new \PDO($dsn);
   return $dbh->query('PRAGMA table_info(`'.$table.'`)')->fetchAll(\PDO::FETCH_COLUMN, 1);

【讨论】:

【参考方案7】:

这适用于 MySQL、Postgres 以及可能使用 LIMIT 子句的任何其他 PDO 驱动程序。

添加通知LIMIT 0 是为了提高性能:

$rs = $db->query('SELECT * FROM my_table LIMIT 0');
for ($i = 0; $i < $rs->columnCount(); $i++) 
    $col = $rs->getColumnMeta($i);
    $columns[] = $col['name'];

print_r($columns);

【讨论】:

谢谢威尔!读者您好,这是通用 PDO 解决方案! Lauer 解决方案仅由 MySQL 支持 -- 并且 PDOStatement::getColumnMeta() 很复杂,并非所有 PDO 驱动程序都支持,并且被列为实验性的。 PS:查询也使用空表运行。 也许可以用$columns = array_keys($rs-&gt;fetchAll(PDO::FETCH_ASSOC));之类的东西来简化...我不会尝试。 @PeterKrauss,是的,它至少需要一个结果。 @DaviddCeFreitas,对不起,getColumnMeta 的方法有一个 6 岁以上的“实验性”警报……唯一的方法是使用非空表。您可以使用 SELECT * FROM my_table WHERE id=0 之类的东西并使用无数据行填充所有表。 LIMIT 0 是 MySQL / PGSQL 特定的语法。 如何 这是通用的?如何做到这一点?【参考方案8】:

这是一个老问题,但这是我的意见

function getColumns($dbhandle, $tableName) 
    $columnsquery = $dbhandle->query("PRAGMA table_info($tableName)");
    $columns = array();
    foreach ($columnsquery as $k) 
        $columns[] = $k['name'];
    
    return $columns;

只需为您的 pdo 对象和表名输入您的变量。为我工作

【讨论】:

【参考方案9】:

我通过以下方式解决问题(仅限 MySQL)

$q = $dbh->prepare("DESCRIBE tablename");
$q->execute();
$table_fields = $q->fetchAll(PDO::FETCH_COLUMN);

【讨论】:

只有 MySQL 支持。 为什么不$q = $dbh-&gt;query("DESCRIBE tablename"); $table_fields = $q-&gt;fetchAll(PDO::FETCH_COLUMN); 读者,有关通用解决方案,请参阅@Will 回答。 恕我直言,虽然这个答案可能对许多人有用,但它不符合问题中表达的需要,即“有没有办法在我在迭代数据?”用户希望在迭代值时查看数组中的键。 key($array) 函数可能会有所帮助。【参考方案10】:

这里是一个非常有用的 SQLite3 解决方案。因为 OP 没有特别指出 MySQL 并且尝试在 SQLite 上使用某些解决方案失败。

    $table_name = 'content_containers';
    $container_result = $connect->query("PRAGMA table_info(" . $table_name . ")");
    $container_result->setFetchMode(PDO::FETCH_ASSOC);


    foreach ($container_result as $conkey => $convalue)
    

        $elements[$convalue['name']] = $convalue['name'];

    

这将返回一个数组。由于这是一个直接的信息转储,您需要遍历并过滤结果以获得如下结果:

Array
(
    [ccid] => ccid
    [administration_title] => administration_title
    [content_type_id] => content_type_id
    [author_id] => author_id
    [date_created] => date_created
    [language_id] => language_id
    [publish_date] => publish_date
    [status] => status
    [relationship_ccid] => relationship_ccid
    [url_alias] => url_alias
)

当桌子是空的时,这特别好。

【讨论】:

【参考方案11】:

这是我使用的功能。根据上面的@Lauer 回答和其他一些资源创建:

//Get Columns
function getColumns($tablenames) 
global $hostname , $dbnames, $username, $password;
try 
$condb = new PDO("mysql:host=$hostname;dbname=$dbnames", $username, $password);

//debug connection
$condb->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$condb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// get column names
$query = $condb->prepare("DESCRIBE $tablenames");
$query->execute();
$table_names = $query->fetchAll(PDO::FETCH_COLUMN);
return $table_names;

//Close connection
$condb = null;

 catch(PDOExcepetion $e) 
echo $e->getMessage();


用法示例:

$columns = getColumns('name_of_table'); // OR getColumns($name_of_table); if you are using variable.

foreach($columns as $col) 
echo $col . '<br/>';

【讨论】:

【参考方案12】:

我的 2 美分:

$result = $db->query('select * from table limit 1');
$fields = array_keys($result->fetch(PDO::FETCH_ASSOC));

您将在 var $fields 中以数组形式获取列名。

【讨论】:

如果表为空,则会产生警告! ===> "警告:array_keys() 期望参数 1 是数组,布尔值在...中给出"【参考方案13】:

PDOStatement::getColumnMeta()

正如 Charle 所提到的,这是一个语句方法,这意味着它从准备好的语句(查询)中获取列数据。

【讨论】:

而且,正如@Darragh 所说,它是实验性的,将来可能无法使用。

以上是关于php pdo:获取表的列名的主要内容,如果未能解决你的问题,请参考以下文章

如何从PDO的fetchAll结果中获取列名?

PHP PDO mySQL 查询返回列名和整数

如何在 php 中使用 implode 获取数据库表的列名

PHP PDO 语句可以接受表名或列名作为参数吗?

Php PDO,类方法返回true,而参数中的列名错误?

PDO按列名获取结果索引