2012-02-08 46 views
8

我有一个新的网站(我正在建设一个现在),我想确保我做得正确,并没有重新设计后1个月。apache .htaccess规则与动态网页(php)性能

,所以我有这样的网页:

/candy 
/candy/chocolate 
/drink 
/drink/beer 

所以我期待的计算器,我怎么能做到这一点,我发现:

RewriteRule ^([a-z]+)/([a-z]+)/?$ index.php?category=$1&page=$2 [NC,L] 

现在,这将工作,但我的问题是关于执行。显然$ _GET [类别]将是名称,页面将是巧克力。

现在,当我做我的查询我会做:

$sql = "SELECT myfields FROM mytable WHERE name = '" . $_GET['category'] . "'"; 

现在,它会更好,如果我使用的主键是一个INT。如果是这样,我可以在我的.htaccess中做什么?

+2

如果名称是唯一的,那么它并不重要。如果名字不是独一无二的,那么你就深陷其中。 – 2012-02-08 01:29:19

+2

@bianca:你会介意使用类似于stackoverflow的URL:/ id/category/page吗?如:/ 123 /糖果/巧克力/糖果和巧克力的关键是独一无二的,123是这种情况下的最后一页巧克力ID? – 2012-02-08 01:32:48

+0

我最好不要,因为如果它是唯一的选择,那么我想是这样。 – Bianca 2012-02-08 01:39:20

回答

7

不幸的是使用的名字也保护免受SQL注入脚本并将其转换为一个唯一的ID可能需要更长的时间比创建的名称本身的指数来执行。

这里的基础上,网址,你有什么,我建议:

添加一个索引页面的名称

ALTER TABLE `mytable` ADD key indexname (columnname); 

例如:现在

ALTER TABLE `page` ADD key pagename (name); 

,因为结构是不同的/candy vs /candy/chocolate,我假设你有某种结构像一个主页与列表(/糖果)和特定列表(/ candychocolate),所以在这种情况下,你可以使用这个:

RewriteRule ^([a-z]+)/?$ index.php?category=$1&page=list [NC,L] 
RewriteRule ^([a-z]+)/([a-z]+)/?$ index.php?category=$1&page=$2 [NC,L] 

然后,你可以简单地查询类别和使用索引字段的页面。这将会加快(当然不会像INT一样快,但仍然很快)。

对于第一个查询,你可以这样做:

$name = addslahes($name); 
SELECT fields FROM category WHERE category = '$name'; 

,当你得到一个页面,您可以使用:

$categoryname = addslahes($categoryname); 
$pagename = addslahes($pagename); 
SELECT fields FROM page LEFT JOIN category ON (page.categoryid = category.id) WHERE page = '$pagename' AND category = '$categoryname'; 

这样,通过同时使用类别和网页,你会避免页面未找到(404)。

0

URL中使用的标识符应该是唯一的并且具有数据库索引。如果ID和类别名称都是唯一的并且编入索引,那么它在性能方面是相同的,但是我建议使用该名称,因为它比内部ID更具搜索引擎友好性和描述性,当URL是URL时变得尤为重要在没有多少附加背景的情况下显示(例如,在报纸上印刷example.org/1example.org/shoes)。如果没有,则使用ID并更改重写规则:(顺便说一句,\d+应该也可用于page如果是数字)

RewriteRule ^(\d+)/([a-z]+)/?$ index.php?category=$1&page=$2 [NC,L] 

3

只要确保你的数据库具有的一个index名称行。这将使查找与使用整数主键一样快。

使用类似CREATE INDEX name ON mytable我认为,但通过phpmyadmin做到这一点要容易得多。

使用和addslashes

$sql = "SELECT myfields FROM mytable WHERE name = '" . addslashes($_GET['category']) . "'"; 
+0

“SELECT ... FROM ... WHERE name ='”。 $ _GET ['category']。 “'”部分比原来的问题本身更值得一提! _Please_,保护您的代码免受SQL注入攻击,_do_ _not_只是在SQL查询中填充用户输入。您可以通过首先从数据库中选择所有类别名称,然后通过类似'array_key_exists'的方式检查'$ _GET ['category']'是否已知类别名称来添加更多保护。 – hijarian 2012-02-10 17:20:41

+0

@hijarian看不到比addslashes更安全。无论采用哪种方式都无法注入代码,并且addslashes要短得多。有些人会建议使用mysql_real_escape_string,但只有在使用ISO-8859-1或UTF-8以外的其他字符集时才有意义。 – Gerben 2012-02-10 20:00:38