2009-10-06 31 views

risposta

196

non so la sintassi DOP per esso, ma questo sembra abbastanza straight-forward:

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

grazie, totalmente dimenticato che SHOW TABLES LIKE potrebbe essere limitato a una sola tabella esatta – clops

+53

PDO: $ tableExists = $ db-> query ("MOSTRA TABELLE LIKE 'myTable'") -> rowCount()> 0; – cgTag

+4

mysqli: if ($ db-> interrogazione ("MOSTRA tabelle come 'myTable'") -> numero_colonne == 0) { // create table } – zPuls3

38

Se stai usando MySQL 5.0 e versioni successive, si potrebbe provare:

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

Eventuali risultati indicano esiste il tavolo.

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

+0

Oh! Non ci ho pensato. Fammi controllare se funziona come previsto! – clops

+0

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

+1

@nickf Fa parte dello standard ansi, quindi è portatile tra diversi rdbms. – troelskn

8

Utilizzando mysqli ho creato 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 sugested da @jcaron questa funzione potrebbe essere vulnerabile a SQL injection Attac, in modo da assicurarsi che il $table var è pulito o anche un uso migliore parametrizzata query.

+0

Solo se si lascia che qualcuno riempia la tabella $ var, non tutte le var all'interno di una statistica sql sono pericolose, solo se si ottengono i dati da fonti non attendibili. Ovviamente sei responsabile di come usi la funzione e fai il filtraggio. non c'è bisogno di downvotare questa risposta. – Falk

+0

Se pubblichi un codice come questo, qualcuno finirà per usarlo in un posto dove i dati non sono stati controllati correttamente e finirà con un'iniezione SQL. Basta usare le richieste parametrizzate e eviterete qualsiasi problema, indipendentemente dal fatto che i dati siano stati controllati o meno. Non c'è alcuna ragione per non farlo qui, è solo una cattiva pratica. – jcaron

+0

Che ne dici di aggiungere una stringa real_escape_string? – Falk

-8

Perché lo rende 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"; 
    } 
} 
+2

** Iniezione SQL ** – jcaron

0
$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

Aggiungere un commento accurato per il codice per fornire la migliore qualità di risposta. Basta incollare un codice che non dice molto all'autore della domanda. –

+5

Questo è in realtà orribile. Quindi, se ci sono 50.000 tabelle, dovresti caricare tutte le tabelle, scorrere ciclicamente ognuna per trovare se esiste la tabella corretta? –

4

Ecco la mia soluzione che preferisco quando si utilizzano le stored procedure. Funzione mysql personalizzata per verificare la presenza della tabella 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 
4

Questo viene pubblicato semplicemente se qualcuno viene in cerca di questa domanda. Anche se è stata data una risposta un po '. Alcune delle risposte lo rendono più complesso del necessario.

per MySQL * ho usato:

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

In PDO ho usato:

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

Con questo voglio solo spingere la condizione else dentro o. E per i miei bisogni ho semplicemente bisogno di morire. Anche se puoi impostare o ad altre cose. Alcuni potrebbero preferire il se/else se/else. Che è quindi rimuovere o e quindi fornire se/else se/else.

2

Come una "Mostra tabelle" potrebbe essere lento su basi di dati più grandi, mi consiglia di utilizzare "descrivere" e verificare se si ottiene vero/falso come risultato quadro

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

Da quello che ho letto se 'SHOW' diventa inefficiente allora 'information_schema' è più preferito su 'DESCRIBE'. – Esoterica

-1

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; 

    } 
-1

Se la ragione per voler fare ciò è la creazione della tabella condizionale, allora 'CREATE TABLE SE NOT EXISTS' sembra l'ideale per il lavoro. Fino a quando ho scoperto questo, ho usato il metodo 'DESCRIBE' sopra. Maggiori informazioni qui: MySQL "CREATE TABLE IF NOT EXISTS" -> Error 1050

Problemi correlati