使用PHP和PDO在foreach循环中变量

时间:2014-10-12 08:43:22

标签: php mysql pdo

我试图将一些UUID添加到我的用户表中。我有一个foreach循环,它应该为我的数据库中的每个用户生成一个唯一的UUID。问题是每个用户在数据库中获得相同的UUID,但是当我添加一个" echo"我看到它为每个用户生成一个单独的UUID,但这并没有反映在db中。 PDO是否正在进行某种缓存,因为它并不关心$ uuid变量是否正在发生变化?

function getAllIds($db) {
$stmt = $db->query("SELECT id from users;");
$array = $stmt->fetchAll();
return $array;
}

foreach (getAllIds($db) as $ids) {
$uuid = uuid();
print "$uuid\n";
$stmt = $db->prepare("update users set user_uuid = ?");
$stmt->execute(array($uuid));
}

2 个答案:

答案 0 :(得分:1)

问题是您始终在foreach循环中更新所有条目的ID。因此,当fooreach循环完成时,数据库中的所有条目都将最后选择的uuid作为id。

相反,您必须确保仅在每次循环运行时修改单个数据库条目。您可以通过在update语句的where子句内指定条目来实现。

$query = $db->prepare("UPDATE users SET user_uuid=:uuid WHERE id=:id");
foreach (getAllIds($db) as $entry)
  $query->execute(array(':uuid'=>uuid(), ':id'=>$entry['id']));

侧面方面:您应该只准备一次更新语句:在foreach循环之前。每次运行都无需重复该步骤。

答案 1 :(得分:1)

尝试在where子句中添加用户ID:

function getAllIds($db) {
    $stmt = $db->query("SELECT id from users;");
    $array = $stmt->fetchAll(PDO::FETCH_ASSOC);
    return $array;
}

$stmt = $db->prepare("UPDATE users SET user_uuid = :uuid WHERE id = :id");
$ids = getAllIds($db);
foreach ($ids as $k => $id) {
    $uuid = uuid();
    $stmt->execute(array(':uuid' => $uuid, ':id' => $id['id']));
}