PDO :: Datenbank / Tabelle mit bind Parameter erstellen

NetBull

Erfahrenes Mitglied
Moin,

bin nach einiger Zeit mal wieder mit PHP dran und aus mysqli wurde PDO.
Da arbeite ich mich gerade ein.

Aktuell möchte ich ein Datenbank.-Schema für eine temporär-Datenbank dynamisch mit genundenen Parametern erstellen.

Array mit den Optionen zur Ausgabe von Fehlern und der richtigen Codierung
PHP:
$opt = array(
    // any occurring errors wil be thrown as PDOException
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            // an SQL command to execute when connecting
            PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"
    );

Connector
PHP:
$pdo = new PDO(
            'mysql:host=' . $host . ';',
            $user,
            $pass,
            $opt
    );

anlegen der Datenbank
PHP:
$dbName = 'testdb1';
    $stmt = $pdo->prepare('CREATE DATABASE IF NOT EXISTS :dbName ;');
    $stmt->bindParam(':dbName', $dbName, PDO::PARAM_STR);
    var_dump($stmt->queryString);

Fehlermeldung:
Code:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''testdb1'' at line 1' in /var/www/arbeitsproben/SessionLogger/manualTest.php on line 46

Wenn ich statt dem letzten Block nun das hier mache, dann geht es.
PHP:
$dbName = 'testdb10';
    $stmt = $pdo->prepare('CREATE DATABASE IF NOT EXISTS ' . $dbName . ';');
    var_dump($stmt->queryString);
    $stmt->execute();

Ich möchte aber explizit das die Parameter sauber gebunden werden.
Was mache ich im oberen Beispiel falsch?

LG NetBu||
 
Du kannst auch mit PDO keine PreparedStatments erzeugen, bei denen die Identifier dynamisch durch bindParam() oder bindValue() ersetzt werden. Das ist in PreparedStatements nicht vorgesehen.

http://stackoverflow.com/questions/...terize-the-table-name-in-a-prepared-statement

Eigentlich gibt es auch keinen Grund dafür. Tabellen-Namen können als konstante Zeichenketten im Code hinterlegt werden. Zu mindest sollten das keine Werte sein, die der Benutzer von außen eingeben kann. Und damit müssen sie auch nicht entschärft werden.

EDIT: Passend dazu auch https://www.tutorials.de/resources/php-prepared-statements-mit-pdo-teil-1-einfuehrung.220/

Der Teil über "Was sind Prepared Statements?" und dort im speziellen die Vorteile, dann wird klar, warum das nicht geht.
 
Zurück