MYSQL:友好的URL sql查询

时间:2009-12-06 14:19:04

标签: php mysql url seo

我想创建一个查询,我可以检查我为新视频条目制作的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已经存在。

请提供一些解决此问题的方法。

3 个答案:

答案 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=...