Prüfen, ob eine MySQL-Tabelle vorhanden ist
Kalle_B
- php
0 Juan0 Vinzenz Mai0 André Laugks0 dedlfix
Hallöle,
für ein Programm, das Tabellen in eine andere Datenbank sichert, brauche ich die Möglichkeit, Tabellennamen abzufragen.
Ich mache das so:
$q = "SELECT COUNT(*) FROM ".$tabelle;
$result = @mysql_query( $q, $conn_id );
if ( mysql_errno( $conn_id ) ) ...
Geht es auch einfacher und vor allem SCHNELLER ?
Kalle
Moin,
Geht es auch einfacher und vor allem SCHNELLER ?
ob einfach und schneller kann ich dir nicht sagen, aber ich glaube der bessere Weg, wäre mit Show-Tables.
MfG,
Juan
Hallo Kalle,
für ein Programm, das Tabellen in eine andere Datenbank sichert, brauche ich die Möglichkeit, Tabellennamen abzufragen.
den Link dazu hatte ich Dir bereits gepostet: Die SHOW-Syntax hilft Dir weiter, insbesondere SHOW TABLES.
Es ist eine gute Idee, sich die Navigation im Handbuch mal anzuschauen und sich einen groben Überblick zu verschaffen.
Freundliche Grüße
Vinzenz
Hallo!
Geht es auch einfacher und vor allem SCHNELLER ?
Nehmen wir mal an, Deine Datenbank heißt "meinedatenbank".
function ifTableExists($table = false)
{
global $db; // Object AdoDB
if (!$table) {
return false;
}
$sql = "SHOW TABLES;";
$res = $db->Execute($sql);
while ($row = $res->FetchRow()) {
$result[] = strtolower($row['Tables_in_meinedatenbank']);
}
if (in_array(strtolower($table), $result)) {
return true;
}
return false;
}
if(ifTableExists('tabellenname')) {
Tabelle existiert
}
Ich habe das aus einem Script heraus kopiert, in dem ich AdoDB verwende. Du mußt die AdoDB-Methoden durch die PHP-Mysqlfunktionen ersetzen.
André Laugks
Hallo André,
danke für dein Script.
Bei JEDER Prüfung eines Tabellennamens greifst du aber auf die DB zu, ohne neue Informationen zu bekommen.
Ausgehend von deinem Vorschlag, müsste dies hier die TURBO-VERSION sein:
// TABELLEN-NAMEN AUS ZIELDATENBANK LESEN
// ++++++++++++++++++++++++++++++++++++++
$q = "SHOW TABLES";
$tables = mysql_query( $q, $db[1]['conn_id'] );
function TableExists( $tabelle ) {
global $tables;
mysql_data_seek ( $tables, 0 );
$ergebnis = FALSE;
while ( $row = mysql_fetch_array( $tables )) {
// echo $row[0]."<br>";
if ( $row[0] == $tabelle ) {
$ergebnis = TRUE;
break;
}
}
return $ergebnis;
}
if ( TableExists( "neu_tm_owner" )) echo "<p>BINGO: neu_tm_owner</p>"; else echo "<p>SORRY: neu_tm_owner</p>";
if ( TableExists( "alt_tm_owner" )) echo "<p>BINGO: alt_tm_owner</p>"; else echo "<p>SORRY: alt_tm_owner</p>";
// Pruefung, ob RESET funktioniert:
if ( TableExists( "neu_tm_owner" )) echo "<p>BINGO: neu_tm_owner</p>"; else echo "<p>SORRY: neu_tm_owner</p>";
Danke für deine Anregung.
Kalle
Hallo!
Bei JEDER Prüfung eines Tabellennamens greifst du aber auf die DB zu, ohne neue Informationen zu bekommen.
Ähm, Du möchtest eine Lösung haben, die überprüft, ob in der Datenbank schon eine Tabelle existiert, weil Du der Datenbank eine Tabelle hinzufügen möchtest. Bedeutet, die Anzahl der Tabellen wächst in der Datenbank. Man muss also jedes mal die Liste der Tabellen neu auslesen, um zu wissen, wie der aktuelle Stand ist.
André Laugks
Hallo!
Bei JEDER Prüfung eines Tabellennamens greifst du aber auf die DB zu, ohne neue Informationen zu bekommen.
Ähm, Du möchtest eine Lösung haben, die überprüft, ob in der Datenbank schon eine Tabelle existiert, weil Du der Datenbank eine Tabelle hinzufügen möchtest.
Nein, ich möchte eine Anzahl Tabellen (eins von mehreren Projekten in Datenbank A) von DB A nach DB B kopieren. Dabei kann der Tabellenname wechseln. Die Namen sind im Programm hinterlegt:
Datenbank A Datenbank B
--------------- -------------
(Zugriffsdaten) (Zugriffsdaten)
xyz_adressen abc_adressen
def_anwesenheit abc_anwesenheit
...
Dazu lese ich die Tabellennamen von DB B einmalig ein und durchlaufe dieses:
1. Es dürfen keine Tabellennamen mit tmp_* beginnen (dann wurde die letzte Datensicherung nicht korrekt beendet)
wenn fehlerfrei: 2. Kopiere Tabellen von DB A als tmp_*
wenn fehlerfrei: 3. Lösche alle Tabellen, die mit sic_* anfangen (die vorletzte Datensicherung)
wenn fehlerfrei: 4. Benenne die bisherigen um nach sic_*
wenn fehlerfrei: 5. Entferne das tmp_ vor dem Namen.
Die Sicherheits-Datenbank ist für Benutzer gesperrt. Sie wird überhaupt nicht benutzt, solange die Original-Datenbank erreichbar ist. Falls die DB oder der Provider ausfällt, können Programme und DB B freigegeben werden.
Allerdings könnte die Ausgangs-Datenbank während der Kopie von anderen Benutzern verändert werden, sopdass die kopierten Tabellen gegeneinander nicht stimmen.
Da muss ich mir noch eine Sperre einfallen lassen.
Kann man MySQL fragen, ob gerade eine User zugreift (ein handle offen ist)?
LG Kalle
Hello,
Ausgehend von deinem Vorschlag, müsste dies hier die TURBO-VERSION sein:
... die aber ggf. ungültige Werte liefert.
Ein Script läuft auch schon mal 30 Sekunden und mehr. Und was kann in 30 Sekunden nicht alles passieren. Insbesondere dann, wenn mehrere Benutzer die Datenbanek verwenden dürfen.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
echo $begrüßung;
für ein Programm, das Tabellen in eine andere Datenbank sichert, brauche ich die Möglichkeit, Tabellennamen abzufragen.
Ein
CREATE TABLE IF NOT EXISTS tblname ...
käme vielleicht auch noch in Frage.
echo "$verabschiedung $name";