Felix Riesterer: Tabellennamen in der SQL funktioniert nicht mit Leerzeichen

Beitrag lesen

Lieber Andreas,

INSERT INTO $Database.$Table (Name,Bild,Hoch,Breit,Url,Infos,Daten,Datei) VALUES('$Bezeichner','$Bild','$Hoch','$Breit','$Adresse','$Infos','$Daten','$Datei')

wie @dedlfix schon richtig schrieb, brauchst Du für die Bezeichner Backticks:

$sql = sprintf(
    'INSERT INTO `$1$s`.`%2$s` ('
    .' `Name`,'
    .' `Bild`,'
    .' `Hoch`,'
    .' `Breit`,'
    .' `Url`,'
    .' `Infos`,'
    .' `Daten`,'
    .' `Datei`'
    .') VALUES ('
    ."'%3\$s',"
    ."'%4\$s',"
    ."'%5\$s',"
    ."'%6\$s',"
    ."'%7\$s',"
    ."'%8\$s',"
    ."'%9\$s',"
    ."'%10\$s'"
    .')',
    // Werte alle erst noch SQL-gerecht escapen! SONST SLQ-INJECTION LÜCKE!!!
    $Datenbank,
    $Table,
    $Bezeichner,
    $Bild,
    $Hoch,
    $Breit,
    $Adresse,
    $Infos,
    $Daten,
    $Datei
);

Ich arbeite mit der PDO-Erweiterung in PHP. Dort macht man das im Prinzip so:

$dsn = "mysql:host=localhost;dbname=$Datenbank";
$user = 'username';
$pass = 'password';
$options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
);
$dbh = new PDO($dsn, $user, $pass, $options);

$sql = sprintf(
    'INSERT INTO `:table` ('
    .' `Name`, `Bild`, `Hoch`, `Breit`, `Url`, `Infos`, `Daten`, `Datei`'
    .') VALUES ('
    .':bezeichner, :bild, :hoch, :breit, :adresse, :infos, :daten, :datei'
    .')';

$params = array(    
    ':bezeichner' => $Bezeichner,
    ':bild' => $Bild,
    ':hoch' => $Hoch,
    ':breit' => $Breit,
    ':adresse' => $Adresse,
    ':infos' => $Infos,
    ':daten' => $Daten,
    ':datei' => $Datei
);

$statement = $dbh->prepare($sql);
$statement->execute($params);

Das Beispiel hat aber noch keine Fehlerbehandlung. Dafür werden aber die Variablenwerte korrekt SQL-gemäß escaped.

Liebe Grüße,

Felix Riesterer.