首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PDO创建长insert SQL查询的最佳方法

使用PDO创建长insert SQL查询的最佳方法
EN

Stack Overflow用户
提问于 2012-12-31 06:19:21
回答 2查看 2.4K关注 0票数 5

考虑到我正在构建一个表单并将数据发布到PHP,我的典型插入查询如下所示:

代码语言:javascript
复制
$sql = "INSERT INTO news
            (title, body) 
            VALUES (?, ?)";
$stmt = $db->prepare($sql);
$stmt->execute(array($_POST["title"], $_POST["body"]));
$stmt->closeCursor();

这对于一个小查询看起来很好,我的理解是这可以保护我免受SQL注入之类的攻击。

但是如果我需要处理一个非常大的表单呢?就像..。

代码语言:javascript
复制
$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方式呢?

EN

回答 2

Stack Overflow用户

发布于 2012-12-31 07:45:47

您可以动态创建SQL:

代码语言:javascript
复制
$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();
票数 2
EN

Stack Overflow用户

发布于 2012-12-31 06:31:54

使用bindParam方法,这是一种最好的方式来做你期望的事情。这比使用问号更容易理解。因此,代码将更易于维护。

official php doc中的示例:

示例#1执行带有命名占位符的预准备语句

代码语言:javascript
复制
<?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();
?>

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14095257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档