用PHP循环SQL语句,好主意?

时间:2013-05-03 17:40:46

标签: php sql

我在编写PHP脚本时遇到了以下问题。我需要将变量长度数组中的前两个整数存储到数据库表中,删除它们并重复此操作直到数组为空。我可以用while循环来做,但我读到你应该避免在循环中编写SQL语句,因为性能受到了影响。

一个简化的例子:

while(count($array) > 0){
if ($sql = $db_connect->prepare("INSERT INTO table (number1, number2) VALUES (?,?)")){
                        $sql->bind_param('ii',$array[0],$array[1]);
                        $sql->execute();
                        $sql->close();
                    }
                        array_shift($array);
                        array_shift($array);
}

这是最好的方式,如果不是,那么更好的方法是什么?

5 个答案:

答案 0 :(得分:1)

你可以做这样的事情,这样也会更快:

Psuedo代码:

$stack = array();
while(count($array) > 0){
    array_push($stack, "(" . $array[0] . ", " . $array[1] . ")");
    array_shift($array);
    array_shift($array);
}
if ($sql = $db_connect->prepare("INSERT INTO table (number1, number2) 
                                 VALUES " . implode(',', $stack))){
    $sql->execute();
    $sql->close();
}

这里唯一的问题是它不是“MySQL安全”插入,你需要修复它!

这将生成包含值的Array和Array。在1个查询中,它将一次插入所有值,您需要更少的MySQL时间。

答案 1 :(得分:0)

你最好写一个批量插入语句,少点击mysql

$sql = "INSERT INTO table(number1, number2) VALUES";
$params = array();
foreach( $array as $item ) { 
    $sql .= "(?,?),\n";
    $params[] = $item;
}
$sql = rtrim( $sql, ",\n" ) . ';';
$sql = $db_connect->prepare( $sql );
foreach( $params as $param ) {
    $sql->bind_param( 'ii', $param[ 0 ], $param[ 1 ] );
}
$sql->execute();
$sql->close();

答案 2 :(得分:0)

无论是逐个运行还是在数组中运行,根据我的经验,INSERT语句不会对性能造成明显的影响。

数据库连接只打开一次,所以这不是一个大问题。我猜你是在做一些疯狂的查询,也可能是。

答案 3 :(得分:0)

我认为只要您的循环条件是安全的(会及时破坏)并且您从中得到了一些东西......没关系

答案 4 :(得分:0)

在ColdFusion中,您可以将循环放在查询中,而不是相反。我不是一个php程序员,但我一般认为,大多数可以用语言a完成的事情也可以用语言b来完成。此代码显示了该概念。你应该能够找出一个php版本。

<cfquery>
insert into mytable
(field1, field2)
select null, null
from SomeSmallTable
where 1=2
<cfloop from="1' to="#arrayLen(myArray)#" index="i">
select <cfqueryparam value="myArray[i][1]
, <cfqueryparam value="myArray[i][]
from SomeSmallTable
</cfloop>
</cfquery>

当我自己研究这种方法时,我发现它比使用oracle和sql server查询内部循环更快。我觉得红砖比较慢。

这种方法存在局限性。 Sql server具有它将接受的最大参数数量和最大查询长度。其他数据库引擎也可能,我还没有发现它们。