首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >绑定批量插入查询的参数吗?(避免SQL注入)

绑定批量插入查询的参数吗?(避免SQL注入)
EN

Stack Overflow用户
提问于 2013-09-09 14:19:38
回答 2查看 592关注 0票数 0

我想从Excel文件中进行大量数据库填充。最节省时间的方法是使用INSERT INTO语句将大量值存储在一个事务中:

代码语言:javascript
运行
复制
INSERT INTO `assortment`(`id`, `sku`, `agroup`, `subgroup`, `title`, `measure_unit`, `price`, `discount`, `imageUrl`, `fileUrl`) 
VALUES ([value-1],[value-2],[value-3],[value-4],[value-5],[value-6],[value-7],[value-8],[value-9],[value-10]), 
([value-1],[value-2],[value-3],[value-4],[value-5],[value-6],[value-7],[value-8],[value-9],[value-10]), 
([value-1],[value-2],[value-3],[value-4],[value-5],[value-6],[value-7],[value-8],[value-9],[value-10]), 
([value-1],[value-2],[value-3],[value-4],[value-5],[value-6],[value-7],[value-8],[value-9],[value-10]), 
...

然而,为了避免SQL注入,我希望绑定params,yii为此提供了功能。然而,对我来说,要做到这一点似乎是不可能的。难到不是么?

为了保持SQL hygene,我使用简单的insert Active Record属性(Yii AR功能在默认情况下清除输入数据):

代码语言:javascript
运行
复制
$auxarr = array();
for ($i = 0; $sheetData[$i]; $i++) 
{
        $model = new Assortment();
        $j = 0; 
            foreach ($labels as $label)
            {
                $auxarr[$label] = $sheetData[$i][$j++];
            }
        $model->attributes = $auxarr;
        if (!$model->save()) 
            throw new CHttpException(400, 'Error db storing');
}

这种方法显然是没有效率的。在大容量SQL插入中是否存在安全性和时间效率的特性?

EN

回答 2

Stack Overflow用户

发布于 2013-09-09 14:40:36

Yii是在CDbCommand中使用传统的PDO。因此,您可以创建一个由如下系列值组成的字符串

代码语言:javascript
运行
复制
(?,?,?),(?,?,?),(?,?,?),(?,?,?),(?,?,?),(?,?,?)

然后为所有这些占位符创建一个具有值的数组。

最后执行所有的任务

票数 1
EN

Stack Overflow用户

发布于 2013-09-10 02:28:50

我的方法是

代码语言:javascript
运行
复制
$sql = "INSERT INTO `assortment`(`id`, `sku`, `agroup`, `subgroup`, `title`, `measure_unit`, `price`, `discount`, `imageUrl`, `fileUrl`) VALUES "

$params = array();
$cntRows = count($sheetData);
for ($i = 0; $i < $cntRows; $i++) 
{

    $j = 0;         
    $rowParams = array();
    foreach ($labels as $label)
    {
        $rowParams[":{$label}_{$i}_{j}"] = $sheetData[$i][$j++];


    }
    $params = array_merge($params, $rowParams);
    $sql . = "(" . implode(",", array_keys($rowParams) ) .")"

}
/*
 Sql now is : INSERT INTO assortment (....) VALUES (  :id_1_1 , sku_1_1 , ... )  (:id_2_1 , sku_2_1 , ...)
 AND $params is { :id_1_1 => [value]  ........ }
*/

$cmd = Yii::app()->db->createCommand($sql);
$cmd->execute($params);

我们在一个事务中执行insert sql,没有多个事务,或者使用ActiveRecord (浪费内存和执行多个函数),避免使用SQL注入。如果您的数据很大,则可以将其拆分为多个事务。

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

https://stackoverflow.com/questions/18700417

复制
相关文章

相似问题

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