วิธีใดคือวิธีที่ดีที่สุดในการตรวจสอบว่ามีตารางอยู่ใน MySQL หรือไม่ (ควรใช้ PDO ใน PHP) โดยไม่ต้องมีข้อยกเว้น ฉันไม่รู้สึกเหมือนกำลังแยกวิเคราะห์ผลลัพธ์ของ "SHOW TABLES LIKE" และอื่น ๆ ต้องมีแบบสอบถามบูลีนบ้างไหม?
วิธีใดคือวิธีที่ดีที่สุดในการตรวจสอบว่ามีตารางอยู่ใน MySQL หรือไม่ (ควรใช้ PDO ใน PHP) โดยไม่ต้องมีข้อยกเว้น ฉันไม่รู้สึกเหมือนกำลังแยกวิเคราะห์ผลลัพธ์ของ "SHOW TABLES LIKE" และอื่น ๆ ต้องมีแบบสอบถามบูลีนบ้างไหม?
คำตอบ:
ฉันไม่ทราบไวยากรณ์ PDO แต่ดูเหมือนจะตรงไปตรงมา:
$result = mysql_query("SHOW TABLES LIKE 'myTable'");
$tableExists = mysql_num_rows($result) > 0;
mysql_*
ฟังก์ชั่นที่พวกเขาจะยกเลิกอย่างเป็นทางการ , ไม่มีการบำรุงรักษาและจะถูกลบออกในอนาคต คุณควรอัปเดตโค้ดของคุณด้วยPDOหรือMySQLiเพื่อให้แน่ใจว่าการทำงานของโครงการของคุณในอนาคต
หากคุณใช้ MySQL 5.0 ขึ้นไปคุณสามารถลอง:
SELECT COUNT(*)
FROM information_schema.tables
WHERE table_schema = '[database name]'
AND table_name = '[table name]';
ผลลัพธ์ใด ๆ ที่ระบุว่ามีตารางอยู่
จาก: http://www.electrictoolbox.com/check-if-mysql-table-exists/
ใช้ mysqli ฉันได้สร้างฟังก์ชันต่อไปนี้ เนื่องจากคุณมีอินสแตนซ์ mysqli ที่เรียกว่า $ con
function table_exist($table){
global $con;
$table = $con->real_escape_string($table);
$sql = "show tables like '".$table."'";
$res = $con->query($sql);
return ($res->num_rows > 0);
}
หวังว่าจะช่วยได้
คำเตือน:ตามที่ @jcaron ฟังก์ชั่นนี้อาจเสี่ยงต่อการแนบ sqlinjection ดังนั้นตรวจสอบให้แน่ใจว่า$table
var ของคุณสะอาดหรือใช้การสืบค้นที่กำหนดพารามิเตอร์ได้ดียิ่งขึ้น
โพสต์นี้ง่ายๆถ้าใครมาหาคำถามนี้ แม้ว่าจะได้รับคำตอบเล็กน้อย คำตอบบางส่วนทำให้ซับซ้อนกว่าที่ควรจะเป็น
สำหรับ mysql * ฉันใช้:
if (mysqli_num_rows(
mysqli_query(
$con,"SHOW TABLES LIKE '" . $table . "'")
) > 0
or die ("No table set")
){
ใน PDO ฉันใช้:
if ($con->query(
"SHOW TABLES LIKE '" . $table . "'"
)->rowCount() > 0
or die("No table set")
){
ด้วยสิ่งนี้ฉันแค่ดันเงื่อนไขอื่นเข้าไปหรือ และสำหรับความต้องการของฉันฉันเพียงแค่ต้องการตาย แม้ว่าคุณสามารถตั้งค่าหรือสิ่งอื่น ๆ บางคนอาจชอบ if / else if / else ซึ่งจะนำออกหรือแล้วจัดหา if / else if / else
นี่คือวิธีแก้ปัญหาของฉันที่ฉันชอบเมื่อใช้กระบวนงานที่เก็บไว้ ฟังก์ชัน mysql ที่กำหนดเองสำหรับตรวจสอบตารางที่มีอยู่ในฐานข้อมูลปัจจุบัน
delimiter $$
CREATE FUNCTION TABLE_EXISTS(_table_name VARCHAR(45))
RETURNS BOOLEAN
DETERMINISTIC READS SQL DATA
BEGIN
DECLARE _exists TINYINT(1) DEFAULT 0;
SELECT COUNT(*) INTO _exists
FROM information_schema.tables
WHERE table_schema = DATABASE()
AND table_name = _table_name;
RETURN _exists;
END$$
SELECT TABLE_EXISTS('you_table_name') as _exists
เนื่องจาก "แสดงตาราง" อาจทำงานช้าในฐานข้อมูลขนาดใหญ่ขอแนะนำให้ใช้ "DESCRIBE" และตรวจสอบว่าผลลัพธ์เป็นจริง / เท็จหรือไม่
$tableExists = mysqli_query("DESCRIBE `myTable`");
$q = "SHOW TABLES";
$res = mysql_query($q, $con);
if ($res)
while ( $row = mysql_fetch_array($res, MYSQL_ASSOC) )
{
foreach( $row as $key => $value )
{
if ( $value = BTABLE ) // BTABLE IS A DEFINED NAME OF TABLE
echo "exist";
else
echo "not exist";
}
}
กรอบ Zend
public function verifyTablesExists($tablesName)
{
$db = $this->getDefaultAdapter();
$config_db = $db->getConfig();
$sql = "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{$config_db['dbname']}' AND table_name = '{$tablesName}'";
$result = $db->fetchRow($sql);
return $result;
}
หากเหตุผลที่ต้องการทำคือการสร้างตารางแบบมีเงื่อนไข 'สร้างตารางหากไม่มีอยู่' ดูเหมือนจะเหมาะสำหรับงานนั้น จนกระทั่งฉันค้นพบสิ่งนี้ฉันจึงใช้เมธอด 'DESCRIBE' ด้านบน ข้อมูลเพิ่มเติมที่นี่: MySQL "สร้างตารางถ้าไม่มีอยู่" -> ข้อผิดพลาด 1050
ทำไมคุณถึงทำให้มันยากที่จะเข้าใจ?
function table_exist($table){
$pTableExist = mysql_query("show tables like '".$table."'");
if ($rTableExist = mysql_fetch_array($pTableExist)) {
return "Yes";
}else{
return "No";
}
}