我有这样的剧本:
$rrezervim_id = rand(1, 5);
$result = mysql_query("SELECT rrezervim_id FROM pax_list WHERE rrezervim_id='$rrezervim_id'");
if(mysql_num_rows($result) == 1)
{
$rrezervim_id = rand(1, 5);
}
else(mysql_num_rows($result) > 1);
{
echo "$rrezervim_id";
}我想要做的是使用PHP和MySql生成一个唯一的随机数,我有一个表内值(Rrezervim_id)值:1,2,3,5,所以唯一需要生成并且是免费的随机数是数字4。但是使用这个脚本,有些东西是不工作的,因为我得到的是已经插入表值中的随机数:1,2,3,5。
任何人都可以帮助我,在生成表中已经存在的唯一数字之前,在mysql中进行检查是非常重要的。
发布于 2013-12-14 00:25:34
首先,代码中的直接错误是
if(mysql_num_rows($result) == 1)
{
$rrezervim_id = rand(1, 5);
} 失败,如果您按了一个已取数字两次。您需要一个循环,例如
while (mysql_num_rows($result) == 1)
{
$rrezervim_id = rand(1, 5);
$result = mysql_query("SELECT rrezervim_id FROM pax_list WHERE rrezervim_id='$rrezervim_id'");
}尽管如此,我怀疑,您的代码有更多的错误:
我建议您考虑使用一个内置的数据库,例如经过战斗验证的AUTO_INCREMENT作为主要手段,然后使用一个公式从其中创建难以猜测的伪随机。线性反馈移位寄存器可以是一种方法,而密码学上将自动生成的ID和存储在表中的伪随机(不一定是唯一的)结合起来可能是另一种方法。这两种方法都提供了线性性能和无种族使用。
发布于 2013-12-14 00:15:28
您可以在php中创建唯一的数字。
<?php
echo uniqid();
?>但是你应该使用自动增量。如果您想知道保存插入项的编号,请使用如下所示:
function insertUser(){
Global $userName;
$sqlInsert="INSERT INTO person (e_mail)
VALUES ('".$userName."')";
if (!mysql_query($sqlInsert)){
die('Error: ' . mysql_error());
}
$userId = mysql_insert_id();
return $userId;
}在$userId中是最后插入的值。
发布于 2013-12-14 00:59:23
由于您没有使用AUTO_INCREMENT,建议(慢)选择所有有效的数字并随机选择1。
如果我们有1,2,3,5,7,我们允许的元素是..10,那么我们有5个允许的元素(4,6,8,9,10)。因此,我们兰特(1,5)。如果我们得到"1",下一个数字是4,如果我们得到"2",我们的下一个数字是6。为了更好地解释这个想法:
Rand(1,5) Our array Value(available)
1
2
3
1 - 4
5
2 - 6
7
3 8
4 9
5 10代码示例:
$max_num = 100;
$res = mysql_query("SELECT rrezervim_id FROM pax_list ORDER BY rrezervim_id ASC");
$nums = [];
while($row = mysql_fetch_assoc($res)){
$nums[] = $res['rrezervim_id'];
}
$numbers_allowed = $max_num - count($nums); // actual number of allowed elements
$new_num_idx = rand(1, $numbers_allowed); // The selected element's index
(skipping all existing elements)
// in the following loop: $j starts as our lowest options.
// when $new_num_idx reaches 0 - it means that we have skipped
// over $new_num_idx elements. The next available element is
// our choice. $new_num_idx is a countdown
for($i=0,$j=1, $n=count($nums); $i<$n && $new_num_idx > 0; $i++){
while ($nums[$i]>$i+$j){
$j++; $new_num_idx--;
}
}
return $i+$j;https://stackoverflow.com/questions/20578126
复制相似问题