我正在使用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个选项中选择,显示消息而不是继续等。
任何帮助,一如既往,将不胜感激!
答案 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)