Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PDO bindParam-Problem

PDOs binden Wertdaten, keine Tabellen- und Spaltennamen.

Sie missverstehen die Verwendung von Bindungen. Sie können Tabellen- und Spaltennamen nicht mit PDO binden. Sie binden Daten, um sie IN diese Spalten einzufügen. Sie müssen die SQL so konstruieren, dass sie die Tabellennamen und Spalten mit Zeichenfolgenoperationen enthält.

Daten formatieren

Ich habe Ihre $column und $value in $column_array, $value_array umbenannt, um zu verdeutlichen, was sie sind, und davon ausgegangen, dass es sich jeweils um ein einfaches Array handelt:$column_array = array('column1', 'column2', ...) etc.

$placeholders = array_map(function($col) { return ":$col"; }, $column_array);

$bindvalues = array_combine($placeholders , $value_array);

$placeholders sieht jetzt so aus:

$placeholders = array(
        ':column1',
        ':column2',
         ...
    );

$bindvalues ​​sieht jetzt so aus:

$bindvalues = array(
        ':column1'=>'value1',
        ':column2'=>'value2',
         ...
    );

Erstellen, vorbereiten, ausführen

$sql = $this->connect->prepare("INSERT INTO $table (" .implode(",", $column_array) .") VALUES (". implode(",", $placeholders) . ")";

Dadurch erhalten Sie eine vorbereitete Erklärung der Form:

$sql = INSERT INTO table_name (column1, column2, ...) VALUES (:column1, :column2, ...)

Sie können dann die vorbereitete Anweisung ausführen und die $Werte als Argument übergeben.

$sql->execute($bindValues);

Hinweis:

  • Eine Einschränkung muss erwähnt werden. Stellen Sie sicher, dass Ihre Originaldaten gegen SQL-Injection bereinigt wurden. PDOs kümmern sich darum für die gebundenen Werte, aber wenn Sie die Spalten beispielsweise aus $_POST-Daten erstellen, ist dies anfällig und muss bereinigt werden.