php sql查找并插入空槽

时间:2011-11-22 21:42:41

标签: php sql random

我设置了一个游戏脚本,当它创建一个新角色时,我希望它为该玩家的房子找到一个空地址。

它插入的两个相关表字段是'city'和'number'。 “城市”是10个随机数,“数字”可以是1-250。

它需要做的是确保不存在它在'HOUSES'表中找到的2个随机数的条目,如果有,则更改数字。重复,直到找到未使用的“地址”,然后插入。

我有一个方法设置来做这个,但我知道这是粗制滥造 - 可能有一些更合乎逻辑和更简单的方法。有什么想法吗?

更新

这是我目前的代码:

$found = 0; 
while ($found == 0) {
    $num = (rand()%250)+1; $city = (rand()%10)+1;
    $sql_result2 = mysql_query("SELECT * FROM houses WHERE city='$city' AND number='$num'", $db); 
    if (mysql_num_rows($sql_result2) == 0) { $found = 1; }
}

2 个答案:

答案 0 :(得分:0)

按照你说的方式进行操作可能会导致问题,只有一对(甚至左一)。脚本可能需要很长时间才能找到一个空房子。

我建议做的是在数据库中插入所有2500条记录(组合1-10和1-250),如果它是空的,则用它标记(或者用用户<>创建一个组合表)房子)和它匹配。

使用MySQL,您可以从数据库中选择一个随机条目,在任何时候都是空的!

因为它只有2500条记录,所以你可以ORDER BY RAND() LIMIT 1获得随机行。当你有更多的记录时,我不推荐这个。

答案 1 :(得分:0)

您可以像在PHP中一样使用,也可以使用MySQL触发器。

如果您坚持PHP方式,那么不要每次都生成一个数字,而是做这样的事情

$found = 0;

$cityarr = array();
$numberarr = array();

//create the cityarr
for($i=1; $i<=10;$i++)
    $cityarr[] = i;

//create the numberarr
for($i=1; $i<=250;$i++)
    $numberarr[] = i;

//shuffle the arrays
shuffle($cityarr);
shuffle($numberarr);

//iterate until you find n unused one
foreach($cityarr as $city) {
    foreach($numberarr as $num) {
        $sql_result2 = mysql_query("SELECT * FROM houses 
                                    WHERE city='$city' AND number='$num'", $db); 
        if (mysql_num_rows($sql_result2) == 0) {
            $found = 1;
            break;
        }
    }
    if($found) break;
}

这样您不会多次检查相同的值,并且仍然会随机检查。

但是您应该考虑在循环之前获取所有记录,因此您只有一个查询。这也会大大提高性能。

$taken = array();
for($i=1; $i<=10;$i++)
    $taken[i] = array();

$records = mysql_query("SELECT * FROM houses", $db);
while($rec = mysql_fetch_assoc($records)) {
    $taken[$rec['city']][] = $rec['number'];
}

for($i=1; $i<=10;$i++)
    $cityarr[] = i;
for($i=1; $i<=250;$i++)
    $numberarr[] = i;

foreach($cityarr as $city) {
    foreach($numberarr as $num) {
        if(in_array($num, $taken[]) {
            $cityNotTaken = $city;
            $numberNotTaken = $number;
            $found = 1;
            break;
        }
    }
    if($found) break;
}

echo 'City ' . $cityNotTaken . ' number ' . $numberNotTaken . ' is not taken!';

我会选择这种方法: - )