PHP检查ID是否已被使用

时间:2014-10-06 21:09:32

标签: php mysql

我目前正忙于创建基于PHP / MySQL的自己的6人游戏。我想检查来自players_online的ID是否已被使用,如果是,那么它需要继续搜索,直到找到一个(直到最大6),否则它需要返回0;

$ con是与数据库的连接,您可以在.mysql_config.php上找到设置

这就是我得到的:

function find_local_id()
{
    include'./mysql_config.php';
    $i=1;
    $select_id=mysqli_fetch_assoc(mysqli_query($con, "SELECT `ID` FROM `players_online` WHERE ID = ".$i.""));
    if ($select_id["ID"] == $i) {
        $i++;
        $select_id=mysqli_fetch_assoc(mysqli_query($con, "SELECT `ID` FROM `players_online` WHERE ID = ".$i.""));
        if ($select_id["ID"] == $i) {
            $i++;
            $select_id=mysqli_fetch_assoc(mysqli_query($con, "SELECT `ID` FROM `players_online` WHERE ID = ".$i.""));
            if ($select_id["ID"] == $i) {
                $i++;
                $select_id=mysqli_fetch_assoc(mysqli_query($con, "SELECT `ID` FROM `players_online` WHERE ID = ".$i.""));
                if ($select_id["ID"] == $i) {
                    $i++;
                    $select_id=mysqli_fetch_assoc(mysqli_query($con, "SELECT `ID` FROM `players_online` WHERE ID = ".$i.""));
                    if ($select_id["ID"] == $i) {
                        $i++;
                        $select_id=mysqli_fetch_assoc(mysqli_query($con, "SELECT `ID` FROM `players_online` WHERE ID = ".$i.""));
                        if ($select_id["ID"] == $i) {
                            return 0;
                        } else {
                            return 6;
                        }
                    } else {
                        return 5;
                    }
                } else {
                    return 4;
                }
            } else { 
                return 3;
            }
        } else { 
            return 2;
        }
    } else { 
        return 1;
    }

有没有办法让这个小/紧凑?因为我觉得这对于一个小功能来说非常重要。 :)

4 个答案:

答案 0 :(得分:1)

我认为这样可行:

function find_local_id()
{
    include'./mysql_config.php';

    $result = mysqli_query($con, "SELECT `ID` FROM `players_online`");

    while($row = mysqli_fetch_assoc($result)) {
        $ids[] = $row['ID'];
    }
    if($available = array_diff(range(0, 6), $ids)) {
        return min($available);
    }
    return 0;
}

如果你mysqli_fetch_all使用它。

  1. 获取表格中的所有ID
  2. 查看哪些(1-6)不在结果中
  3. 如果可用,则返回最低的
  4. 如果没有返回0

答案 1 :(得分:0)

首先,您可以使用循环来执行此操作(但您不需要循环)。

你不必要地多次击中数据库。

创建一个接受一个整数id并返回行数的函数或查询(如下所示)。

<?php

$db = new PDO('mysql:host=localhost;dbname=yourdb', 'user', 'pass');

$id = ''; //input, whether it be a param from a function, session superglobal, GET or POST.

$exists = $db->prepare('SELECT id FROM players_online WHERE id = ?');
$exists->execute(array($id));

echo $exists->rowCount(); // if greater than 1 or equal, it exists.

答案 2 :(得分:0)

你可以做得更好

$sql = "SELECT * FROM players_online WHERE id BETWEEN {$i} AND {$i}+6";
$stmt = mysqli_query($con, $sql) or die(mysqli_error($con));
$in_use = mysqli_num_rows($stmt);

如果所有6个ID都在数据库中,那么您将在$in_use中获得6行。如果5出现,那么你将获得5行等等......

答案 3 :(得分:0)

你似乎有一个非常有缺陷的设计,因为你不会使用这种方法在一个以上的游戏中进行扩展,需要从表中删除行以使其在生成新游戏时起作用在并发性很高的情况下,会遇到竞争条件问题。但假设您有管理插入玩家记录ID的方法(1,2,3等)。您的查询可以是:

SELECT MAX(id) FROM players_online

这将告诉您表中当前的最高ID。您只需插入下一个播放器,其id值在当前最大值之上加1。