MySQL, bir istisna atmadan bir tablo olup olmadığını kontrol edin


123

Bir istisna atmadan MySQL'de bir tablonun (tercihen PHP'de PDO aracılığıyla) olup olmadığını kontrol etmenin en iyi yolu nedir? "TABLOLARI GİBİ GÖSTER" vb. Sonuçların ayrıştırılmasını istemiyorum. Bir çeşit boole sorgusu olmalı?

Yanıtlar:


199

Bunun için PDO sözdizimini bilmiyorum, ancak bu oldukça basit görünüyor:

$result = mysql_query("SHOW TABLES LIKE 'myTable'");
$tableExists = mysql_num_rows($result) > 0;

teşekkürler, TABLOLAR GİBİ
GÖSTER'in

53
PDO: $ tableExists = $ db-> query ("'myTable' GİBİ TABLOLARI GÖSTER") -> rowCount ()> 0;
Reactgular

4
mysqli: if ($ db-> query ("'myTable' GİBİ TABLOLARI GÖSTER") -> num_rows == 0) {// tablo oluştur}
zPuls3

1
@MathewFoscarini, rowCount () bu durumda güvenilir olmayabilir, PHP belgesine bakın .
datasn.io

4
Orada artık destek için mysql_*fonksiyonlar, bunlar edilir resmi olarak artık , artık korunur ve olacaktır kaldırıldı gelecekte. Gelecekte projenizin işlevselliğini sağlamak için kodunuzu PDO veya MySQLi ile güncellemelisiniz .
TRiG

39

MySQL 5.0 ve sonraki bir sürümünü kullanıyorsanız şunları deneyebilirsiniz:

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

Herhangi bir sonuç tablonun var olduğunu gösterir.

Gönderen: http://www.electrictoolbox.com/check-if-mysql-table-exists/


belki bir şey kaçırıyorum, ama neden bu yöntemi SHOW TABLES üzerinden kullanasınız?
nickf

1
@nickf Ansi standardının bir parçasıdır, bu nedenle farklı rdbms'ler arasında taşınabilir.
troelskn

@nickf: MySQL dışındaki veri tabanlarında da çalışır. Anladığım kadarıyla buna PostgreSQL ve SQL Server dahildir.
Powerlord

bunun bir güvenlik açığı olup olmadığını merak ederek, bağlı olmadığınız veritabanlarından bilgi sorgulayabilirsiniz ...
Talvi Watia

3
Güvenlik riski yoktur - Information_schema veritabanına yapılan sorgular yalnızca bağlı kullanıcının ayrıcalıklarına sahip olduğu tabloları gösterir.
Warren Rumak

8

Mysqli kullanarak aşağıdaki işlevi oluşturdum. Demek ki $ con adında bir mysqli örneğiniz var.

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

Umarım yardımcı olur.

Uyarı: @jcaron tarafından önerildiği üzere, bu işlev sqlinjection saldırılarına karşı savunmasız olabilir, bu nedenle var'ınızın $tabletemiz olduğundan emin olun veya daha iyi parametreli sorgular kullanın.


Yalnızca birinin $ table varlığını doldurmasına izin verirseniz, bir sql ifadesindeki her değişken tehlikeli değildir, yalnızca verileri güvenilmeyen kaynaklardan alırsanız. Elbette işlevi nasıl kullandığınızdan ve filtrelemeyi nasıl yaptığınızdan siz sorumlusunuz. bu yanıta olumsuz oy vermeye gerek yoktur.
Falk

Böyle bir kod yayınlarsanız, birileri onu verilerin düzgün bir şekilde kontrol edilmediği bir yerde kullanacak ve sonunda bir SQL enjeksiyonu ile sonuçlanacaktır. Parametreli istekleri kullanın ve veriler kontrol edilmiş olsun ya da olmasın herhangi bir sorunu önleyeceksiniz. Burada yapmamak için hiçbir sebep yok, sadece kötü bir uygulama.
jcaron

Bir real_escape_string eklemeye ne dersiniz?
Falk

Parametreli sorgular kullanın ve korku hikayelerinden kaçının.
jcaron

4

Bu soruyu arayan biri gelirse bu sadece yayınlanır. Biraz cevaplanmış olsa da. Bazı yanıtlar, olayı olması gerekenden daha karmaşık hale getiriyor.

Mysql için * kullandım:

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

PDO'da kullandım:

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

Bununla sadece else koşulunu veya içine itiyorum. Ve ihtiyaçlarım için sadece ölmeye ihtiyacım var. Yine de başka şeyler ayarlayabilirsin. Bazıları if / else if / else'i tercih edebilir. Bu, sonra veya kaldırmak ve sonra if / else if / else sağlamaktır.


3

İşte saklı yordamları kullanırken tercih ettiğim çözümüm. Mevcut veritabanında tablonun mevcut olup olmadığını kontrol etmek için özel mysql işlevi.

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

2

Daha büyük veritabanlarında "Tabloları göster" yavaş olabileceğinden, "AÇIKLAMA" kullanmanızı ve sonuç olarak doğru / yanlış olup olmadığınızı kontrol etmenizi öneririm

$tableExists = mysqli_query("DESCRIBE `myTable`");

Okuduklarımdan 'GÖSTER' etkisiz hale gelirse, o zaman 'bilgi_seması' 'AÇIKLAMA' yerine daha çok tercih edilir.
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";
    }
}

2
En iyi yanıt kalitesini sağlamak için lütfen kod için doğru yorum ekleyin. Basitçe bir kod yapıştırın, soru yazarına pek bir şey söylemez.
Jakub Matczak

5
Bu aslında korkunç. Yani 50.000 tablo varsa, tüm tabloları yüklersiniz, doğru tablonun var olup olmadığını bulmak için her birinde döngü olur musunuz?
Rohit Chopra

-1

Zend çerçevesi

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;

    }


-9

Neden anlamayı bu kadar zorlaştırıyorsun?

function table_exist($table){ 
    $pTableExist = mysql_query("show tables like '".$table."'");
    if ($rTableExist = mysql_fetch_array($pTableExist)) {
        return "Yes";
    }else{
        return "No";
    }
} 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.