Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Problema do bindParam do PDO

PDOs vinculam dados de valor, não nomes de tabela e coluna.


Você está entendendo mal o uso de ligações. Você não pode vincular nomes de tabela e coluna com PDO. Você vincula dados para inserir INTO nessas colunas. Você precisa construir o SQL para incluir os nomes e colunas das tabelas usando operações de string.

Formatar os dados


Renomeei seu $column e $value para $column_array, $value_array para deixar claro o que são e assumi que cada um é um array simples:$column_array = array('column1', 'column2', ...) etc.
$placeholders = array_map(function($col) { return ":$col"; }, $column_array);

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

$ placeholders agora se parece com isso:
$placeholders = array(
        ':column1',
        ':column2',
         ...
    );

$bindvalues ​​agora se parece com isso:
$bindvalues = array(
        ':column1'=>'value1',
        ':column2'=>'value2',
         ...
    );

Construir, preparar, executar

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

Isso lhe dará uma declaração preparada do formulário:
$sql = INSERT INTO table_name (column1, column2, ...) VALUES (:column1, :column2, ...)

Você pode então executar a instrução preparada e passar os $values ​​como um argumento.
$sql->execute($bindValues);

Observação:

  • Uma ressalva que deve ser mencionada. Certifique-se de que seus dados originais foram esterilizados em relação ao SQL Injection. Os PDOs cuidam disso para os valores vinculados, mas se você estiver construindo as colunas de, digamos, dados $_POST, isso é vulnerável e precisa ser higienizado.