sql >> Base de Datos >  >> RDS >> Mysql

Problema de PDO bindParam

Los PDO vinculan datos de valor, no nombres de tablas y columnas.

Estás malinterpretando el uso de enlaces. No puede vincular nombres de tablas y columnas con PDO. Vincula datos para insertarlos EN esas columnas. Debe construir el SQL para incluir los nombres de las tablas y las columnas mediante operaciones de cadena.

Dar formato a los datos

Cambié el nombre de $column y $value a $column_array, $value_array para aclarar lo que son, y asumí que cada uno es un arreglo simple:$column_array = array('column1', 'column2', ...) etc.

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

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

$placeholders ahora se ve así:

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

$bindvalues ​​ahora se ve así:

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

Construir, preparar, ejecutar

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

Esto le dará una declaración preparada de la forma:

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

A continuación, puede ejecutar la instrucción preparada y pasar los $valores como argumento.

$sql->execute($bindValues);

Nota:

  • Una advertencia que debe mencionarse. Asegúrese de que sus datos originales se hayan desinfectado contra SQL Injection. Los PDO se encargan de eso para los valores vinculados, pero si está construyendo las columnas a partir de, por ejemplo, datos de $_POST, esto es vulnerable y debe desinfectarse.