使用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'])); 
} 
+0

为什么'$ ids [$ k]'而不是'$ id'?这不就是使用'foreach'而不是'for'的意思吗? – Barmar 2014-10-12 09:05:16

+0

@Barmar是啊感谢纠正我的一个 – Ghost 2014-10-12 09:08:13

+0

@ghost我试过你的解决方案,但我得到一个“数组到字符串转换...”错误 – TheG 2014-10-12 09:24:15

的问题是,你总是更新的所有条目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