【问题标题】:Generate unique slug Codeigniter 3 && MySQL生成独特的 slug Codeigniter 3 && MySQL
【发布时间】:2016-09-07 22:49:00
【问题描述】:

我需要使用此代码根据用户输入生成唯一的 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;
}

它会选择所有与 slug ($name) 匹配的东西,除了它自己的 slug。 第一个用户输入的结果 - 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,slug 是123; 第二个123,蛞蝓123-2; 第三个123,又是123-2,这不是唯一的。

如何创建基于某些用户输入且唯一的 slug,如果存在值为 name 的 slug,下一个将是 name-1,如果再次,下一个将是 name-2 等等?

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    您需要根据原始名称创建一个临时 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-02
      • 2013-07-31
      • 2017-11-13
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      • 2016-07-05
      相关资源
      最近更新 更多