2013-09-23 3 views
5

Я новичок в php и mysql. Я хочу создать динамическую таблицу, которая будет иметь все поля из таблицы в базе данных 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>'; 
    } 
    ?> 

Любая помощь будет оценена по достоинству.

+0

И что вы получите взамен? – silkfire

+1

use print_r ($ fields) для отладки! ... очень полезная команда в отладке php –

+3

FYI, mysql_ * 'устарела, вы должны использовать' mysqli' или 'PDO'.[Переход от mysql_ к PDO] (http://www.sitepoint.com/migrate-from-the-mysql-extension-to-pdo/) – SmokeyPHP

ответ

4

Вам не нужен дополнительный SQL-запрос, чтобы получить имена полей. Вы можете использовать свой запрос 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(); 
}  

процедурной MySQLi Решение :

$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); 
} 

http://www.php.net/manual/en/mysqli-result.fetch-field.php

+0

Пожалуйста, не предлагайте функции библиотеки mysql_ *. Они устарели. –

+2

Да, я добавил новую версию mysqli. Tnx для уведомления. – ToBe

1

Обратите внимание: этот код использует библиотеку mysqli_ * php, поскольку устаревшая библиотека mysql_ * устарела и никогда не должна использоваться.

Это может сделать трюк

<?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>'; 
    ?> 
+1

-1: НИКОГДА; ВСЕГДА предлагайте вопросы, используя устаревшие библиотеки. mysql_ * lib устарел в PHP, даже если автор использует эту библиотеку. По крайней мере, оговорился. –

+0

обновил код! –

+0

Обновлено частично;) еще раз проверьте его –

1

Используйте это:

echo $field['COLUMN_NAME']; 

вместо $field

Это даст имя столбца.

После выполнения запроса, запрос возвращает эти поля:

  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: 
+0

попробовал это, но это дает результат, как: е, е \t, E \t, E \t, \t, \t, ... – Sunil

+0

@ user2806222 использовать 'fetch_assoc' и время вместо foreach. затем попробуйте. –

0

Вы можете сделать что-то вроде этого, а не с PDO:

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

Что случилось с моим решением? – silkfire

1

Использование:

<?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>'; 
} 
?> 
+0

Это работало Салим, спасибо всем за вашу помощь. Действительно ценю это. Reg, – Sunil

+0

Функции mysql_ * устарели. Пожалуйста, не следуйте этому ответу. –

+0

@STTLCU: спасибо, я постараюсь лучше следующий. – Salim

2

Попробуйте следующее функция:

function mysql_field_array($query) { 

    $field = mysql_num_fields($query); 

    for ($i = 0; $i < $field; $i++) { 
     $names[] = mysql_field_name($query, $i); 
    } 
    return $names; 
} 
0

Использование библиотеки PDO для создания строки таблицы с именами полей:

$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"; 
Смежные вопросы