Permintaan MySQL untuk mendapatkan nama kolom?

286

Saya ingin memasukkan semua nama col tabel mysql ke dalam array di php?

Apakah ada pertanyaan untuk ini?

Haroldo
sumber

Jawaban:

512

Cara terbaik adalah dengan menggunakan database virtual metadata INFORMATION_SCHEMA . Khususnya tabel INFORMATION_SCHEMA.COLUMNS ...

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' 
    AND `TABLE_NAME`='yourtablename';

Ini SANGAT kuat, dan dapat memberi Anda BANYAK informasi tanpa perlu mem-parsing teks (Seperti jenis kolom, apakah kolom tersebut dapat dibatalkan, ukuran kolom maks, set karakter, dll) ...

Oh, dan itu SQL standar (Padahal SHOW ...ekstensi khusus MySQL) ...

Untuk informasi lebih lanjut tentang perbedaan antara SHOW...dan menggunakan INFORMATION_SCHEMAtabel, lihat DokumentasiINFORMATION_SCHEMA MySQL secara umum ...

ircmaxell
sumber
27
Ini hanya SQL standar jika Anda tidak menggunakan backticks khusus mysql bodoh itu untuk mengutip nama tabel. Saya benci mereka, mereka membuat kode saya terlihat salah.
MarkR
17
@ Markark Saya sebenarnya tidak memasukkan mereka ketika saya menulis jawabannya. Tapi kemudian itu hanya tampak seperti dinding tulisan hitam. Jadi saya menambahkan back-ticks untuk mengambil keuntungan dari penyorotan sintaks. Ya, saya bisa memiliki SET @@SESSION.sql_mode = 'ANSI_QUOTES';sebelum tangan juga, tetapi saya benar-benar tidak suka itu. Dan saya tidak punya masalah dengan tanda centang kembali untuk penetapan batas pengenal. Bahkan, saya suka mereka lebih baik daripada tanda kutip ganda (tanda kutip ganda membuat kueri terasa salah bagi saya) ... Untuk masing-masing sendiri ...
ircmaxell
2
Mengutip nama tabel sama sekali tidak diperlukan dalam contoh di atas.
MarkR
20
@ Mark saya tahu tidak. Itu sebabnya saya katakan saya sebenarnya tidak memasukkannya ketika saya menulis jawabannya . Saya menambahkan mereka untuk mengambil keuntungan dari penyorotan sintaksis ...
ircmaxell
4
Ketahuilah bahwa dengan tabel InnodDB pilih dari information_schema bisa sangat lambat. Dalam beberapa server lebih dari satu menit
macjohn
206

Anda dapat menggunakan permintaan berikut untuk MYSQL:

SHOW columns FROM your-table;

Di bawah ini adalah contoh kode yang menunjukkan Bagaimana menerapkan sintaksis di atas di php untuk mendaftar nama-nama kolom:

$sql = "SHOW COLUMNS FROM your-table";
$result = mysqli_query($conn,$sql);
while($row = mysqli_fetch_array($result)){
    echo $row['Field']."<br>";
}

Untuk Perincian tentang keluaran SHOW COLUMNS FROM TABLEkunjungan: MySQL Refrence.

bcosca
sumber
5
Atau ... DESC TableName;;-)
double_j
Apakah ada cara untuk menyimpan array untuk lebih banyak permintaan? Ingin mencari basis data untuk $ baris [4] untuk mendapatkan nilai di kolom kelima?
user3866044
43

Sepertinya ada 2 cara:

DESCRIBE `tablename`

atau

SHOW COLUMNS FROM `tablename`

Lebih lanjut di DESCRIBEsini: http://dev.mysql.com/doc/refman/5.0/id/describe.html

Mimpi nyata
sumber
4
Ahh, DESCRIBEhanya jalan pintas untuk SHOW COLUMNS FROM.
Surreal Dreams
7
Dan DESCbahkan lebih pendek DESCRIBE!
Brett Widmeier
21

Saya telah melakukan ini di masa lalu.

