Mysql
 sql >> Database >  >> RDS >> Mysql

Problema bindParam PDO

I PDO associano i dati dei valori, non i nomi di tabelle e colonne.

Stai fraintendendo l'uso degli attacchi. Non è possibile associare nomi di tabelle e colonne con PDO. Associa i dati per inserirli IN quelle colonne. Devi costruire l'SQL per includere i nomi delle tabelle e le colonne usando le operazioni sulle stringhe.

Formatta i dati

Ho rinominato $column e $value in $column_array, $value_array per chiarire cosa sono e ho assunto che ciascuno sia un semplice array:$column_array = array('column1', 'column2', ...) etc.

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

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

$placeholders ora si presenta così:

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

$bindvalues ​​ora appare così:

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

Costruisci, prepara, esegui

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

Questo ti darà una dichiarazione preparata del modulo:

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

È quindi possibile eseguire l'istruzione preparata e passare i valori $ come argomento.

$sql->execute($bindValues);

Nota:

  • Un avvertimento che deve essere menzionato. Assicurati che i tuoi dati originali siano stati disinfettati contro SQL Injection. I PDO se ne occupano per i valori associati, ma se stai costruendo le colonne, ad esempio, dai dati $_POST, questo è vulnerabile e deve essere disinfettato.