使用PDO将多个INSERT分成3个表

时间:2011-04-15 14:02:24

标签: php mysql sql for-loop pdo

如何使用PDO执行3个不同的表INSERT,通过for循环生成SQL查询,例如

我的脚本非常庞大,因此要将其缩小到代码的主要因素。

$date_sql = '';
for($i = 0; $i < count($_POST['date_range']); $i++)
{
    // codez

    $date_sql .= " INSERT INTO dates (date_one, date_two) VALUES('" . $_POST['date_range'][$i] . "', '" . $_POST['date_range_end'][$i] . "'); ";

    // more codez
}

我有 3 for循环,这与我给出的循环相同,但不同的$_POST值和不同的表:monthsyears。它将从$*_sql变量生成多行SQL查询。

完成3个循环后,我将3个sql变量加入一个字符串:

$main_sql = $date_sql . $month_sql . $year_sql;

然后我希望它执行处理它的SQL并将值插入表中,如下所示:

$dbh->beginTransaction();

$sth = $dbh->exec($main_sql);

$dbh->commit();

但这是正确的有效的方式吗?

3 个答案:

答案 0 :(得分:3)

这样做的PDO方式越多,就是使用预备语句。准备好之后,只需更改值就可以执行多次。

$sql = "INSERT INTO dates (date_one, date_two) VALUES(:one, :two)";
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));

for($i = 0; $i < count($_POST['date_range']); $i++) {
   $sth->execute(array(':one' => $_POST['date_range'][$i], ':two' => '$_POST['date_range_end'][$i]));
}

答案 1 :(得分:0)

您描述的方式将起作用,它将执行三个命令,但由于它们非常小,因此不会对数据库造成太大影响。

另一种方法是格式化如下的查询:

INSERT INTO dates (date_one, date_two)
SELECT $_POST['date_range'][0] , $_POST['date_range_end'][0]
UNION SELECT $_POST['date_range'][1] , $_POST['date_range_end'][1]
UNION SELECT $_POST['date_range'][2] , $_POST['date_range_end'][2]

答案 2 :(得分:0)

不,这不是正确,首选和有效的方法。您想看看PDO准备好的陈述:pdo->prepare()pdoStatement->bindParam()pdostatement->execute()pdostatement->fetch()