SELECT column_name
FROM information_schema.columns
WHERE table_name='insert table name here'; 
Jeff
sumber
7

Gunakan mysql_fetch_field()untuk melihat semua data kolom. Lihat manual .

$query = 'select * from myfield';
$result = mysql_query($query);
$i = 0;
while ($i < mysql_num_fields($result))
{
   $fld = mysql_fetch_field($result, $i);
   $myarray[]=$fld->name;
   $i = $i + 1;
}

"Peringatan, ekstensi ini sudah tidak digunakan lagi pada PHP 5.5.0, dan akan dihapus di masa mendatang."

Gavin Simpson
sumber
2
mysqli_num_fields()dan mysqli_fetch_field_direct()merupakan metode yang diperbarui
Gusstavv Gil
5

Fungsi PHP lama "mysql_list_fields ()" sudah usang. Jadi, hari ini cara terbaik untuk mendapatkan nama bidang adalah kueri "SHOW COLUMNS FROM table_name [LIKE 'name']". Jadi, inilah sedikit contohnya:

$fields = array();
$res=mysql_query("SHOW COLUMNS FROM mytable");
while ($x = mysql_fetch_assoc($res)){
  $fields[] = $x['Field'];
}
foreach ($fields as $f) { echo "<br>Field name: ".$f; }
pengguna2558588
sumber
4
function get_col_names(){  
    $sql = "SHOW COLUMNS FROM tableName";  
    $result = mysql_query($sql);     
    while($record = mysql_fetch_array($result)){  
     $fields[] = $record['0'];  
    }
    foreach ($fields as $value){  
      echo 'column name is : '.$value.'-';  
}  
 }  

return get_col_names();
Abdul Gaffar Shah
sumber
4

Tidak yakin apakah ini yang Anda cari, tetapi ini berhasil untuk saya:

$query = query("DESC YourTable");  
$col_names = array_column($query, 'Field');

Itu mengembalikan array sederhana dari nama kolom / nama variabel di tabel atau array Anda sebagai string, yang adalah apa yang saya butuhkan untuk membangun query MySQL secara dinamis. Rasa frustrasi saya adalah saya tidak tahu bagaimana cara mengindeks array di PHP dengan sangat baik, jadi saya tidak yakin apa yang harus dilakukan dengan hasil dari DESC atau SHOW. Semoga jawaban saya bermanfaat bagi pemula seperti saya!

Untuk memeriksa hasil: print_r($col_names);

useranon
sumber
4

ketika Anda ingin memeriksa struktur semua tabel Anda dengan beberapa yang diajukan kemudian gunakan kode ini. Dalam kueri ini saya memilih nama_kolom, nama_kolom dan nama_kolom untuk rincian lebih lanjut. Saya menggunakan order by column_type sehingga saya bisa melihatnya dengan mudah.

SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' order by DATA_TYPE;

Jika Anda ingin memeriksa hanya tipe ganda yang diajukan maka Anda dapat melakukannya dengan mudah

SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME,DATA_TYPE 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' AND DATA_TYPE like '%bigint%'  order by DATA_TYPE;

masukkan deskripsi gambar di sini

jika Anda ingin memeriksa bidang mana yang memungkinkan jenis null dll, maka Anda dapat menggunakan ini

SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME,IS_NULLABLE,DATA_TYPE 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' and DATA_TYPE like '%bigint%' and IS_NULLABLE ='NO' order by COLUMN_TYPE;

masukkan deskripsi gambar di sini

Anda ingin memeriksa lebih dari tautan ini juga membantu Anda.

https://dev.mysql.com/doc/refman/5.7/en/columns-table.html

Syafiqul Islam
sumber
Baik. Sangat membantu.
Sazzad Hissain Khan
3

TAMPILKAN KOLOM di mysql 5.1 (bukan 5.5) menggunakan tabel disk sementara.

