我需要使用以下代码根据用户输入生成唯一的slug:
public function create_slug($id, $name){
$count = null;
$name = url_title($name);
while(true) {
$this->db->select('id');
$this->db->where('id !=', $id);
$this->db->where('slug', $name);
$query = $this->db->get('users');
if ($query->num_rows() == 0) {
break;
} else {
$name .= '-' . (++$count);
}
}
return $name;
}
它选择所有加工slu(($name
)的东西,除了它自己的slu ..
第一个用户输入的结果 - 123
是slug - 123
。对于第二个相同的输入,slug是123-1
,但是具有相同文本的第三个输入是结果123-1-2
,这不是我想要的。
我尝试了另一种方式:
public function create_slug($id, $name){
$count = null;
$name = url_title($name);
$this->db->select('id');
$this->db->where('id !=', $id);
$this->db->where('slug', $name);
$query = $this->db->get('users');
if($query->num_rows()){
$count = '-' . ($query->num_rows() + 1);
}
return $name . $count;
}
这里是相同的查询,但计数行+ 1。
对于第一个123
,slu is是123
;
第二个123
,slu 123-2
;
第三个123
,再次出现123-2
,这不是唯一的。
如何创建基于某些用户输入的slug并且是唯一的,如果有值为name
的slug,则next为name-1
,如果再次为next,则为{{1} }} 等等。 ?
答案 0 :(得分:2)
您需要根据原始名称创建temp slug_name,并测试slug_name。如果失败,请根据原始名称重新创建新的slug_name。成功(中断循环)返回修改后的slug_name。
public function create_slug($id, $name)
{
$count = 0;
$name = url_title($name);
$slug_name = $name; // Create temp name
while(true)
{
$this->db->select('id');
$this->db->where('id !=', $id);
$this->db->where('slug', $slug_name); // Test temp name
$query = $this->db->get('users');
if ($query->num_rows() == 0) break;
$slug_name = $name . '-' . (++$count); // Recreate new temp name
}
return $slug_name; // Return temp name
}
或者像使用count_all_results一样。删除了你的id检查以及我认为slug需要对整个表格都是唯一的。
public function create_slug($id, $name)
{
$count = 0;
$slug_name = $name = url_title($name);
while(true)
{
$this->db->from('users')->where('slug', $slug_name);
if ($this->db->count_all_results() > 0) break;
$slug_name = $name . '-' . (++$count);
}
return $slug_name;
}