Prüfen Sie mit PHP/PDO, ob eine Datenbanktabelle existiert

Lesezeit: 6 Minuten

Benutzer-Avatar
André

Ich möchte überprüfen, ob eine Tabelle mit einem bestimmten Namen in einer Datenbank existiert, mit der ich mich mit PHP und PDO verbunden habe.

Es muss auf allen Datenbank-Backends wie MySQL, SQLite usw. funktionieren.

  • mögliches Duplikat von MySQL prüfen, ob eine Tabelle existiert, ohne eine Ausnahme auszulösen

    – Wladimir Palant

    14. Juni 2012 um 7:53 Uhr

Benutzer-Avatar
extral

Hier ist eine vollständige Funktion zum Prüfen, ob eine Tabelle existiert.

/**
 * Check if a table exists in the current database.
 *
 * @param PDO $pdo PDO instance connected to a database.
 * @param string $table Table to search for.
 * @return bool TRUE if table exists, FALSE if no table found.
 */
function tableExists($pdo, $table) {

    // Try a select statement against the table
    // Run it in try-catch in case PDO is in ERRMODE_EXCEPTION.
    try {
        $result = $pdo->query("SELECT 1 FROM {$table} LIMIT 1");
    } catch (Exception $e) {
        // We got an exception (table not found)
        return FALSE;
    }

    // Result is either boolean FALSE (no table found) or PDOStatement Object (table found)
    return $result !== FALSE;
}

Hinweis: PDO löst nur Ausnahmen aus, wenn es dazu aufgefordert wird. Standardmäßig ist es still und löst keine Ausnahmen aus. Deshalb müssen wir auch das Ergebnis überprüfen. Siehe PDO-Fehlerbehandlung auf php.net

  • Dies schützt nicht vor SQL-Injection.

    – lebensfrei75

    6. Juni 2013 um 16:45 Uhr

  • @ livefree75 Vielleicht könnten Sie genauer sein? Ich sehe hier keine vom Kunden bereitgestellten Felder … vielleicht bin ich mir des Problems, das Sie in seinem/ihrem Code sehen, nicht sicher?

    – Steve

    7. August 2013 um 18:45 Uhr

  • @livefree75 Warum sollte es schützen? Wenn es sich in der DB-Schicht befindet, sollte der Schutz dort nicht eingefügt werden. Schutz und Sicherheit bedeutet nicht, dass überall eine Filter-/Desinfektionsfunktion eingefügt wird.

    – Ran Bar-Zik

    10. August 2013 um 8:42 Uhr

  • Wenn Sie desinfizieren möchten, tun Sie dies zu Beginn der Funktion: $table = preg_replace('/[^\da-z_]/i', '', $table);

    – rybo111

    17. März 2016 um 13:32 Uhr

Benutzer-Avatar
Nathan Crause

Bevor ich fortfahre, ist mir klar, dass dies eine MySQL-spezifische Lösung ist.

Während alle hier erwähnten Lösungen funktionieren können, möchte ich (persönlich) verhindern, dass PDO Ausnahmen auslöst (persönliche Präferenz, das ist alles).

Daher verwende ich stattdessen Folgendes, um die Tabellenerstellung zu testen:

SHOW TABLES LIKE 'some_table_of_mine';

Es wird kein Fehlerzustand generiert, wenn die Tabelle nicht existiert, Sie erhalten einfach eine Ergebnismenge von Null. Funktioniert bei mir schnell und konstant.

Tun:

select 1 from your_table

und dann den Fehler abfangen. Wenn Sie keinen Fehler erhalten, aber eine Ergebnismenge mit einer Spalte, die “1” enthält, dann existiert die Tabelle.

  • Das könnte gefährlich sein, wenn Sie viele Zeilen haben.

    – feihtthief

    11. November 2009 um 23:38 Uhr

  • @feihtthief: Es gibt Möglichkeiten, dieses Problem zu umgehen. Beispielsweise könnten Sie nur die erste Zeile abrufen. Oder, noch besser, führen Sie die Anweisung nicht einmal aus, sondern bereiten Sie sie nur vor.

    – Milan Babuškov

    12. November 2009 um 6:28 Uhr

  • @MilanBabuškov Ich verstehe nicht, wie das Vorbereiten der Anweisung und das Nichtausführen einem sagt, ob die Tabelle existiert oder nicht. Übersehe ich etwas?

    – Hervorstechendes Grün

    18. Mai 2016 um 15:37 Uhr


  • Diese Antwort befasst sich nicht mit der Verwendung von PDO oder PHP, wobei erstere unter bestimmten Umständen nuancierte Probleme bei der Ausnahmebehandlung hat.

    – David Timothy Strauss

    8. November 2016 um 3:01 Uhr

  • Dies schlägt fehl, wenn die Tabelle leer ist

    – Juri

    21. Juni 2018 um 14:03 Uhr

Benutzer-Avatar
Tarnung

Sobald Sie Ihr Datenbank-Handle über PDO haben, können Sie Folgendes tun:

$tableExists = gettype($dbh->exec("SELECT count(*) FROM $table")) == 'integer';

Oder packen Sie es in eine Funktion.