Jadi bisa dianggap lambat untuk beberapa kasus. Setidaknya, itu dapat meningkatkan nilai Created_tmp_disk_tables Anda . Bayangkan satu tabel disk sementara untuk setiap koneksi atau setiap permintaan halaman.

SHOW COLUMNS tidak terlalu lambat, mungkin karena menggunakan cache sistem file. Phpmyadmin berkata ~ 0.5ms secara konsisten. Ini tidak seberapa dibandingkan dengan 500ms-1000ms melayani halaman wordpress. Tapi tetap saja, ada saatnya itu penting. Ada keterlibatan sistem disk, Anda tidak pernah tahu apa yang terjadi ketika server sibuk, cache penuh, hdd macet dll.

Mengambil nama kolom melalui SELECT * FROM ... LIMIT 1 adalah sekitar ~ 0,1 ms, dan dapat menggunakan cache kueri juga.

Jadi di sini adalah kode kecil saya yang dioptimalkan untuk mendapatkan nama kolom dari sebuah tabel, tanpa menggunakan kolom acara jika mungkin:

function db_columns_ar($table)
{
//returns Array('col1name'=>'col1name','col2name'=>'col2name',...)
if(!$table) return Array();
if(!is_string($table)) return Array();

global $db_columns_ar_cache;
if(!empty($db_columns_ar_cache[$table]))
    return $db_columns_ar_cache[$table];


//IMPORTANT show columns creates a temp disk table
$cols=Array();
$row=db_row_ar($q1="SELECT * FROM `$table` LIMIT 1");
if($row)
    {
    foreach($row as $name=>$val)
        $cols[$name]=$name;
    }
else
    {
    $coldata=db_rows($q2="SHOW COLUMNS FROM `$table`");
    if($coldata)
        foreach($coldata as $row)
            $cols[$row->Field]=$row->Field;
    }
$db_columns_ar_cache[$table]=$cols;
//debugexit($q1,$q2,$row,$coldata,$cols);
return $cols;
}

Catatan:

  • Selama tabel Anda baris pertama tidak mengandung rentang data megabyte, itu akan berfungsi dengan baik.
  • Nama fungsi db_rows dan db_row_ar harus diganti dengan pengaturan database spesifik Anda.
Johan
sumber
Hai Johan, saya mendapatkan pesan kesalahan: Panggil ke fungsi yang tidak ditentukan db_row_ar (), ketika saya menjalankan db_columns_ar ('myTableName');
KarlosFontana
Maaf untuk itu, saya akan mengklarifikasi dalam teks. Itu adalah nama fungsi imajiner, singkatan dari apa pun yang digunakan oleh kelas atau pengaturan database Anda untuk jenis hal itu.
Johan
3

Coba yang ini saya pribadi menggunakannya:

