2013-10-01 51 views
12

在循環代碼的經典交易:PHP編寫的語句和事務在一個循環

$mysqli->query("START TRANSACTION"); 
foreach ($pdata as $key => $value) { 
    $sql = "INSERT INTO temp (`fund_id`) VALUES (" . $value . ")"; 
    $result = $mysqli->query($sql); 
} 
$mysqli->query("COMMIT"); 

然後我們切換到準備好的發言:

$mysqli->autocommit(FALSE); 
foreach ($pdata as $key => $value) { 
    $sql = "INSERT INTO temp (`fund_id`) VALUES (?)"; 
    $stmt = $mysqli->prepare($sql); 
    $stmt->bind_param('i', $value); 
    $stmt->execute(); 
} 
$mysqli->commit(); 

問題:

1)這些是兩個代碼相同?我是否在準備好的陳述中遺漏了第二個代碼中的內容?

2)是$mysqli->commit()是否與$mysqli->query("COMMIT")相同?

3)我是否需要爲已準備好的語句塊添加$mysqli->query("START TRANSACTION");或者當我們設置autocommit(FALSE)時事務會自動啓動?

+4

在您關閉自動提交後,您不需要「開始交易」。你可以''mysqli-> prepare()'_before_你的循環,然後在'foreach'循環中執行()它。在每次循環迭代中不需要「準備()」它。 –

+5

每次你都不需要'bind_param()'。它綁定對變量的引用,所以每次執行它都會使用變量的當前值。 – Barmar

回答

22

通過將preparebind_param語句拉出循環,可以優化您的循環。

$value = null; 
$mysqli->autocommit(FALSE); 
$sql = "INSERT INTO temp (`fund_id`) VALUES (?)"; 
$stmt = $mysqli->prepare($sql); 
$stmt->bind_param('i', $value); 
foreach ($pdata as $value) { 
    $stmt->execute(); 
} 
$mysqli->commit(); 

您已關閉自動提交您的autocommit(FALSE)線,因此不需要使用START TRANSACTION聲明。

+0

短和appropriet。 – neophyte