独特的url slugs(路线)

时间:2012-12-17 17:10:18

标签: php mysql codeigniter unique slug

假设我有这个db表架构:

id |      article          | slug
1    hey guys how are you?  hey-guys-how-are-you?

我正在尝试保持我的数据库路由字段唯一

路由始终是像this-is-a-title-but-now-is-a-route

这样的消息字段

因此插入相同的路线会产生db error of duplicated key

那么控制和插入始终唯一的路线是一个好习惯吗?

感谢

3 个答案:

答案 0 :(得分:4)

因为你已经标记了CodeIgniter,我建议预先检查slug字段的值,然后根据需要增加值。 CI string helper具有increment_string功能,可以为您处理。

increment_string()

通过向其附加数字或增加数字来增加字符串。用于创建“副本”或文件或复制具有唯一标题或标记的数据库内容。

用法示例:

echo increment_string('file', '_'); // "file_1"
echo increment_string('file', '-', 2); // "file-2"
echo increment_string('file-4'); // "file-5"

所以

this-is-a-route变为this-is-a-route-1

this-is-a-route-1变为this-is-a-route-2

答案 1 :(得分:1)

你可以使用php的uniqid,也许还有更多的熵来为你完成这项工作。

此函数的返回值始终相同。使用更多的熵23和13否则。因此,您可以轻松地将slu subs子包下来,随时随地获取实物。

答案 2 :(得分:0)

这个方法创建一个循环来增加slug,直到它找到一个不存在的。

在你的模特中:

public function create_slug($title) {
    $this->ci->load->helper('string');
    $this->ci->load->helper('url');

    $i = 1;
    $max = 10; 
    $slug = url_title($title, '-', TRUE);

    while($i <= $max && ($exist = $this->db->where('slug', $slug)->count_all_results('posts')) != 0) {
        $slug= increment_string($slug, '-');
        $i++;
    }

    //max was reached and the last slug is not unique
    if($i >= $max && $exist > 0) return FALSE;

    return $slug;
}