$number = 1;
do{
$list_name = "Unnamed list ".$number;
$list_name_exists = DB::select('name')->from('shoppinglists')->where('name', '=', $list_name)->execute()->count(); // returns 1 or 0
$number++;
}while($list_name_exists == 0);
echo $list_name; // I want it here to output a name, that doesnt exists in the db.
我上面试图做的是将 $list_name 设置为数据库中尚不存在的名称。
但它似乎不起作用,并且页面加载了相当长的时间。
我怎样才能做到这一点?
您需要
将列表编号保留为单独的列,以便您可以
SELECT MAX(list_number) + 1 AS new_number FROM lists
并立即找出您应该使用哪个号码。进行 10000 次查询只是为了找到下一个可用数字是 10001 是没有意义的。
也就是说,当您开始使用new_number
时,它仍然可能不再有效(因为可能来自其他用户的另一个请求占用了相同的数字(。这将取决于数据库的事务隔离级别,当然也取决于您是否使用事务。
如果您不想深入交易领域,只需确保list_number
列上有UNIQUE
或PRIMARY
键即可。您还必须保持不成功的循环。不同之处在于,现在循环最多执行几次,不可能执行数万次。
脚本需要很长时间才能完成,因为您在do/while
循环的每次传递中都执行数据库查询。我只需从您的数据库中选择最高 ID,并将其(加一(用作您的新列表名称。
伪代码:
<?php
// initiate database connection
$sql = "SELECT MAX(id) FROM tbl_name";
$res = $db->query($sql);
$row = $res->fetch();
$new_list_name = (intval($row) + 1);
唯一的下载是,您可能会发现一个竞争条件,即两个人访问您的网站并在将他们的列表名称保存回数据库之前获得相同的 ID。在这种情况下,您可以只使用唯一 ID。
<?php
// make a unique ID to use as list name
$new_list_name = uniqid();
简单。