2013-08-29 19 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

相关问题