使用PHP和PDO的foreach循环中的变量
问题描述:
我试图向用户表中添加一些UUID。我有一个foreach循环应该为我的db中的每个用户生成一个唯一的UUID。问题是,每个用户都在数据库中获得相同的UUID,但是当我添加一个“回声”时,我发现它为每个用户生成一个单独的UUID,但这并不反映在数据库中。 PDO是否进行某种缓存,因为它不关心$ uuid变量是否正在改变?使用PHP和PDO的foreach循环中的变量
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));
}
答
尝试在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']));
}
答
的问题是,你总是更新的所有条目ID您的foreach循环中。因此,当fooreach循环结束时,数据库中的所有条目将具有最后选择的uuid作为id。
相反,您必须确保只在每次运行循环时修改单个数据库条目。你可以通过在更新语句的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']));
方面:你应该只准备一次update语句:在foreach循环之前。每次运行都不需要重复该步骤。
+0
你是绝对正确的循环之前准备语句。 – TheG 2014-10-12 10:04:25
为什么'$ ids [$ k]'而不是'$ id'?这不就是使用'foreach'而不是'for'的意思吗? – Barmar 2014-10-12 09:05:16
@Barmar是啊感谢纠正我的一个 – Ghost 2014-10-12 09:08:13
@ghost我试过你的解决方案,但我得到一个“数组到字符串转换...”错误 – TheG 2014-10-12 09:24:15