我想创建一个查询,我可以检查我为新视频条目制作的URL在我的数据库中不存在。
我目前的查询是:
SELECT Count(videoid) FROM video WHERE titleurl = 'test';
我将计数存储在变量$n
中,然后使用以下PHP代码检查它
if ($n > 0){
return $output . "-$n";
}else{
return $output;
}
但上面的查询正在创建一个问题。假设
Test
的视频,因此网址为http://example.com/video/test/
Test
的视频,因此该网址将为http://example.com/video/test-1/
,因为已存在一个标题为test
的条目,因此我在其中添加了一个test-1
{1}} test
的视频条目,但这次符合我的方法网址将是test-1
,这是错误的。我想解决这个问题,如果test
已经存在,那么它应该是test-1
,如果另一个用户创建名称为test的条目,那么url应该是test-2
因为测试和test-1
已经存在。
请提供一些解决此问题的方法。
答案 0 :(得分:5)
友好的网址很不错,但您应该始终添加对象ID,或者在数据库中存储唯一的字符串。例如,检查stackoverflow上的URL。
修改强> 我严重怀疑谷歌是否可以使用短号,但不喜欢长号。以下是仅在必须使用数字的解决方案:添加另一列,其中包含每个测试视频的“id”值,并在该标题和标题上创建唯一索引:
ALTER TABLE video ADD COLUMN titleurl_id UNSIGNED TINYINT NOT NULL;
CREATE UNIQUE INDEX uidx_url ON video (titleurl, titleurl_id);
制作视频时,您需要添加该值:
$amount = query("SELECT COUNT(*) FROM video WHERE titleurl='test'");
query("INSERT INTO video(titleurl, titleurl_id) VALUES ('test', $amount + 1)");
您需要注意插入查询的结果,如果您这样做,可能会遇到竞争条件(这就是为什么ID在网址中更方便)。创建URL:
$urlpart = query("
SELECT IF(
titleurl_id = 0,
titleurl,
CONCAT_WS('-', titleurl, titleurl_id)
) AS url FROM video");
答案 1 :(得分:0)
我的第一个想法是选择以测试... WHERE url LIKE 'test%'
开头的所有网址,然后检查test
是否存在 - 如果是,请添加-1
并再次检查test-1
是否存在。如果是,请将计数器增加到-2
..
答案 2 :(得分:0)
尝试创建两个字段 - 一个用于原始网址,另一个用于“计算”网址。
$c = SELECT COUNT(*) FROM table WHERE original_url = 'test'
UPDATE table SET url='test-$c' WHERE id=...