MySQL controlla se esiste una tabella senza generare un'eccezione


123

Qual è il modo migliore per verificare se una tabella esiste in MySQL (preferibilmente tramite PDO in PHP) senza lanciare un'eccezione. Non ho voglia di analizzare i risultati di "SHOW TABLES LIKE" eccetera. Deve esserci una sorta di query booleana?

Risposte:


199

Non conosco la sintassi PDO per questo, ma sembra piuttosto semplice:

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

grazie, dimenticavo completamente che SHOW TABLES LIKE potrebbe essere limitato a un solo tavolo esatto
clops

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 () potrebbe non essere affidabile in questo caso, vedere il documento PHP .
datasn.io

4
Non c'è più supporto per le mysql_*funzioni, sono ufficialmente deprecate , non più mantenute e verranno rimosse in futuro. È necessario aggiornare il codice con PDO o MySQLi per garantire la funzionalità del progetto in futuro.
TRiG

39

Se stai usando MySQL 5.0 e versioni successive, potresti provare:

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

Qualsiasi risultato indica che la tabella esiste.

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


forse mi manca qualcosa, ma perché dovresti usare questo metodo su SHOW TABLES?
nickf

1
@nickf Fa parte dello standard ansi, quindi è portabile tra diversi rdbms.
troelskn

@nickf: funziona anche su database diversi da MySQL. Questo include PostgreSQL e SQL Server per quanto ne so.
Powerlord

chiedendoti se questo è un exploit di sicurezza puoi
richiedere

3
Non vi è alcun rischio per la sicurezza: le query al database information_schema mostreranno solo le tabelle per le quali l'utente connesso dispone dei privilegi.
Warren Rumak

8

Usando mysqli ho creato la seguente funzione. Supponendo che tu abbia un'istanza mysqli chiamata $ 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);
}

Spero che sia d'aiuto.

Attenzione: come suggerito da @jcaron questa funzione potrebbe essere vulnerabile agli attacchi sqlinjection, quindi assicurati che la tua $tablevar sia pulita o ancora meglio usa query parametrizzate.


Solo se permetti a qualcuno di riempire la $ table var, non tutte le var all'interno di un'istruzione sql sono pericolose, solo se ottieni i dati da fonti non attendibili. Ovviamente sei responsabile di come usi la funzione e fai il filtro. non è necessario sottoporre a voto negativo questa risposta.
Falk

Se pubblichi codice come questo, qualcuno finirà per usarlo in un luogo in cui i dati non sono stati controllati correttamente e finirà con un'iniezione SQL. Usa semplicemente richieste parametrizzate ed eviterai qualsiasi problema, sia che i dati siano stati controllati o meno. Non c'è alcun motivo per non farlo qui, è solo una cattiva pratica.
jcaron

Che ne dici di aggiungere una real_escape_string?
Falk

Usa query parametrizzate ed evita le storie dell'orrore.
jcaron

4

Questo viene pubblicato semplicemente se qualcuno viene a cercare questa domanda. Anche se è stato risposto un po '. Alcune delle risposte lo rendono più complesso del dovuto.

Per mysql * ho usato:

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

Nella DOP ho usato:

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

Con questo inserisco semplicemente la condizione else in o. E per i miei bisogni ho solo bisogno di morire. Sebbene tu possa impostare o ad altre cose. Alcuni potrebbero preferire il if / else if / else. Che è quindi rimuovere o e quindi fornire if / else if / else.


3

Ecco la mia soluzione che preferisco quando utilizzo le stored procedure. Funzione mysql personalizzata per verificare che la tabella esista nel database corrente.

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

Poiché "Mostra tabelle" potrebbe essere lento su database più grandi, ti consiglio di utilizzare "DESCRIBE" e controlla se ottieni come risultato vero / falso

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

Da quello che ho letto se "SHOW" diventa inefficiente, "information_schema" è più preferito a "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";
    }
}

2
Si prega di aggiungere un commento accurato affinché il codice fornisca la migliore qualità di risposta. Incollare semplicemente un po 'di codice non dice molto all'autore della domanda.
Jakub Matczak

5
Questo è davvero orribile. Quindi, se ci sono 50.000 tabelle, carichereste tutte le tabelle, scorrereste ciascuna di esse per scoprire se esiste la tabella corretta?
Rohit Chopra

-1

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

    }


-9

Perché lo rendi così difficile da capire?

function table_exist($table){ 
    $pTableExist = mysql_query("show tables like '".$table."'");
    if ($rTableExist = mysql_fetch_array($pTableExist)) {
        return "Yes";
    }else{
        return "No";
    }
} 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.