如何使用uniqid()更新多行,使其在php中唯一

如何使用uniqid()更新多行,使其在php中唯一,php,pdo,foreach,unique,Php,Pdo,Foreach,Unique,我在mysql中创建了一个新列,它将为数据库中的所有元素存储一个唯一的值 现在,我想使用uniqid()用这个唯一值填充所有行 但是由于该函数使用了microtime(),因此无法同时更新所有行。 我怎么做呢 $unique_id = uniqid(); $sql = "UPDATE posts SET unique_id = :unique_id"; $stmt = $pdo->prepare($sql); $stmt->execute(['unique_id' => $u

我在mysql中创建了一个新列,它将为数据库中的所有元素存储一个唯一的值

现在,我想使用
uniqid()
用这个唯一值填充所有行

但是由于该函数使用了
microtime()
,因此无法同时更新所有行。

我怎么做呢

$unique_id = uniqid();

$sql = "UPDATE posts SET unique_id = :unique_id";
$stmt = $pdo->prepare($sql);
$stmt->execute(['unique_id' => $unique_id]);
此代码为所有行更新相同的值。
如何使每一行都是唯一的?

试试下面的代码

SET @r := 0;
UPDATE  posts 
SET unique_id = (@r := @r + 1)
ORDER BY RAND();
试试这个

update posts set unique_id = @i:=@i+1 order by rand();
数字现在将随机分配给行,但每行都有一个唯一的值

uniqid('', TRUE),
您可以将uniqid与熵一起使用,使其在时间上更加敏感,以缩小复制的可能性,但请记住一件事:

此函数不保证返回值的唯一性。自从 大多数系统通过NTP或类似方式调整系统时钟,系统时间为 不断变化。因此,此功能可能不起作用 不返回进程/线程的唯一ID。使用更多的熵来 增加唯一性的可能性

您还可以做的是放置一个随机前缀,如:

uniqid(mt_rand(),TRUE)

这将消除生成副本的所有机会

您将使用随机前缀+熵敏感度。生成的值将是唯一的,即使您的脚本运行速度如此之快,以至于时间戳恰好是相同的,即使以毫秒为单位

代码的问题在于,通过将函数赋值给一个变量,您只使用了一次
uniqid()
函数,并且从中获得了重复项,当然,这是因为您使用了该变量:

请尝试以下代码:

$sql = "UPDATE posts SET unique_id = uuid()";
$stmt = $pdo->prepare($sql);
$stmt->execute();

因此,经过一些尝试,我找到了自己的解决方案,使用uniqid() 这是我的代码,评论道:

// Selecting all the posts
$sql = "SELECT id, pro_key FROM posts";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$posts = $stmt->fetchAll();

// Looping through all the results and updating them one by one with a delay of 1 second between the updates
foreach($posts as $post) {
  $sql = "UPDATE posts SET unique_id = :unique_id WHERE id = :id";
  $stmt = $pdo->prepare($sql);
  $stmt->execute(['id' => $post->id, 'unique_id' => uniqid()]);
  // delay
  sleep(1);
}

希望这有帮助。

你是什么意思?你能分享你的代码吗?uniqid()函数可用于根据当前时间戳生成一个绝对唯一的值,您可以添加熵,以进一步降低时间戳匹配的可能性(实际上发生在同一毫秒,这是不可能的),您正在使用上述代码并在uniqid上获得实际的重复项?@pr1nc3是的,测试它。我在考虑在foreach循环中调用该函数的可能性,比如说延迟1秒。但是我不知道如何开发代码这是有效的,将随机唯一值更新到我的帖子中,但我希望每个帖子都有一个13个字符的随机值,就像uniqid()生成的那样。我按照您的提示设置了$unique_id变量,但我仍然得到了每行相同的精确值。遗漏了一些东西…好吧,我如上所述尝试过,但仍然得到相同的值。你能再试一次吗?编辑了我的回答它正在使用uuid()并将其放入sql变量中,但我不明白为什么uniqid()不能更新uuid()。很公平,如果你找到了解决方案,这意味着你找到了可以循环的东西。如果它对你有效,那就太好了:)目标是在我需要每个帖子都有一个13个字符长的唯一id后解决你的问题,就像uniqid()产生的那样。