考虑到我正在构建一个表单并将数据发布到PHP,我的典型插入查询如下所示:
$sql = "INSERT INTO news
(title, body)
VALUES (?, ?)";
$stmt = $db->prepare($sql);
$stmt->execute(array($_POST["title"], $_POST["body"]));
$stmt->closeCursor();这对于一个小查询看起来很好,我的理解是这可以保护我免受SQL注入之类的攻击。
但是如果我需要处理一个非常大的表单呢?就像..。
$sql = "INSERT INTO ficha_item
(titulo, tipo_produto, quantidade_peso, unidade_de_venda,
unidades_por_caixa, caixas_piso, pisos_palete, tipo_de_palete,
unidades_palete, caixas_palete, uni_diametro, uni_largura,
uni_profundidade, uni_altura, uni_peso_bruto_unidade, caixa_largura,
caixa_profundidade, caixa_altura, altura_palete, volume_unidade,
peso_caixa, peso_palete)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";我认为计算所有这些问号变得单调乏味。有没有一种更干净的PDO方式呢?
发布于 2012-12-31 07:45:47
您可以动态创建SQL:
$allowed_fields = array(
'titulo',
'tipo_produto',
'quantidade_peso',
'unidade_de_venda',
'unidades_por_caixa',
'caixas_piso',
'pisos_palete',
'tipo_de_palete',
'unidades_palete',
'caixas_palete',
'uni_diametro',
'uni_largura',
'uni_profundidade',
'uni_altura',
'uni_peso_bruto_unidade',
'caixa_largura',
'caixa_profundidade',
'caixa_altura',
'altura_palete',
'volume_unidade',
'peso_caixa',
'peso_palete'
);
$columns = "";
$values = "";
$values_arr = array();
foreach ( $_POST as $key=>$value )
{
if ( !in_array($key, $allowed_fields) ) continue;
$columns .= "$key, ";
$values .= "?, ";
$values_arr[] = $value;
}
// now remove trailing ", " from $columns and $values
$columns = rtrim($columns, ", ");
$values = rtrim($values, ", ");
// finish them
$sql = "INSERT INTO ficha_item($columns) VALUES($values)";
$stmt = $db->prepare($sql);
$stmt->execute($values_arr);
$stmt->closeCursor();发布于 2012-12-31 06:31:54
使用bindParam方法,这是一种最好的方式来做你期望的事情。这比使用问号更容易理解。因此,代码将更易于维护。
official php doc中的示例:
示例#1执行带有命名占位符的预准备语句
<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>希望这能有所帮助。
https://stackoverflow.com/questions/14095257
复制相似问题