2011-04-15 77 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]