我正在尝试为我的网站中的每个页面创建一个唯一的URL号,以便轻松地将其包含在站点地图中。我的网址看起来像这样:site.com/book/11111111
,site.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,旋转位,交换字节等。