Php 使用while()生成随机文件名?

Php 使用while()生成随机文件名?,php,mysql,while-loop,Php,Mysql,While Loop,我正在使用while()循环创建一个随机文件名,对照数据库检查它,如果它已经存在,则循环。我只是有点担心我的语法/用法不正确,因为很久以前我只做过一次,从那时起我就没有以这种方式使用while()循环 这是我的代码: $i = 0; while(++$i) { $file_name = md5(mt_rand(0,9999999)) . ".php"; $result = mysql_query("SELECT * FROM x WHERE file_name = '{$file

我正在使用
while()
循环创建一个随机文件名,对照数据库检查它,如果它已经存在,则循环。我只是有点担心我的语法/用法不正确,因为很久以前我只做过一次,从那时起我就没有以这种方式使用
while()
循环

这是我的代码:

$i = 0;
while(++$i) {
    $file_name = md5(mt_rand(0,9999999)) . ".php";
    $result = mysql_query("SELECT * FROM x WHERE file_name = '{$file_name}'");

    if(mysql_num_rows($result) == 0) { break; } else { continue;}
}
这行得通吗?如果不行,有什么问题

我知道这是一个很小的问题,但测试这是否可行似乎更“艰巨”(需要创建一个新表,更改文件名以从1-3项中进行选择,显示消息而不是继续等)


我们将一如既往地感谢您的帮助!

这将起作用,但您可以将行:while(+$i)更改为while(true)

您不需要
$i
,因为您不使用它,也不需要
在循环中继续
——循环将自动循环,这就是它所做的。当您达到想要结束循环的条件时,您只需
中断

while(true) {
    $file_name = md5(mt_rand(0,9999999)) . ".php";
    $result = mysql_query("SELECT * FROM x WHERE file_name = '{$file_name}'");

    if (mysql_num_rows($result) == 0) break;
}
不过,您使用哈希的方式有点不正确。您应该生成一个比MD5哈希更长而不是更短的随机字符串。现在您只有10000000个可能的文件名(0..9999999)而不是MD5可以生成完整的2^128。与其担心2^128这样大的空间中的哈希冲突,不如简单地生成两次相同的数字,从而导致多次访问数据库

我知道这是一个很小的问题,但测试这是否可行似乎更“艰巨”(需要创建一个新表,更改文件名以从1-3项中进行选择,显示消息而不是继续等)

采用代码所采用的方法也比必要的“任务”更多。这是可行的,但为什么不让数据库为您执行“创建唯一的文件ID”工作呢


将x中的file_name列定义为file_id列,即
bigint(20)auto_increment
或类似的东西。然后在PHP代码中,发出一个查询以创建新行,获取保证的唯一数字ID,并将其转换为文件名。

太棒了!当计时器下降时,我会接受您的答案。同样在您的示例中,我经常看到人们运行
if()
语句,而不将结果括在括号中,您是否有可能解释允许两者/差异的规则?
如果
/
否则
/
全部接受“块”。块是任何单个语句,如
break;
,或一组语句,用大括号括起来。如果有多个语句,则只需将
的主体用大括号括起来,而
/则用大括号控制流结构。很酷,谢谢!你知道我可以做些什么来快速扩展MD5哈希吗?我只是在尝试创建随机文件名(不考虑格式),但知道如何正确使用某些内容总是很好的。这个问题过去就存在过。正如您所知,有一个内置的php函数可以在其文件夹中创建具有唯一名称的文件:
tempnam()
此代码不能防止表中有两个相同的文件名。因为它可以在同时运行的脚本中生成两个相同的随机文件名。哦,太酷了。
tempnam()的默认文件扩展名
be.php,或者我需要以某种方式附加.php吗?感谢您的想法,但根据,不可能有一个表,其中两列是
AUTO_INCREMENT
,我需要另一列的
AUTO_INCREMENT
功能:(.因此,使用现有的
自动增量
列中的值?它是否不适合您的目的,即使它不是最初的用途?