ฉันต้องการให้ชื่อคอลัมน์ของตาราง mysql ทั้งหมดเป็นอาร์เรย์ใน php หรือไม่
มีคำถามสำหรับสิ่งนี้หรือไม่?
ฉันต้องการให้ชื่อคอลัมน์ของตาราง mysql ทั้งหมดเป็นอาร์เรย์ใน php หรือไม่
มีคำถามสำหรับสิ่งนี้หรือไม่?
คำตอบ:
วิธีที่ดีที่สุดคือใช้ฐานข้อมูลเสมือน metadata ของInformation_SCHEMA เฉพาะตารางInformation_SCHEMA.COLUMNS ...
SELECT `COLUMN_NAME`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA`='yourdatabasename'
AND `TABLE_NAME`='yourtablename';
มันมีประสิทธิภาพมากและสามารถให้ข้อมูลมากมายโดยไม่จำเป็นต้องแยกวิเคราะห์ข้อความ (เช่นประเภทคอลัมน์ไม่ว่าคอลัมน์จะเป็นโมฆะขนาดคอลัมน์สูงสุดชุดอักขระ ฯลฯ ) ...
โอ้และเป็นมาตรฐาน SQL (ในขณะที่ SHOW ...
เป็นส่วนขยายเฉพาะ MySQL) ...
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความแตกต่างระหว่างSHOW...
และการใช้INFORMATION_SCHEMA
ตารางตรวจสอบ MySQL เอกสารINFORMATION_SCHEMA
ในทั่วไป ...
SET @@SESSION.sql_mode = 'ANSI_QUOTES';
มือก่อนหน้าได้เช่นกัน แต่ฉันไม่ชอบมัน และฉันก็ไม่มีปัญหากับ back-ticks สำหรับการกำหนดตัวคั่น ในความเป็นจริงฉันชอบพวกเขาดีกว่าอัญประกาศคู่ (อัญประกาศคู่ทำให้แบบสอบถามรู้สึกผิดกับฉัน) ... สำหรับแต่ละคนของพวกเขา ...
คุณสามารถใช้แบบสอบถามต่อไปนี้สำหรับ MySQL:
SHOW columns FROM your-table;
ด้านล่างเป็นตัวอย่างรหัสที่แสดงวิธีการใช้งานด้านบนไวยากรณ์ใน php เพื่อแสดงชื่อของคอลัมน์:
$sql = "SHOW COLUMNS FROM your-table";
$result = mysqli_query($conn,$sql);
while($row = mysqli_fetch_array($result)){
echo $row['Field']."<br>";
}
สำหรับรายละเอียดเกี่ยวกับผลลัพธ์ของการSHOW COLUMNS FROM TABLE
เข้าชม: MySQL Refrence
DESC TableName;
;-)
ดูเหมือนว่ามี 2 วิธี:
DESCRIBE `tablename`
หรือ
SHOW COLUMNS FROM `tablename`
เพิ่มเติมเกี่ยวกับDESCRIBE
ที่นี่: http://dev.mysql.com/doc/refman/5.0/en/describe.html
DESCRIBE
SHOW COLUMNS FROM
DESC
เป็นมือที่สั้นกว่าสำหรับDESCRIBE
!
ฉันเคยทำมาแล้วในอดีต
SELECT column_name
FROM information_schema.columns
WHERE table_name='insert table name here';
แก้ไข : วันนี้ฉันเรียนรู้วิธีที่ดีกว่าในการทำสิ่งนี้ โปรดดูคำตอบของ ircmaxell
แยกวิเคราะห์ผลลัพธ์ของ SHOW COLUMNS FROM table;
นี่คือเพิ่มเติมเกี่ยวกับที่นี่: http://dev.mysql.com/doc/refman/5.0/en/show-columns.html
ใช้mysql_fetch_field()
เพื่อดูข้อมูลคอลัมน์ทั้งหมด ดูคู่มือ
$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;
}
"คำเตือนส่วนขยายนี้เลิกใช้ตั้งแต่ PHP 5.5.0 และจะถูกลบออกในอนาคต"
mysqli_num_fields()
และmysqli_fetch_field_direct()
เป็นวิธีการอัพเดท
ฟังก์ชัน PHP เก่า "mysql_list_fields ()" เลิกใช้แล้ว ดังนั้นวันนี้วิธีที่ดีที่สุดในการรับชื่อเขตข้อมูลคือข้อความค้นหา "แสดงคอลัมน์จาก table_name [LIKE 'name']" ดังนั้นนี่คือตัวอย่างเล็ก ๆ น้อย ๆ :
$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; }
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();
ไม่แน่ใจว่านี่คือสิ่งที่คุณกำลังมองหาหรือไม่ แต่สิ่งนี้ได้ผลกับฉัน:
$query = query("DESC YourTable");
$col_names = array_column($query, 'Field');
ที่ส่งกลับอาร์เรย์แบบง่าย ๆ ของชื่อคอลัมน์ / ชื่อตัวแปรในตารางหรืออาร์เรย์ของคุณเป็นสตริงซึ่งเป็นสิ่งที่ฉันต้องการในการสร้างแบบสอบถาม MySQL แบบไดนามิก ความยุ่งยากของฉันคือฉันไม่รู้วิธีทำดัชนีอาร์เรย์ใน PHP เป็นอย่างดีดังนั้นฉันไม่แน่ใจว่าจะทำอย่างไรกับผลลัพธ์จาก DESC หรือ SHOW หวังว่าคำตอบของฉันจะเป็นประโยชน์สำหรับผู้เริ่มต้นเช่นฉัน!
วิธีตรวจสอบผลลัพธ์: print_r($col_names);
เมื่อคุณต้องการตรวจสอบโครงสร้างตารางทั้งหมดของคุณด้วยการยื่นบางส่วนจากนั้นใช้รหัสนี้ ในแบบสอบถามนี้ฉันเลือก column_name, column_type และ table_name สำหรับรายละเอียดเพิ่มเติม ฉันใช้คำสั่งซื้อโดย column_type เพื่อให้สามารถดูได้อย่างง่ายดาย
SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA`='yourdatabasename' order by DATA_TYPE;
หากคุณต้องการตรวจสอบเพียงประเภทสองประเภทที่ยื่นจากนั้นคุณสามารถทำได้อย่างง่ายดาย
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;
ถ้าคุณต้องการตรวจสอบว่าเขตข้อมูลใดที่อนุญาตให้มีประเภท null และอื่น ๆ คุณสามารถใช้มันได้
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;
คุณต้องการตรวจสอบเพิ่มเติมแล้วลิงค์ thik ยังช่วยคุณ
SHOW COLUMNSใน mysql 5.1 (ไม่ใช่ 5.5) ใช้ตารางดิสก์ชั่วคราว
ดังนั้นจึงถือได้ว่าช้าในบางกรณี อย่างน้อยก็สามารถชนค่าcreated_tmp_disk_tablesของคุณได้ ลองนึกภาพหนึ่งตารางดิสก์ชั่วคราวต่อการเชื่อมต่อหรือตามคำขอของแต่ละหน้า
แสดงคอลัมน์ไม่ช้ามากอาจเป็นเพราะใช้แคชของระบบไฟล์ Phpmyadmin พูดว่า ~ 0.5ms อย่างสม่ำเสมอ นี่คือไม่มีอะไรเทียบกับ 500ms-1000ms ของการให้บริการหน้า wordpress แต่ก็ยังมีบางครั้งมันเป็นเรื่องสำคัญ มีการมีส่วนร่วมของระบบดิสก์คุณไม่เคยรู้ว่าจะเกิดอะไรขึ้นเมื่อเซิร์ฟเวอร์ไม่ว่างแคชเต็ม HDD อยู่จนครบ ฯลฯ
กำลังเรียกชื่อคอลัมน์ผ่านSELECT * FROM ... LIMIT 1ประมาณ ~ 0.1ms และสามารถใช้คิวแคชได้เช่นกัน
ดังนั้นนี่คือรหัสที่ดีที่สุดของฉันเล็กน้อยเพื่อรับชื่อคอลัมน์จากตารางโดยไม่ต้องใช้คอลัมน์แสดงถ้าเป็นไปได้:
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;
}
หมายเหตุ:
ลองใช้ตัวนี้ฉันใช้เอง:
SHOW COLUMNS FROM $table where field REGEXP 'stock_id|drug_name'
ใน WORDPRESS:
global $wpdb; $table_name=$wpdb->prefix.'posts';
foreach ( $wpdb->get_col( "DESC " . $table_name, 0 ) as $column_name ) {
var_dump( $column_name );
}
คำถามนี้เก่า แต่ฉันมาที่นี่เพื่อค้นหาวิธีค้นหาข้อความค้นหาที่ระบุในชื่อแบบไดนามิก (ไม่ใช่เฉพาะฟิลด์ของตาราง) และเนื่องจากผู้คนชี้ให้เห็นว่านี่เป็นคำตอบสำหรับงานที่มอบหมายในคำถามที่เกี่ยวข้องอื่น ๆ ฉันแบ่งปันวิธีที่ฉันพบว่าทำได้โดยใช้เคล็ดลับของ 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>";
}
}
สามารถปรับเปลี่ยนชื่อฟิลด์ในอาเรย์ได้อย่างง่ายดาย
การใช้ง่าย: $sql="SELECT * FROM myTable LIMIT 1"
สามารถให้ฟิลด์ของตารางใด ๆ แก่คุณโดยไม่จำเป็นต้องใช้SHOW COLUMNS
หรือโมดูล php พิเศษใด ๆ หากจำเป็น (ลบส่วนการถ่ายโอนข้อมูล)
หวังว่านี่จะช่วยคนอื่นได้
ถ้าคุณใช้ PHP ให้ใช้ส่วนสำคัญนี้
สามารถรับข้อมูลเต็มฟิลด์ที่เลือกโดยไม่มีผลลัพธ์ fields และฟิลด์ที่กำหนดเองทั้งหมดเช่น:
SELECT a.name aname, b.name bname, b.*
FROM table1 a LEFT JOIN table2 b
ON a.id = b.pid;
ถ้าด้านบน sql ไม่ส่งคืนข้อมูลจะได้รับชื่อฟิลด์ชื่อ, bname, ชื่อเขตข้อมูลอื่นของ b
แค่สองบรรทัด:
$query_info = mysqli_query($link, $data_source);
$fetch_fields_result = $query_info->fetch_fields();
แบบสอบถามนี้ดึงรายการของคอลัมน์ทั้งหมดในฐานข้อมูลโดยไม่ต้องระบุชื่อตาราง จะส่งคืนรายการชื่อคอลัมน์เท่านั้น:
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_schema = 'db_name'
อย่างไรก็ตามเมื่อฉันรันเคียวรีนี้ใน phpmyadmin มันจะแสดงชุดข้อผิดพลาด อย่างไรก็ตามมันใช้งานได้ ดังนั้นใช้ด้วยความระมัดระวัง
ทางออกที่ง่ายที่สุดจากคำตอบทั้งหมด:
DESC `table name`
หรือ
DESCRIBE `table name`
หรือ
SHOW COLUMNS FROM `table name`
หากคุณต้องการชื่อฟิลด์และประเภท (อาจจะง่ายต่อการคัดลอกลงใน Excel):
SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA='databasenamegoeshere'
AND DATA_TYPE='decimal' and TABLE_NAME = 'tablenamegoeshere'
ลบ
DATA_TYPE='decimal'
ถ้าคุณต้องการชนิดข้อมูลทั้งหมด
ฉันไม่มีความเชี่ยวชาญ แต่สิ่งนี้ใช้ได้ผลสำหรับฉัน ..
$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>";}
}
ฉันได้ลองใช้แบบสอบถามนี้ใน SQL Server และทำงานให้ฉัน:
SELECT name FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('table_name')