创建一个唯一的 8 位数字并将其插入数据库,没有重复项


Creating a unique 8 digit number and inserting it into a database without duplicates

我正在尝试为我的网站中的每个页面创建一个唯一的URL号,以便轻松地将其包含在站点地图中。我的网址看起来像这样:site.com/book/11111111site.com/book/11111112

我想为每个ID插入一个唯一的URL,但遇到了一个小问题。我使用下面的代码,它不能保证我的thing_url每次都是唯一的。我可以使用 if-else 语句检查它的唯一性,但即使我第二次检查它,我的字符串也可能是第二次唯一的,也可能不是唯一的。我不想有很多变量和if-else语句使用$thing_url$thing_url2$thing_url3等。

有没有办法使用单个循环检查唯一性,直到成功?这就是我现在所做的。

$thing_name = $_POST['thing_name']; // form value
$thing_url = mt_rand(10000000, 99999999); // generates 8 digit numeric string
$query = "SELECT thing_url FROM thing WHERE thing_url = '$thing_url'";
$result = $sqli->query($query);
$row = $result->fetch_assoc();
$finish = $row['thing_url'];
if($finish == $thing_url) {
    echo "Bad luck";
} else {
 $thing = $sqli->prepare("INSERT INTO thing(thing_url, thing_name ) VALUES (?,?)"); // prepare
    $thing->bind_param("ss", $thing_url, $thing_name); // bind
    $thing->execute(); // execute
    $thing->close(); // close
}

由于这种类型的同步问题,客户端不应尝试生成任何唯一内容(GUID 除外)。 相反,中央协调员应该承担这一责任。

在您的情况下,理想的协调器是您的数据库MySQL。 您可以使用网址的主键(来自thing_url)作为唯一标识符。 只要数据库遵循将主键递增 1 的典型模式,并且您从较低的数字(通常为 1)开始,这将正常工作。

我已经为每条记录使用了auto_incremented ID,它们是唯一的,但我想将这些thing_url用作唯一的 URL。 auto_increment ID 值很容易猜到,我不希望我的网站内容被那么容易抓取

然后以某种双射方式排列 ID,例如具有某种位模式的 XOR,旋转位,交换字节等。