如何使用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
值和不同的表:months
,years
。它将从$*_sql
变量生成多行SQL查询。
完成3个循环后,我将3个sql变量加入一个字符串:
$main_sql = $date_sql . $month_sql . $year_sql;
然后我希望它执行处理它的SQL并将值插入表中,如下所示:
$dbh->beginTransaction();
$sth = $dbh->exec($main_sql);
$dbh->commit();
但这是正确的有效的方式吗?
答案 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()