MySQL: Prüfen ob eine Tabelle existiert

AllesVergessen

Mitglied
Hallo zusammen,

es gibt dazu schon einiges zu finden, aber egal was ich versuche ich bekomme immer nur Fehlermeldungen.... es geht darum einfach nur zu prüfen ob eine mysql-Tabelle bereits existiert. Wenn ja soll sie nur upgedatet werden mit den Werten aus einer anderen Tabelle. Wenn nicht soll diese andere Tabelle kopiert werden und mit dem Anhang _backup alle Daten aufnehmen.
So versuche ich es im Moment:


PHP:
$db_schema = "information_schema.tables";
$stmt = $connection->prepare('SELECT table_name FROM ?');
$stmt->execute([$db_schema]);
$tabellennamen=$stmt->fetch(\PDO::FETCH_ASSOC);
if (!array_key_exists('s_articles_attributes_backup', $tabellennamen))
{
       $table = "s_articles_attributes";
       $make_table_prep = $connection->prepare('CREATE TABLE s_articles_attributes_backup LIKE ?');
       $make_table_prep->execute([$table]);
}

$result = $connection->prepare('UPDATE s_articles_attributes_backup SELECT * FROM ?');
$result->execute([$table]);
$attribute_sichern = $result->fetch(\PDO::FETCH_ASSOC);
 
Moment...
Im Moment haben wir diese im Angebot:


Error
An exception occurred while executing 'SELECT table_name FROM ?' with params ["information_schema.tables"]: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''information_schema.tables'' at line 1
 
Funktioniert
PHP:
$stmt = $connection->prepare('SELECT table_name FROM information_schema.tables');
?
Tabellen variabel zu halten ist jedenfalls keine gute Idee, aber evt. sind die Rechte auch noch ein Problem.
 
Mit den Rechten habe ich auch schon dran gedacht, aber in einer anderen Funktion klappt dies hier ohne Probleme:


PHP:
$stmt = $connection->prepare('SELECT * from information_schema.columns WHERE table_name = s_articles_attributes');
$stmt->execute();
$spaltennamen = $stmt->fetch(\PDO::FETCH_ASSOC);
if (!array_key_exists('smartlink', $spaltennamen))
        {
              mach was....
         }
 
Habe einige Änderungen vorgenommen, komme nun immerhin einen Schritt weiter, aber lande immer bei false, d.h. er findet den Tabellennamen nicht und will die Tabelle dann immer neu erstellen, was natürlich auch in einer exception endet da sie ja bereits da ist....


PHP:
// existiert die Tabelle s_articles_attributes_backup bereits? Wenn nicht: Anlegen!
$stmt = $connection->prepare('SELECT * FROM information_schema.tables');
$stmt->execute();
$tabellennamen = $stmt->fetch(\PDO::FETCH_ASSOC);
if (!in_array('s_articles_attributes_backup', $tabellennamen))
{
       $table = "s_articles_attributes";
       $make_table_prep = $connection->prepare('CREATE TABLE s_articles_attributes_backup LIKE s_articles_attributes');
       $make_table_prep->execute([$table]);
}
 
Also, es ist wirklich nur noch nervig. Befehle, die ich direkt in der SQL-Konsole in phpmyadmin ausführe und die einwandfrei funktionieren führen im Quellcode eingesetzt permanent zu Fehlermeldungen. So wie dieser hier:


$wert = 0;
$result = $connection->prepare('DELETE FROM s_articles_attributes_backup WHERE id > ?');
$result->execute([$wert]);

Ausgabe: General error...

???????????
 
Also ich kann nur aus meiner Erfahrung her sagen, das execute oder bindValue echt Schwierigkeiten damit haben einen 0 (int) in die SQL-Abfrage zu integrieren. Lösung hier zu ist $wert = '0'; (String).


Ich würd so vorgehen:

PHP:
$wert = '0';
$result = $connection->prepare('DELETE FROM s_articles_attributes_backup WHERE id > :wert');
$sth->bindValue(':wert', $wert, PDO::PARAM_STR);
$result->execute();

Oder:

PHP:
$wert = '0';
$result = $connection->prepare('DELETE FROM s_articles_attributes_backup WHERE id > ?');
$sth->bindValue(1, $wert, PDO::PARAM_STR);
$result->execute();

Theoretisch kannst du auch: (bei 0 könnte es zu Fehler führen)

PHP:
$wert = 0;
$result = $connection->prepare('DELETE FROM s_articles_attributes_backup WHERE id > :wert');
$sth->bindValue(':wert', $wert, PDO::PARAM_INT);
$result->execute();

Oder:

PHP:
$wert = 0;
$result = $connection->prepare('DELETE FROM s_articles_attributes_backup WHERE id > ?');
$sth->bindValue(1, $wert, PDO::PARAM_INT);
$result->execute();
 
Zurück