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