2013-09-23 42 views
5

Tôi mới trong cả php và mysql. Tôi muốn tạo một bảng năng động sẽ có tất cả các trường từ bảng trong cơ sở dữ liệu mysql. Tôi đang cố gắng để có được tất cả các tên cột trong một mảng nhưng không làm. Tôi đang thử mã sau đây:Chỉ lấy tên cột như trong mảng 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>'; 
    } 
    ?> 

Bất kỳ hỗ trợ nào sẽ được đánh giá cao.

+0

Và những gì bạn nhận được để thay thế? – silkfire

+1

sử dụng print_r ($ fields) để gỡ lỗi! ... một lệnh rất hữu ích trong việc gỡ lỗi php –

+3

FYI, 'mysql_ *' không được dùng nữa, bạn nên sử dụng 'mysqli' hoặc' PDO'.[Thay đổi từ mysql_ sang PDO] (http://www.sitepoint.com/migrate-from-the-mysql-extension-to-pdo/) – SmokeyPHP

Trả lời

4

Bạn không cần truy vấn SQL bổ sung chỉ để lấy tên trường của mình. Bạn có thể sử dụng truy vấn SELECT bình thường của bạn và chỉ nhận được tên trường của bạn (và định nghĩa) từ truy vấn đó. Hiệu suất tốt hơn theo cách này!

Deprecated Giải pháp MySQL:

Các MySQL Thư viện bị phản đối. Nó có thể được sử dụng như trong liên kết này, btu bạn nên chuyển sang thư viện mysqli gần như giống hệt nhau khi sử dụng proceduraly (mẫu thứ hai).

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

Các OOP MySQLi Giải pháp:

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

Giải pháp MySQLi Theo Thủ Tục :

$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

Vui lòng không đề xuất chức năng thư viện mysql_ *. Chúng không được chấp nhận. –

+2

Đúng, tôi đã thêm phiên bản mysqli mới hơn. Tnx để thông báo. – ToBe

1

Xin lưu ý rằng mã này sử dụng thư viện mysqli_ * php, vì thư viện mysql_ * cũ không được dùng nữa và không bao giờ được sử dụng.

Điều này có thể làm các trick

<?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: KHÔNG BAO GIỜ; EVER đề xuất câu hỏi bằng cách sử dụng thư viện không dùng nữa. mysql_ * lib không được chấp nhận trong PHP, ngay cả khi tác giả đang sử dụng thư viện đó. Ít nhất hãy đặt tuyên bố từ chối trách nhiệm. –

+0

đã cập nhật mã! –

+0

Cập nhật một phần;) kiểm tra lại lần nữa –

1

Sử dụng này:

echo $field['COLUMN_NAME']; 

thay vì $field

này sẽ cung cấp cho các tên cột.

Sau khi thực hiện truy vấn, truy vấn trả về các lĩnh vực:

  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

đã thử nó, nhưng nó được đưa ra kết quả như sau: e, e \t, E \t, E \t, Một \t, Một \t, ... – Sunil

+0

@ user2806222 gõ 'fetch_assoc' và trong khi thay vì foreach. sau đó thử nó. –

0

Bạn có thể làm một cái gì đó như thế này thay vì với PDO:

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

Có gì sai với giải pháp của tôi? – silkfire

1

Sử dụng:

<?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

Nó đã làm việc Salim, Cảm ơn tất cả vì sự giúp đỡ của bạn. Thực sự đánh giá cao nó. Reg, – Sunil

+0

chức năng mysql_ * không còn được dùng nữa. Xin đừng làm theo câu trả lời này. –

+0

@STTLCU: cảm ơn, tôi sẽ cố gắng tốt hơn tiếp theo. – Salim

2

Hãy thử như sau chức năng:

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

Sử dụng thư viện PDO để tạo ra một dòng của bảng với tên trường:

$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"; 
Các vấn đề liên quan