2013-08-29 20 views
1

如果我有一個執行PDO語句的循環,是否有辦法整理這些執行並在循環之後一次運行它們,或者單獨執行每個循環是否正常?我應該同時向MySQL發送多個任務嗎?如果是這樣,怎麼樣?

例如,我更新的每一行上一個字段在我的數據庫是這樣的:

$pdo = new PDO(/* valid connnection arguments */); 

$stmt = $pdo->prepare("SELECT id, username, password FROM users ORDER BY id ASC"); 
$stmt->execute(); 

foreach($stmt->fetchAll(PDO::FETCH_CLASS) as $user) 
{ 
    $token = sha1($salt . $user->username . $user->password); 

    $stmt = $pdo->prepare("UPDATE users SET token = :token WHERE id = :id LIMIT 1"); 
    $stmt->execute(array(
     ":id" => $user->id, 
     ":token" => $token 
    )); 
} 

但是我很有信心這個應該怎樣做,作爲一個查詢到MySQL。我很熟悉在phpMyAdmin中連接;的查詢,所以我猜這是關鍵,但我不知道如何與預處理語句結合使用。

+0

我知道這不利於這種情況,但只需要「準備」一次。 – Mike

+0

@Mike你的意思是我可以做一個'準備'與多個'執行'持有不同的數據?我不知道,謝謝。我一直把它作爲準備執行,之後狀態被重置,你需要再次準備。 – Marty

+0

是的,你只需準備一次,然後循環綁定並執行。 – Mike

回答

0

是正常的,分別執行每一個?

是的。
對於像這樣的一次性任務,有多個查詢就沒問題。你必須避免的是定期運行大型循環,因爲它並不重要,如果你可以碰撞你的語句 - 數據庫將不得不以任何方式運行它們。

所以,現在你可以運行你的大規模更新循環,並轉向更緊急的事情。

+0

感謝您的反饋 - 我假設有一種方法可以批量處理多個語句以避免對數據庫的多重請求,但如果情況並非如此,我很舒服。 – Marty

1

你可以讓數據庫處理更新:http://dev.mysql.com/doc/refman/5.6/en/encryption-functions.html#function_sha1

UPDATE users SET token=sha1(token) 
+0

這在這種情況下很有效(我的示例可能有點寬泛),但不回答實際問題。 – Marty

+0

@MartyWallace你可以更具體地說明你正在嘗試做什麼嗎?我假設jeff意思是'更新用戶SET令牌= sha1(CONCAT(:鹽,用戶名,密碼))',但只是簡化它。 – Mike

相關問題