MySQL prüft, ob eine Tabelle vorhanden ist, ohne eine Ausnahme auszulösen

123

Was ist der beste Weg, um zu überprüfen, ob eine Tabelle in MySQL vorhanden ist (vorzugsweise über PDO in PHP), ohne eine Ausnahme auszulösen. Ich habe keine Lust, die Ergebnisse von "SHOW TABLES LIKE" usw. zu analysieren. Es muss eine Art boolesche Abfrage geben?

Clops
quelle

Antworten:

199

Ich kenne die PDO-Syntax dafür nicht, aber das scheint ziemlich einfach zu sein:

$result = mysql_query("SHOW TABLES LIKE 'myTable'");
$tableExists = mysql_num_rows($result) > 0;
nickf
quelle
danke, total vergessen, dass SHOW TABLES LIKE nur auf eine exakte Tabelle beschränkt sein könnte
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) {// Tabelle erstellen}
zPuls3
1
@MathewFoscarini, rowCount () ist in diesem Fall möglicherweise nicht zuverlässig, siehe PHP-Dokument .
datasn.io
4
Es gibt keine Unterstützung mehr für mysql_*Funktionen, werden sie offiziell als veraltet , nicht mehr aufrecht erhalten und werden entfernt in der Zukunft. Sie sollten Ihren Code mit PDO oder MySQLi aktualisieren , um die Funktionalität Ihres Projekts in Zukunft sicherzustellen.
TRiG
39

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

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

Alle Ergebnisse zeigen an, dass die Tabelle vorhanden ist.

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

Michael Todd
quelle
Vielleicht fehlt mir etwas, aber warum sollten Sie diese Methode über SHOW TABLES verwenden?
Nickf
1
@nickf Es ist Teil des Ansi-Standards und daher zwischen verschiedenen RDBMS portierbar.
Troelskn
@nickf: Es funktioniert auch mit anderen Datenbanken als MySQL. Dies schließt PostgreSQL und SQL Server ein, soweit ich das beurteilen kann.
Powerlord
Wenn Sie sich fragen, ob dies ein Sicherheits-Exploit ist, können Sie Informationen aus Datenbanken abfragen, mit denen Sie nicht verbunden sind ...
Talvi Watia
3
Es besteht kein Sicherheitsrisiko. Bei Abfragen der Datenbank information_schema werden nur Tabellen angezeigt, für die der verbundene Benutzer Berechtigungen hat.
Warren Rumak
8

Mit mysqli habe ich folgende Funktion erstellt. 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 von @jcaron vorgeschlagen, ist diese Funktion möglicherweise anfällig für sqlinjection-Attacs. Stellen Sie daher sicher, dass Ihre Variable sauber $tableist, oder verwenden Sie besser parametrisierte Abfragen.

Falk
quelle
Nur wenn Sie jemanden die $ table var füllen lassen, ist nicht jede var in einer SQL-Anweisung gefährlich, nur wenn Sie die Daten aus nicht vertrauenswürdigen Quellen erhalten. Natürlich sind Sie dafür verantwortlich, wie Sie die Funktion verwenden und filtern. Es besteht keine Notwendigkeit, diese Antwort abzulehnen.
Falk
Wenn Sie Code wie diesen veröffentlichen, wird er von jemandem an einem Ort verwendet, an dem die Daten nicht ordnungsgemäß überprüft wurden, und es wird eine SQL-Injektion ausgeführt. Verwenden Sie einfach parametrisierte Anforderungen, und Sie vermeiden Probleme, unabhängig davon, ob die Daten überprüft wurden oder nicht. Es gibt überhaupt keinen Grund, dies hier nicht zu tun, es ist nur eine schlechte Praxis.
JCaron
Wie wäre es mit einem real_escape_string?
Falk
Verwenden Sie parametrisierte Abfragen und vermeiden Sie die Horrorgeschichten.
JCaron
4

Dies wird einfach gepostet, wenn jemand nach dieser Frage sucht. Obwohl es ein bisschen beantwortet wurde. Einige der Antworten machen es komplexer als nötig.

Für MySQL * habe ich verwendet:

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

In PDO habe ich verwendet:

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

Damit schiebe ich einfach die else-Bedingung in oder. Und für meine Bedürfnisse brauche ich nur einfach zu sterben. Obwohl Sie oder zu anderen Dingen setzen können. Einige bevorzugen vielleicht das if / else if / else. Welches ist dann zu entfernen oder und dann zu liefern, wenn / sonst wenn / sonst.

Esoterica
quelle
3

Hier ist meine Lösung, die ich bei der Verwendung gespeicherter Prozeduren bevorzuge. 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
Erandac
quelle
2

Da "Tabellen anzeigen" in größeren Datenbanken möglicherweise langsam ist, empfehle ich die Verwendung von "DESCRIBE" und überprüfe, ob Sie als Ergebnis true / false erhalten

$tableExists = mysqli_query("DESCRIBE `myTable`");
Martin Lisicki
quelle
Nach dem, was ich gelesen habe, wird 'information_schema', wenn 'SHOW' ineffizient wird, 'DESCRIBE' vorgezogen.
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";
    }
}
Namkeen Butter
quelle
2
Bitte fügen Sie einen genauen Kommentar für den Code hinzu, um die beste Antwortqualität zu erzielen. Fügen Sie einfach einen Code ein, der dem Autor der Frage nicht viel sagt.
Jakub Matczak
5
Das ist eigentlich schrecklich. Wenn es also 50.000 Tabellen gibt, würden Sie alle Tabellen laden und jede durchlaufen, um herauszufinden, ob die richtige Tabelle vorhanden ist?
Rohit Chopra
-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;

    }
Gilcierweb
quelle
-9

Warum machst du 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";
    }
} 
Hamed
quelle