在for循环中存储mysql中的变量

时间:2014-05-16 13:55:31

标签: php mysql

我正在开发一个项目,我需要将一些变量保存到数据库中并检索类中的一些变量以重新计算下一批变量。

然而,我开始意识到当前项目运行速度太慢,并找出泄漏的位置:存储这些变量。 (在PHP中插入语句)

因为insert语句可以进入一个非常大的for循环,就像这样($ auctionobjects和numberofdays由用户填写,$ hours == 24):

for($i = 0; $i< $numberofdays)  {
    for ($n = 0; $n < $hours)  {
        for ($k = 0; $k < $auctionobjects)  {
        $strSql = 'insert into results (vars) values ()'
        $blnOke = $objDatabase->query($strSql)
        }
    }
 }

等待时间可能会很长,这是不可取的,因为模拟必须能够运行很长时间。

现在我的想法是获得一个插入语句如下:

$strSql = 'insert into results (vars) values (), (),()'

但填充MySql中列的变量会在整个模拟过程中发生变化。由于我不知道$ auctionobjects变量有多大,我无法得到正确数量的括号,我需要填写。

我能做的是创建一个变量来创建$ auctionobjects所需的字符串,如下所示:

$createSqlString  = '(vars)'
for($x = 0; $x< $auctionobjects; $x ++)  {
   $createSqlString .= ,(vars)
}

然后将其插入Sql语句中,但我不确定是否有更清晰的解决方案。

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

$createSqlString = `INSERT INTO results (var, var, var) VALUES ';
$vars = array();

for($x = 0; $x < $auctionobjects; $x ++)  {
    /* processing ... */
    $vars[] = "($val1, $val2, $val3)";
}
$createSqlString .= implode (',', $vars);
对于这些SQL风格的逗号分隔列表,

implode非常好。

如果你想非常小心绑定变量以防止注入攻击,你可以试试这个:

$createSqlString = `INSERT INTO results (var, var, var) VALUES ()';
$sqls = array();
$vals = array();

for($x = 0; $x < $auctionobjects; $x ++)  {
    /* processing ... */
    $sqls[] = '(?,?,?)';
    $vals[] = $val1;
    $vals[] = $val2;
    $vals[] = $val2;
}
$createSqlString .= implode (',', $vars);
/* then bind the $vals array to the statement and execute it */