2009-10-06 8 views

Antwort

196

ich weiß nicht, die PDO-Syntax für sie, aber dies scheint ziemlich geradlinig:

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

Danke, total vergessen, dass SHOW TABLES LIKE auf genau eine Tabelle beschränkt sein könnte – clops

+53

PDO: $ tableExists = $ db-> query ("TABELLEN ANZEIGEN WIE 'myTable'") -> rowCount()> 0; – cgTag

+4

mysqli: if ($ db-> query ("SHOW TABLES LIKE 'myTable'") -> num_rows == 0) { // create table } – zPuls3

38

Wenn Sie MySQL 5.0 und höher verwenden, könnten Sie versuchen:

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

Alle Ergebnisse zeigen, besteht die Tabelle.

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

+0

Oh! Daran habe ich nicht gedacht. Lassen Sie mich überprüfen, ob es wie erwartet funktioniert! – clops

+0

vielleicht fehlt mir etwas, aber warum sollten Sie diese Methode über SHOW TABLES verwenden? – nickf

+1

@nickf Es ist Teil des Ansi-Standards, also ist es zwischen verschiedenen rdbms austauschbar. – troelskn

8

Mit Mysqli i folgende Funktion erstellt haben. Angenommen, Sie haben eine mysqli-Instanz namens $ 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); 
} 

Ich hoffe, es hilft.

Warnung: wie @jcaron diese Funktion sugested könnte zu SQL-Injection Attacken anfällig sein, so stellen Sie sicher, dass Ihr $table var sauber ist oder noch besser Anfragen Verwendung parametriert.

+0

Nur wenn Sie jemanden die $ table var füllen lassen, ist nicht jede Variable innerhalb einer SQL-Anweisung gefährlich, nur wenn Sie die Daten von nicht vertrauenswürdigen Quellen erhalten. Natürlich sind Sie dafür verantwortlich, wie Sie die Funktion nutzen und filtern. Es gibt keine Notwendigkeit, diese Antwort zu verwerfen. – Falk

+0

Wenn Sie Code wie diesen veröffentlichen, wird er am Ende an einer Stelle verwendet, an der die Daten nicht richtig überprüft wurden, und wird mit einer SQL-Injektion enden. Verwenden Sie einfach parametrisierte Anfragen, und Sie vermeiden jedes Problem, ob die Daten geprüft wurden oder nicht. Es gibt keinen Grund, dies hier nicht zu tun, es ist nur eine schlechte Übung. – jcaron

+0

Wie wäre es mit einem Real_escape_string? – Falk

-8

Warum machen Sie es so schwer zu verstehen?

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

** SQL Injection ** – 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

Bitte fügen Sie einen genauen Kommentar für den Code, um die beste Qualität der Antwort zu bieten. Einfach etwas Code einfügen, sagt dem Autor der Frage nicht viel. –

+5

Das ist eigentlich schrecklich. Also, wenn es 50.000 Tabellen gibt, würden Sie alle Tabellen laden, durchschleifen, um herauszufinden, ob die richtige Tabelle existiert? –

4

Hier ist die Lösung, die meine ich es vorziehen, wenn gespeicherte Prozeduren verwenden. Benutzerdefinierte mysql-Funktion zum Überprüfen, ob die Tabelle in der aktuellen Datenbank vorhanden ist.

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

Dies ist einfach geschrieben, wenn jemand auf die Suche nach dieser Frage kommt. Obwohl es ein wenig beantwortet wurde. Einige der Antworten machen es komplexer als es sein müsste.

für MySQL * I verwendet:

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

In PDO I verwendet:

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

Damit ich den sonst Zustand nur einschieben oder. Und für meine Bedürfnisse muss ich nur sterben. Obwohl Sie oder andere Dinge festlegen können. Manche mögen das if/else if/else bevorzugen. Was dann zu entfernen ist und dann if/else if/else liefert.

2

Als "Show-Tabellen" könnte auf größere Datenbanken langsam, I "DESCRIBE" empfehlen und prüfen Sie, ob Sie

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

Von dem, was ich gelesen habe, wenn 'SHOW' ineffizient wird, ist 'information_schema' gegenüber 'DESCRIBE' vorzuziehen. – Esoterica

-1

Zend Framework

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

als Ergebnis wahr/falsch erhalten Wenn der Grund dafür die Erstellung einer bedingten Tabelle ist, dann scheint "CREATE TABLE IF NOT EXISTS" ideal für den Job zu sein. Bis ich das entdeckte, benutzte ich die 'DESCRIBE'-Methode oben. Mehr Infos hier: MySQL "CREATE TABLE IF NOT EXISTS" -> Error 1050

Verwandte Themen