【问题标题】:uniqid() not generating unique values within a Foreach loop - PHPuniqid() 不在 Foreach 循环中生成唯一值 - PHP
【发布时间】:2021-09-16 14:51:32
【问题描述】:

我有一个处理图像上传的 foreach 循环。当我添加多个图像时,它们会获得一个包含唯一 ID 和时间戳的文件名,使用 $filebase = uniqid() . '_' . time();

处理图像时,它们具有相同的图像名称,我不明白为什么 foreach 循环没有给出唯一的文件名?

我将 $temp 变量分配给 foreach 循环的索引,其中包含以下行:$temp = $_FILES['standard-upload-files']['tmp_name'][$index]; 所以我不明白为什么它不增加新值?

图像被正确移动到目标文件夹(尽管名称相同),所以我知道这不是我的 HTML 表单或初始 foreach 循环的问题。

if(isset($_POST['submit-images'])) {

    foreach($_FILES['standard-upload-files']['name'] as $index => $filename ) {

        if($_FILES['standard-upload-files']['error'][$index] === 0 ) {

            $temp = $_FILES['standard-upload-files']['tmp_name'][$index];

            $filebase = uniqid() . '_' . time();

            move_uploaded_file($temp, "images-download/{$filebase}");

        }

    } // main foreach

} // isset($_POST)

【问题讨论】:

  • 你会得到什么:在你定义它之后回显 $temp,并在关闭 foreach 循环之前取消设置 $temp?
  • @Manny 当我回显 $temp 时,我只获取了我上传的图像数量的临时文件的路径(即两个图像的两个路径)。
  • 你能分享一些输出吗?
  • @Manny - 你是什么意思?如果为文件名提供相同的名称,例如如果我上传两个文件,它们都会根据$filebase 变量获得相同的文件名60e3ad5989fbb_1625533785。我没有包含 .jpg 扩展名等的代码,因此我可以在问题中将代码保持在最低限度)。

标签: php file foreach upload filenames


【解决方案1】:

我明白了,我的第一个猜测是使用uniqidUniqid 基于当前时间(以微秒为单位)生成,这可能会产生相同的值。如文档所述,此函数不保证返回值的唯一性

由于大多数系统通过 NTP 或类似的方式调整系统时钟,因此系统时间不断变化。因此,此函数可能不会返回进程/线程的唯一 ID。使用more_entropy 增加唯一性的可能性。

[不太可靠] 的解决方案是将 more_entropy 设置为 true:

uniqid('', true)

但请记住,这种方法并不可靠。

因此,请使用另一种方法来生成您的唯一 ID(例如 UUID,如 cmets here 中所述。)

【讨论】:

  • 感谢 Manny,这是问题所在。
猜你喜欢
  • 2015-03-23
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 2019-12-14
  • 2011-08-30
相关资源
最近更新 更多