URL从id重写为title

时间:2017-01-04 04:47:48

标签: php mysql url url-rewriting

我有一个包含以下网址的网页:website.com/foo/bar

其中foo是页面的php文件,bar是用于从数据库中提取数据的相应ID。

我没有使用任何类型的框架技巧。只是一个htaccess删除.php和扩展名,并处理页面foo.php,其ID不在子文件夹中。

无论如何,bar只是一个数字(就像我说的对应数据库行id)。对于用户历史中的搜索引擎优化和一般可读性,我想采用更流行的website.com/foo/this-is-the-name格式(这种格式叫做什么?)。

目前我的代码是:

require('neou_cms/framework/framework.php');

$id = filter(basename(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)));

// no id
if (empty($id)) {
    header('Location: ../portfolio');
}

$projects = Nemesis::select("*", "projects", "published = '1' AND id = {$id}");
$row_projects = $projects->fetch_assoc();
$totalRows_projects = $projects->num_rows;

// no results, bad id
if ($totalRows_projects <= 0) {
    header('Location: ../portfolio');   
}

如果图I我将执行以下操作(1),使链接到foo的页面转到页面标题,例如/ this-is-name(2)在foo中我使它$id从名称中删除破折号,并使用select语句和标题在数据库中搜索该行。

然而,我觉得这很慢......有没有更好的方法可以让我不需要改变电流?

1 个答案:

答案 0 :(得分:2)

你的方法很好。您网址的this-is-the-name部分(website.com/foo/this-is-the-name)通常称为&#34; slug&#34;。如果您要查询slug上的数据库表,只需确保slug列有索引,查询应该运行得相当好。

我还想指出您发布的代码中存在SQL注入漏洞。考虑将$id绑定为参数化查询中的参数,而不是将其动态地包含在where子句中。