MYSQL:友好的URL sql查询

Pra*_*ant 1 php mysql url seo

我想创建一个查询,我可以检查我为我的数据库中没有出现的新视频条目的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已经存在.

请给出一些我可以解决这个问题的方法.

sou*_*rge 5

友好的网址很好,但您应该始终添加对象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)

  • @Prashant:问你的老年人他们的陈述是什么严肃的证据. (4认同)