Mysql
 sql >> Base de données >  >> RDS >> Mysql

Problème de PDO bindParam

Les PDO lient les données de valeur, pas les noms de table et de colonne.

Vous ne comprenez pas l'utilisation des fixations. Vous ne pouvez pas lier les noms de table et de colonne avec PDO. Vous liez des données pour les insérer DANS ces colonnes. Vous devez construire le SQL pour inclure les noms de table et les colonnes à l'aide d'opérations de chaîne.

Formater les données

J'ai renommé votre $column et $value en $column_array, $value_array pour clarifier ce qu'ils sont, et j'ai supposé que chacun est un tableau simple :$column_array = array('column1', 'column2', ...) etc.

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

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

$placeholders ressemble maintenant à ceci :

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

$bindvalues ​​ressemble maintenant à ceci :

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

Construire, préparer, exécuter

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

Cela vous donnera une déclaration préparée de la forme :

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

Vous pouvez ensuite exécuter l'instruction préparée et passer les $values ​​comme argument.

$sql->execute($bindValues);

Remarque :

  • Une mise en garde doit être mentionnée. Assurez-vous que vos données d'origine ont été nettoyées contre l'injection SQL. Les PDO s'en chargent pour les valeurs liées, mais si vous construisez les colonnes à partir, par exemple, de données $_POST, elles sont vulnérables et doivent être nettoyées.