Consultas preparadas de forma dinâmica
Você pode construir sua consulta dinamicamente a partir do array $_POST:
Mas NUNCA confie na entrada do usuário, o que significa que você não pode confiar que os dados em $_POST conterão nomes de coluna válidos.
1. Higienize os dados da postagem
Você pode definir uma matriz de nomes de colunas na lista de permissões
$whitelist = array('field1', 'field2', ...)
, e depois use:$data = array_intersect_key($_POST, array_flip($whitelist));
para encontrar a interseção entre as colunas da lista de permissões e sua matriz $_POST. (Obrigado @BillKarwin)
2. Crie a consulta
private function buildInsertSql($data, $table) {
$columns = "";
$holders = "";
foreach ($data as $column => $value) {
$columns .= ($columns == "") ? "" : ", ";
$columns .= $column;
$holders .= ($holders == "") ? "" : ", ";
$holders .= ":$column";
}
$sql = "INSERT INTO $table ($columns) VALUES ($holders)";
return $sql;
}
Isso lhe dará uma instrução SQL da forma:
$sql = INSERT INTO directory (field1, field2) VALUES (:field1, :field2)
e prepare a declaração:
$stmt = $dbh->prepare($sql);
3. Parâmetros de vinculação
Você pode então vincular parâmetros dinamicamente aos espaços reservados:
foreach ($data as $placeholder => $value) {
$stmt->bindValue(":$placeholder", $value);
}
e execute-o:
$stmt->execute();
Um pouco mais avançado...
- Dê uma olhada neste link Vinculando ao mesmo espaço reservado Para obter informações sobre como tornar sua declaração preparada dinâmica mais robusta.
- Dê uma olhada neste link:Bind Params Inside Loop Para uma advertência sobre parâmetros de associação versus valores em um loop.