我想创建一个查询,我可以检查我为我的数据库中没有出现的新视频条目的URL.
我目前的查询是:
SELECT Count(videoid) FROM video WHERE titleurl = 'test';
Run Code Online (Sandbox Code Playgroud)
我将计数存储在变量中$n
然后使用以下PHP代码进行检查
if ($n > 0){
return $output . "-$n";
}else{
return $output;
}
Run Code Online (Sandbox Code Playgroud)
但上面的查询正在创建一个问题.假设
Test
因此网址将是http://example.com/video/test/
Test
所以url将是http://example.com/video/test-1/
因为一个带有titleurl的条目test
已经存在,所以我在其中添加了1,这将是test-1
test
但这次符合我的方法url将test-1
是错误的.我想解决这个问题,如果test
已经存在那么它应该是test-1
,如果另一个用户创建一个名为test的条目然后url应该是test-2
因为测试并且test-1
已经存在.
请给出一些我可以解决这个问题的方法.
友好的网址很好,但您应该始终添加对象ID,或者在数据库中存储唯一的字符串.例如,检查stackoverflow上的URL.
编辑 我严重怀疑谷歌可以用短数字但不喜欢长数字.以下是仅在必须使用数字的解决方案:添加另一个包含每个测试视频的"id"值的列,并在该标题和titleurl上创建唯一索引:
ALTER TABLE video ADD COLUMN titleurl_id UNSIGNED TINYINT NOT NULL;
CREATE UNIQUE INDEX uidx_url ON video (titleurl, titleurl_id);
Run Code Online (Sandbox Code Playgroud)
创建视频时,您需要添加该值:
$amount = query("SELECT COUNT(*) FROM video WHERE titleurl='test'");
query("INSERT INTO video(titleurl, titleurl_id) VALUES ('test', $amount + 1)");
Run Code Online (Sandbox Code Playgroud)
你需要注意插入查询的结果,如果你这样做,你可能会遇到竞争条件(这就是为什么id在url中更方便).创建URL:
$urlpart = query("
SELECT IF(
titleurl_id = 0,
titleurl,
CONCAT_WS('-', titleurl, titleurl_id)
) AS url FROM video");
Run Code Online (Sandbox Code Playgroud)