SHOW COLUMNS FROM $table where field REGEXP 'stock_id|drug_name' 
mohsin
sumber
1
mengapa Anda hanya memilih nama kolom "stock_id" dan "drug_name"?
Frank Bryce
bekerja untuk saya tetapi tanpa hal-hal "di mana ...". Dengan PDO: $ this-> dbHandle = PDO baru (...); $ query = 'TAMPILKAN KOLOM DARI'. $ tableName; $ stmt = $ this-> dbHandle-> query ($ query); $ results = $ stmt-> fetchAll (PDO :: FETCH_ASSOC); foreach ($ hasil sebagai $ hasil) {// lakukan sesuatu dengan setiap $ hasil}
Zaphoid
2

DI WORDPRESS:

global $wpdb;   $table_name=$wpdb->prefix.'posts';
foreach ( $wpdb->get_col( "DESC " . $table_name, 0 ) as $column_name ) {
  var_dump( $column_name );
}
T.Todua
sumber
2

Pertanyaan ini sudah tua, tetapi saya sampai di sini mencari cara untuk menemukan kueri yang diberikan nama bidangnya secara dinamis (tidak harus hanya bidang tabel). Dan karena orang terus menunjuk ini sebagai jawaban untuk tugas yang diberikan itu dalam pertanyaan terkait lainnya, saya membagikan cara saya menemukannya dapat dilakukan, menggunakan kiat Gavin Simpson:

//Function to generate a HTML table from a SQL query
function myTable($obConn,$sql)
{
    $rsResult = mysqli_query($obConn, $sql) or die(mysqli_error($obConn));
    if(mysqli_num_rows($rsResult)>0)
    {
        //We start with header. >>>Here we retrieve the field names<<<
        echo "<table width=\"100%\" border=\"0\" cellspacing=\"2\" cellpadding=\"0\"><tr align=\"center\" bgcolor=\"#CCCCCC\">";
        $i = 0;
        while ($i < mysqli_num_fields($rsResult)){
           $field = mysqli_fetch_field_direct($rsResult, $i);
           $fieldName=$field->name;
           echo "<td><strong>$fieldName</strong></td>";
           $i = $i + 1;
        }
        echo "</tr>"; 
        //>>>Field names retrieved<<<

        //We dump info
        $bolWhite=true;
        while ($row = mysqli_fetch_assoc($rsResult)) {
            echo $bolWhite ? "<tr bgcolor=\"#CCCCCC\">" : "<tr bgcolor=\"#FFF\">";
            $bolWhite=!$bolWhite;
            foreach($row as $data) {
                echo "<td>$data</td>";
            }
            echo "</tr>";
        }
        echo "</table>";
    }
}

Ini dapat dengan mudah diubah untuk memasukkan nama bidang dalam array.

Menggunakan sederhana: $sql="SELECT * FROM myTable LIMIT 1"dapat memberi Anda bidang tabel apa pun, tanpa perlu menggunakan SHOW COLUMNSatau modul php tambahan, jika diperlukan (menghapus bagian dump data).

Semoga ini bisa membantu orang lain.

Gusstavv Gil
sumber
2

jika Anda menggunakan php, gunakan intisari ini .

itu bisa mendapatkan pilih bidang info lengkap tanpa hasil, dan semua bidang khusus seperti:

SELECT a.name aname, b.name bname, b.* 
FROM table1 a LEFT JOIN table2 b
ON a.id = b.pid;

jika sql di atas tidak mengembalikan data, juga akan mendapatkan nama bidang aname, bname, nama bidang b lainnya

hanya dua baris:

$query_info = mysqli_query($link, $data_source);
$fetch_fields_result = $query_info->fetch_fields();
zhi.yang
sumber
2

Kueri ini mengambil daftar semua kolom dalam database tanpa harus menentukan nama tabel. Ini mengembalikan daftar nama kolom saja:

SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_schema = 'db_name'

Namun, ketika saya menjalankan kueri ini di phpmyadmin, ia menampilkan serangkaian kesalahan. Meskipun demikian, itu berhasil. Jadi gunakan dengan hati-hati.


sumber
2

Solusi paling sederhana dari semua Jawaban:

DESC `table name`

atau

DESCRIBE `table name`

atau

SHOW COLUMNS FROM `table name`
Gil Baggio
sumber
2

jika Anda hanya perlu nama dan tipe bidang (mungkin agar mudah menyalin-paste ke Excel):

SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA='databasenamegoeshere'
AND DATA_TYPE='decimal' and TABLE_NAME = 'tablenamegoeshere'

menghapus

DATA_TYPE='decimal'

jika Anda ingin semua tipe data

Amir No-Family
sumber
1

saya bukan ahli, tetapi ini bekerja untuk saya ..

$sql = "desc MyTable";
$result = @mysql_query($sql);
while($row = @mysql_fetch_array($result)){
    echo $row[0]."<br>"; // returns the first column of array. in this case Field

      // the below code will return a full array-> Field,Type,Null,Key,Default,Extra    
      // for ($c=0;$c<sizeof($row);$c++){echo @$row[$c]."<br>";}    

}
Ad Kahn
sumber
0

Saya telah mencoba kueri ini di SQL Server dan ini berhasil untuk saya:

SELECT name FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('table_name')
Purvi Barot
sumber