# MySQL: Prüfen ob eine Tabelle existiert



## AllesVergessen (29. März 2017)

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:



```
$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);
```


----------



## sheel (29. März 2017)

Hi



AllesVergessen hat gesagt.:


> Fehlermeldungen


Welche?


----------



## AllesVergessen (29. März 2017)

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


----------



## sheel (29. März 2017)

Funktioniert

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


----------



## AllesVergessen (29. März 2017)

Mit den Rechten habe ich auch schon dran gedacht, aber in einer anderen Funktion klappt dies hier ohne Probleme:



```
$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....
         }
```


----------



## AllesVergessen (29. März 2017)

sheel hat gesagt.:


> Funktioniert
> 
> ```
> $stmt = $connection->prepare('SELECT table_name FROM information_schema.tables');
> ...



Habe das mal angepasst wie von Dir angeführt, aber die Fehlermeldung bleibt die gleiche.


----------



## AllesVergessen (29. März 2017)

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



```
// 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]);
}
```


----------



## AllesVergessen (29. März 2017)

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

???????????


----------



## abdellaui (29. März 2017)

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:


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

Oder:


```
$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)


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

Oder:


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


----------



## AllesVergessen (29. März 2017)

@*abdellaui: *
Vielen Dank für die ausführliche Antwort. Ich werde das morgen gleich mal testen und mir dieses bindValue mal zu Gemüte führen.


----------



## abdellaui (29. März 2017)

Sehe gerade das ich überall $sth stehen habe statt $result. :/ müsste angepasst werden.


----------



## AllesVergessen (30. März 2017)

Guten Morgen zusammen,

also, jetzt habe ich mal die letzten zwei Varianten von @*abdellaui *
ausprobiert. Resultat: Das script lädt sich tod. 
Noch schöner ist, dass er jetzt hier:

$stmt = $connection->prepare('SELECT * from information_schema.columns WHERE table_name = s_articles_attributes');
$stmt->execute();
$spaltennamen = $stmt->fetch(\PDO::FETCH_ASSOC);


auch eine Fehlermeldung ausspuckt:

Error

An exception occurred while executing 'SELECT * from information_schema.columns WHERE table_name = s_articles_attributes': SQLSTATE[42S22]: Column not found: 1054 Unknown column 's_articles_attributes' in 'where clause'

Edit: Auf der Seite von MySQL habe ich ermittelt, dass ich wahrscheinlich folgenden Wert noch brauche:


[AND table_schema = '_db_name_']

Einfache Sache wenn man das nur für sich anlegt, aber das Ganze soll in einem plugin dynamisch laufen. Also müsste ich ja quasi die aktuell benutzte Datenbank ermitteln. Aber wie kann ich das wieder machen?


----------

