假设我有这个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
那么控制和插入始终唯一的路线是一个好习惯吗?
感谢
答案 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;
}