MySQL memeriksa apakah tabel ada tanpa mengeluarkan pengecualian

123

Apa cara terbaik untuk memeriksa apakah tabel ada di MySQL (sebaiknya melalui PDO di PHP) tanpa membuat pengecualian. Saya tidak ingin mem-parsing hasil "SHOW TABLES LIKE" dan sebagainya. Harus ada semacam kueri boolean?

klip
sumber

Jawaban:

199

Saya tidak tahu sintaks PDO untuk itu, tetapi ini tampaknya cukup mudah:

$result = mysql_query("SHOW TABLES LIKE 'myTable'");
$tableExists = mysql_num_rows($result) > 0;
nickf
sumber
terima kasih, benar-benar lupa bahwa TAMPILKAN TABEL LIKE dapat dibatasi hanya untuk satu tabel saja
klip
53
PDO: $ tableExists = $ db-> query ("SHOW TABLES LIKE 'myTable'") -> rowCount ()> 0;
Reactgular
4
mysqli: if ($ db-> query ("SHOW TABLES LIKE 'myTable'") -> num_rows == 0) {// create table}
zPuls3
1
@MathewFoscarini, rowCount () mungkin tidak dapat diandalkan dalam kasus ini, lihat dokumen PHP .
datasetn.io
4
Tidak ada lagi dukungan untuk mysql_*fungsi, fungsi tersebut secara resmi tidak digunakan lagi , tidak lagi dipertahankan, dan akan dihapus di masa mendatang. Anda harus memperbarui kode Anda dengan PDO atau MySQLi untuk memastikan fungsionalitas proyek Anda di masa mendatang.
TRiG
39

Jika Anda menggunakan MySQL 5.0 dan yang lebih baru, Anda dapat mencoba:

SELECT COUNT(*)
FROM information_schema.tables 
WHERE table_schema = '[database name]' 
AND table_name = '[table name]';

Hasil apapun menunjukkan tabel tersebut ada.

Dari: http://www.electrictoolbox.com/check-if-mysql-table-exists/

Michael Todd
sumber
mungkin saya melewatkan sesuatu, tetapi mengapa Anda menggunakan metode ini di SHOW TABLES?
nickf
1
@nickf Ini bagian dari standar ansi, jadi portabel antara rdbms'es yang berbeda.
troelskn
@nickf: Ini juga berfungsi pada database selain MySQL. Ini termasuk PostgreSQL dan SQL Server sejauh yang saya tahu.
Powerlord
bertanya-tanya apakah ini adalah eksploitasi keamanan, Anda dapat meminta informasi dari database yang tidak terhubung dengan Anda ...
Talvi Watia
3
Tidak ada risiko keamanan - Kueri ke database information_schema hanya akan menampilkan tabel yang memiliki hak istimewa untuk pengguna yang terhubung.
Warren Rumak
8

Menggunakan mysqli saya telah membuat fungsi berikut. Dengan asumsi Anda memiliki instance mysqli yang disebut $ 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);
}

Semoga membantu.

Peringatan: seperti yang disarankan oleh @jcaron, fungsi ini bisa jadi rentan terhadap sqlinjection attacs, jadi pastikan $tablevar Anda bersih atau bahkan lebih baik gunakan kueri berparameterisasi .

Falk
sumber
Hanya jika Anda mengizinkan seseorang mengisi $ table var, tidak setiap var di dalam statment sql berbahaya, hanya jika Anda mendapatkan data dari sumber yang tidak tepercaya. Tentu saja Anda bertanggung jawab atas bagaimana Anda menggunakan fungsi dan melakukan penyaringan. tidak perlu meremehkan jawaban ini.
Falk
Jika Anda memublikasikan kode seperti ini, seseorang akan menggunakannya di tempat yang datanya belum diperiksa dengan benar, dan akan berakhir dengan injeksi SQL. Cukup gunakan permintaan berparameter, dan Anda akan menghindari masalah apa pun, baik data telah diperiksa atau belum. Tidak ada alasan apapun untuk tidak melakukannya di sini, itu hanya praktik yang buruk.
jcaron
Bagaimana jika menambahkan real_escape_string?
Falk
Gunakan kueri berparameter dan hindari cerita horor.
jcaron
4

Ini diposting hanya jika ada yang datang mencari pertanyaan ini. Meski sudah terjawab sedikit. Beberapa balasan membuatnya lebih kompleks dari yang seharusnya.

Untuk mysql * saya menggunakan:

if (mysqli_num_rows(
    mysqli_query(
                    $con,"SHOW TABLES LIKE '" . $table . "'")
                ) > 0
        or die ("No table set")
    ){

Di PDO saya menggunakan:

if ($con->query(
                   "SHOW TABLES LIKE '" . $table . "'"
               )->rowCount() > 0
        or die("No table set")
   ){

Dengan ini saya hanya mendorong kondisi lain ke dalam atau. Dan untuk kebutuhan saya, saya hanya perlu mati. Padahal Anda bisa mengatur atau untuk hal lain. Beberapa mungkin lebih suka jika / lain jika / lain. Yang kemudian menghapus atau dan kemudian menyediakan if / else if / else.

Esoterica
sumber
3

Inilah solusi saya yang saya sukai saat menggunakan prosedur tersimpan. Fungsi mysql kustom untuk memeriksa tabel yang ada di database saat ini.

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
erandac
sumber
2

Karena "Tampilkan tabel" mungkin lambat pada database yang lebih besar, saya sarankan untuk menggunakan "DESCRIBE" dan periksa apakah Anda mendapatkan true / false sebagai hasilnya

$tableExists = mysqli_query("DESCRIBE `myTable`");
Martin Lisicki
sumber
Dari apa yang saya baca jika 'SHOW' menjadi tidak efisien maka 'information_schema' lebih disukai daripada 'DESCRIBE'.
Esoterica
-1
$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";
    }
}
Mentega namkeen
sumber
2
Tolong tambahkan komentar yang akurat untuk kode untuk memberikan kualitas jawaban terbaik. Cukup tempelkan beberapa kode tidak memberi tahu banyak kepada penulis pertanyaan.
Jakub Matczak
5
Ini sebenarnya mengerikan. Jadi jika ada 50.000 tabel, Anda akan memuat semua tabel, mengulang setiap tabel untuk menemukan apakah tabel yang benar ada?
Rohit Chopra
-1

Kerangka 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;

    }
gilcierweb.dll
sumber
-1

Jika alasan Anda ingin melakukan ini adalah pembuatan tabel bersyarat, maka 'BUAT TABEL JIKA TIDAK ADA' tampaknya ideal untuk pekerjaan itu. Sampai saya menemukan ini, saya menggunakan metode 'DESCRIBE' di atas. Info lebih lanjut di sini: MySQL "CREATE TABLE IF NOT EXISTS" -> Error 1050

Robin Andrews
sumber
-9

Mengapa Anda membuatnya begitu sulit untuk dipahami?

function table_exist($table){ 
    $pTableExist = mysql_query("show tables like '".$table."'");
    if ($rTableExist = mysql_fetch_array($pTableExist)) {
        return "Yes";
    }else{
        return "No";
    }
} 
Hamed
sumber