2011-04-15 56 views
2

如何使用PDO执行3个不同的表插入操作,以便通过for循环生成SQL查询。使用PDO将多个INSERT插入到3个表中

我的脚本非常庞大,所以要把它缩小到代码的主要因素。

$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 
} 

我有 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

这样做是使用准备好的语句的更多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])); 
} 
+0

使用`:one`,`:two`等链接时是否安全?值必须先逃脱吗? – MacMac 2011-04-15 14:50:15

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] 
相关问题