Php 仅获取数组mysql中的列名

Php 仅获取数组mysql中的列名,php,mysql,Php,Mysql,我对php和mysql都是新手。我想创建一个动态表,其中包含mysql数据库中表中的所有字段。我正在尝试获取数组中的所有列名,但失败了。我正在尝试以下代码: <?php $fields = mysql_query("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'mytablename' "); $res = mysql_fetch_array($fields); foreach ($res

我对php和mysql都是新手。我想创建一个动态表,其中包含mysql数据库中表中的所有字段。我正在尝试获取数组中的所有列名,但失败了。我正在尝试以下代码:

<?php
    $fields = mysql_query("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'mytablename' ");
    $res = mysql_fetch_array($fields);
    foreach ($res as $field)
    {
        echo '<tr>';
        echo '<td>';
        echo $field;
        echo '</td>';
        echo '<td>';
        echo "<input type='text' class='' name='tags' id='tags' value=''>";
        echo '</td>';
        echo '</tr>';
    }
    ?>

您不需要额外的SQL查询来获取字段名。您可以使用normale SELECT查询,只需从该查询中获取字段名(和定义)。这样性能更好

不推荐的MySQL解决方案:

MySQL库已弃用。它可以像在这个链接中一样使用,btu您应该切换到mysqli库,它在使用过程中几乎相同(第二个示例)

htttp://www.php.net/manual/en/function.mysql-field-name.php

面向对象MySQLi解决方案:

$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";

if ($result = $mysqli->query($query)) {
/* Get field information for all columns */
    while ($finfo = $result->fetch_field()) {
        printf("Name:     %s\n", $finfo->name);
        printf("Table:    %s\n", $finfo->table);
        printf("max. Len: %d\n", $finfo->max_length);
        printf("Flags:    %d\n", $finfo->flags);
        printf("Type:     %d\n\n", $finfo->type);
    }
    $result->close();
}    
$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";
if ($result = mysqli_query($link, $query)) {
    /* Get field information for all fields */
    while ($finfo = mysqli_fetch_field($result)) {
        printf("Name:     %s\n", $finfo->name);
        printf("Table:    %s\n", $finfo->table);
        printf("max. Len: %d\n", $finfo->max_length);
        printf("Flags:    %d\n", $finfo->flags);
        printf("Type:     %d\n\n", $finfo->type);
    }
    mysqli_free_result($result);
}
程序化MySQLi解决方案:

$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";

if ($result = $mysqli->query($query)) {
/* Get field information for all columns */
    while ($finfo = $result->fetch_field()) {
        printf("Name:     %s\n", $finfo->name);
        printf("Table:    %s\n", $finfo->table);
        printf("max. Len: %d\n", $finfo->max_length);
        printf("Flags:    %d\n", $finfo->flags);
        printf("Type:     %d\n\n", $finfo->type);
    }
    $result->close();
}    
$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";
if ($result = mysqli_query($link, $query)) {
    /* Get field information for all fields */
    while ($finfo = mysqli_fetch_field($result)) {
        printf("Name:     %s\n", $finfo->name);
        printf("Table:    %s\n", $finfo->table);
        printf("max. Len: %d\n", $finfo->max_length);
        printf("Flags:    %d\n", $finfo->flags);
        printf("Type:     %d\n\n", $finfo->type);
    }
    mysqli_free_result($result);
}

请注意,此代码使用mysqli_*php库,因为旧版mysqli_*库已被弃用,不应使用

这可能会奏效

<?php
            $table = 'tableName';
            $query = "SHOW COLUMNS FROM $table";
            if($output = mysqli_query($query)):
                $columns = array();
                while($result = mysqli_fetch_assoc($output)):
                    $columns[] = $result['Field'];
                endwhile;
            endif;
            echo '<pre>';
            print_r($columns);
            echo '</pre>';
    ?>

使用以下方法:

           TABLE_CATALOG: def
            TABLE_SCHEMA: schema_name
              TABLE_NAME: table_name
             COLUMN_NAME: column_name /*use this column name*/
        ORDINAL_POSITION: 49
          COLUMN_DEFAULT: NULL
             IS_NULLABLE: YES
               DATA_TYPE: varchar
CHARACTER_MAXIMUM_LENGTH: 255
  CHARACTER_OCTET_LENGTH: 765
       NUMERIC_PRECISION: NULL
           NUMERIC_SCALE: NULL
      CHARACTER_SET_NAME: utf8
          COLLATION_NAME: utf8_general_ci
             COLUMN_TYPE: varchar(255)
              COLUMN_KEY: 
                   EXTRA: 
              PRIVILEGES: select,insert,update,references
          COLUMN_COMMENT: 
而不是
$field

这将给出列名

执行查询后,查询返回以下字段:

var_dump(array_keys($dbh->query('SELECT * FROM `mytablename` LIMIT 1')->fetch(PDO::FETCH_ASSOC)));

您可以使用
PDO
执行类似操作:

<?php
$fields = mysql_query("SHOW columns FROM mytablename");
while($row = mysql_fetch_array($fields))
{
    echo '<tr>';
    echo '<td>';
    echo $row["Field"];
    echo '</td>';
    echo '<td>';
    echo "<input type='text' class='' name='tags' id='tags' value=''>";
    echo '</td>';
    echo '</tr>';
}
?>
使用:


尝试以下功能:

$db = new PDO('mysql:host=localhost;dbname=databasename','user','password');

echo "<tr>";
$query = $db->prepare("SHOW COLUMNS FROM `table`");
$query->execute();
$fields = array();
while($result = $query->fetch(PDO::FETCH_ASSOC)){
    echo "<td style='font-weight:bold; padding:5px'>$result[Field]</td>";
    $fields[] = $result['Field'];
}
echo "</tr>\n";
函数mysql\u字段\u数组($query){
$field=mysql\u num\u字段($query);
对于($i=0;$i<$field;$i++){
$names[]=mysql\u field\u name($query,$i);
}
返回$names;
}

使用PDO库创建具有字段名的表行:

$db=newpdo('mysql:host=localhost;dbname=databasename','user','password');
回声“;
$query=$db->prepare(“显示“表”中的列”);
$query->execute();
$fields=array();
而($result=$query->fetch(PDO::fetch_ASSOC)){
回显“$result[字段]”;
$fields[]=$result['Field'];
}
回音“\n”;

您得到了什么?使用print\r($fields)进行调试!。。。php debuggingFYI中一个非常有用的命令,
mysql.*
已被弃用。您应该使用
mysqli
PDO
。我在每个值前面得到应用数学字段1名称、字段1名称、int(3)、int(3)、NO、NO和textfield-1:NEVER;是否建议使用不推荐的库提出问题。PHP中不推荐使用mysql_*lib,即使作者正在使用该库。至少放一个免责声明。部分更新;)再次检查它。我很高兴现在删除我的-1。我在顶部添加了一个小的免责声明,只是为了警告盲目复制粘贴者。@STTLCU感谢鸟瞰图,它帮助了我,希望还有这个问题的海报。上帝保佑你,有没有一种方法可以不用我的QLND来完成这项工作。mysqli_fetch_assoc仅适用于mysqlnd?它有效,萨利姆,感谢大家的帮助。非常感谢。Reg,mysql_*函数已弃用。请不要遵循这个答案。mysql_*是危险的,但它仍然被广泛使用。我们应该努力让PHP发展成为一个更好的地方,所有的事情,甚至是一点点,都必须完成。谢谢@STTLCU,我应该用什么来代替mysql_query和mysql_fetch_array?@user2806222重构您的代码以使用PDO库。我发誓,你永远不会后悔的。从这里开始:@user2806222使用
fetch\u assoc
和while代替foreach。那就试试吧。请不要建议使用mysql_*库函数。它们已经被弃用了。是的,我添加了更新的mysqli版本。请通知Tnx。