Ich habe zuerst versucht, mit Try/Catch herumzuspielen, aber selbst wenn die Tabelle nicht existierte, gab es keine Ausnahme. Schließlich endete mit der Überprüfung des Datentyps des zurückgegebenen Werts aus dem Aufruf von dbh exec. Es ist entweder eine ganze Zahl, wenn es eine Übereinstimmung mit der ausgewählten Anzahl gibt (auch wenn die Anzahl 0 ist, oder ein boolescher Wert von false, wenn es keine Ergebnisse gab.

Ich denke, das sollte mit allen Datenbanktypen funktionieren, die PDO unterstützt, da die Syntax wirklich einfach ist.

Benutzer-Avatar
Equistatisch

Erstellen Sie im Rahmen Ihres Projekts eine Schemaansicht.

Für Oracle wäre es so etwas wie

SELECT TABLE_NAME FROM ALL_TABLES

Für MySQL:

SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema="mydbname"

ETC..

Führen Sie dann in Ihrem Code eine Abfrage für die Ansicht aus.

  • Die Frage bezog sich auf PDO. Bitte aktualisieren Sie die Antwort entsprechend.

    – Sitilge

    16. Dezember 2015 um 10:41 Uhr

  • @sitilge PDO ist orthogonal zum vorliegenden Problem. Es ist lediglich das Tool zum Ausführen einer Abfrage. Dies ist eine gute Antwort.

    – Félix Adriyel Gagnon-Grenier

    7. November 2016 um 23:21 Uhr

  • @FélixGagnon-Grenier in der Tat, es ist ein Werkzeug. Das OP möchte jedoch höchstwahrscheinlich a erhalten this is how you do it with PDO Antwort, nicht wahr?

    – Sitilge

    7. November 2016 um 23:42 Uhr

  • @DavidTimothyStrauss Ich habe Ihre Bearbeitung rückgängig gemacht, da sie völlig unangemessen ist. Es ist nicht nur ungültiger SQL-Code, es gab auch nichts darüber, wie man diese Variable in der Abfrage tatsächlich verkettet.

    – Félix Adriyel Gagnon-Grenier

    8. November 2016 um 1:28 Uhr


  • @sitilge gut, vielleicht. Ich bin nicht wirklich anderer Meinung, es ist nur so “So machen Sie es mit PDO” wird in tausend Tutorials da draußen erklärt: Es heißt Ausführen einer SQL-Abfrage. Wenn jemand nicht verstehen kann, dass SQL-Code eigentlich dazu gedacht ist, ausgeführt zu werden, sei es durch PDO oder etwas anderes, gibt es nicht viel Hoffnung, dass er es weiß wie man eine ausführliche Antwort entweder verwendet …

    – Félix Adriyel Gagnon-Grenier

    8. November 2016 um 1:31 Uhr

Benutzer-Avatar
Mat Barnett

Möglicherweise können Sie vermeiden, sich auf einen Fehler verlassen zu müssen, indem Sie eine Abfrage nach dem Vorbild von “SHOW TABLES LIKE ‘your_table'” verwenden und dann die Zeilen zählen. Ich habe diese Methode erfolgreich mit MySQL und PDO verwendet, muss sie aber noch mit anderen DBs testen

  • Die Frage bezog sich auf PDO. Bitte aktualisieren Sie die Antwort entsprechend.

    – Sitilge

    16. Dezember 2015 um 10:41 Uhr

  • @sitilge PDO ist orthogonal zum vorliegenden Problem. Es ist lediglich das Tool zum Ausführen einer Abfrage. Dies ist eine gute Antwort.

    – Félix Adriyel Gagnon-Grenier

    7. November 2016 um 23:21 Uhr

  • @FélixGagnon-Grenier in der Tat, es ist ein Werkzeug. Das OP möchte jedoch höchstwahrscheinlich a erhalten this is how you do it with PDO Antwort, nicht wahr?

    – Sitilge

    7. November 2016 um 23:42 Uhr

  • @DavidTimothyStrauss Ich habe Ihre Bearbeitung rückgängig gemacht, da sie völlig unangemessen ist. Es ist nicht nur ungültiger SQL-Code, es gab auch nichts darüber, wie man diese Variable in der Abfrage tatsächlich verkettet.

    – Félix Adriyel Gagnon-Grenier

    8. November 2016 um 1:28 Uhr


  • @sitilge gut, vielleicht. Ich bin nicht wirklich anderer Meinung, es ist nur so “So machen Sie es mit PDO” wird in tausend Tutorials da draußen erklärt: Es heißt Ausführen einer SQL-Abfrage. Wenn jemand nicht verstehen kann, dass SQL-Code eigentlich dazu gedacht ist, ausgeführt zu werden, sei es durch PDO oder etwas anderes, gibt es nicht viel Hoffnung, dass er es weiß wie man eine ausführliche Antwort entweder verwendet …

    – Félix Adriyel Gagnon-Grenier

    8. November 2016 um 1:31 Uhr

Benutzer-Avatar
Gwyneth Llewelyn

Zuerst habe ich die akzeptierte Antwort verwendet, aber dann bemerkte ich, dass sie mit leeren Tabellen fehlschlug. Hier ist der Code, den ich gerade verwende:

function DB_table_exists($db, $table){
    GLOBAL $db;
    try{
        $db->query("SELECT 1 FROM $db.$table");
    } catch (PDOException $e){
        return false;
    }
    return true;
}

Dieser Code ist ein Auszug meiner Erweiterungsklasse für PDO. Es wird einen Fehler erzeugen (und false zurückgeben), wenn die Tabelle nicht existiert, aber erfolgreich sein, wenn die Tabelle existiert und/oder leer ist.

1151120cookie-checkPrüfen Sie mit PHP/PDO, ob eine Datenbanktabelle existiert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy