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

时间:2011-09-14 02:54:35

标签: 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_name}'");

    if(mysql_num_rows($result) == 0) { break; } else { continue;}
}

这会起作用吗,如果不合适,会有什么问题吗?

我知道这是一个小问题,但是测试这是否会起作用似乎更加“任务”(需要创建一个新表,更改文件名以从1-3个选项中选择,显示消息而不是继续等。

任何帮助,一如既往,将不胜感激!

3 个答案:

答案 0 :(得分:4)

您不需要$i,因为您没有使用它,并且您不需要在循环中continue - 循环将自动循环,这就是它的作用。当您达到想要结束循环的条件时,您只需要break

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哈希更短的随机字符串更长。现在你只有10,000,000个可能的文件名(0..99999999),而不是MD5可以产生的完整2 ^ 128。而不是担心空间中的哈希冲突大到2 ^ 128,你有更高的机会简单地生成两次相同的数字,导致多次访问数据库。

答案 1 :(得分:2)

  

我知道这是一个小问题,但是测试这是否会起作用似乎更加“任务”(需要创建一个新表,更改文件名以从1-3个选项中选择,显示消息而不是继续等。

采用代码所采用的方法也比必要的更“任务”。这是可行的,但为什么不让数据库为你创建“创建一个独特的文件ID”呢?

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

答案 2 :(得分:1)

这会有效但您可以更改行:while(++ $ i)into while(true)