在mysql或php中取消清理url
我使用一种方法来清理用户提交到url的字符串(问题)。 它去除除字母数字以外的所有内容,并用破折号替换空白 现在我需要在mysql数据库中找到正确的行,当调用该url时 e、 g:url:website.bla/what-is-this 应在我的表格中找到一行,例如该值 “这是什么?” 我希望在url中使用类似这样的id: website.bla/32423/what-is-this website.bla/what-is-this_32423 但这是客户的要求,不应该有额外的数字,因为搜索引擎优化 因此,逆转消毒方法是不可能的。 我可以做的是循环遍历数据库中的每个条目,并使用sanitize方法,查看是否与url匹配,但我认为当数据库变大时,这样做会很愚蠢在mysql或php中取消清理url,php,mysql,Php,Mysql,我使用一种方法来清理用户提交到url的字符串(问题)。 它去除除字母数字以外的所有内容,并用破折号替换空白 现在我需要在mysql数据库中找到正确的行,当调用该url时 e、 g:url:website.bla/what-is-this 应在我的表格中找到一行,例如该值 “这是什么?” 我希望在url中使用类似这样的id: website.bla/32423/what-is-this website.bla/what-is-this_32423 但这是客户的要求,不应该有额外的数字,因为搜索引擎
while ($row = mysql_fetch_array("SELECT * FROM questions"))
{
if ($url == sanitize($row["question_text"])) return $row;
}
或者我可以用大量链接的mysql replace()在mysql中“重建”该清理方法,
但我认为这很容易出错
"SELECT * FROM questions WHERE Replace(Replace(Replace(REPLACE(question_text,'%',''),'&','')...
因此,我目前的想法是只使用经过消毒的字符串作为数据库中的主键
这是一个好方法还是有其他更好或更标准化的方法?您已经说过了:将经过消毒的字符串版本存储在数据库中,并将其用作键(不一定是主键,而是可以搜索的键)。这也有助于确保每个slug实际上是唯一的。其他任何东西都不能启动。存储经过消毒的钥匙 如果您有任何遗留的东西需要转换,也可以查看mysql函数。我个人使用自定义字母数字转换函数进行大量匹配(添加lcase,您就可以设置)
这实际上就是在数据库中使用键的目的。如果您有标识特定条目的数据,那么无论如何,这并不是一种坏做法
但事实上,你的方法可能会出现多个同名问题,这是你方法中不好的部分。您可以通过使用唯一id(例如,主数据库键为自动递增整数)来防止这种情况。这也是大多数网站的最新技术(例如,mysql或php中的StackOverflow
http://StackOverflow.com/questions/20976228/un-sanitize url
和http://StackOverflow.com/questions/20976228
,因为20976228是这个问题的唯一id,StackOverflow只使用id来识别问题。url的其余部分仅为可读性而添加。)或者SEO目的。有很好的理由说明为什么这是个坏主意,为什么使用数字作为唯一标识符是最好的方法
- SEO争论纯粹是迷信。堆栈溢出在URL中使用数字作为唯一标识符(参见上面的URL),它们的SEO性能是传奇性的。堆栈溢出问题在全球数百万个查询中排名前十
- 通过将它们设置为唯一的密钥,可以极大地限制可能名称的范围。例如,一旦获取了密钥
,我将无法创建具有该名称的记录Zurich
Zürich
(Zürich)
Zürich(苏黎世)代码>
Zürich!!!!!!!!!!!!!!!!!!!!!!!!!!!
Zürich!!!!!
Zürich?????
- 通过使用名称作为唯一键,任何重命名操作都将创建无效的URL。更正名称中的键入错误-错误!来自搜索引擎的访客将获得404。这太糟糕了
数字方法确实是最明智的选择。查看数字以识别记录;为了避免搜索引擎中的内容重复,当标题与文件中的名称不匹配时,请将标题重定向到正确的净化名称。(您会注意到,您可以在此页面的URL名称部分中输入任何nonsene,但它将重定向到正确的版本。)我会创建一个索引,不像MySQL索引,而是像搜索引擎索引一样,为每个单词及其外观创建索引。我不认为有任何客观证据表明URL包含ID会损害SEO。相反,我认为这是一个错误的概念,源于一个断言,即使用参数较多的URL不会赋予资源任何语义价值ce,因此可能被认为是有害的SEO努力。随着时间的推移,人们只是开始混淆东西;无意义的参数是坏的,id是一个参数,因此id是坏的。在这种情况下,id单独使用,你看到的是显示URL,这正是我所说的!?是的:)只需指出url的最后一部分仅与可读性相关,并且是针对seo/人类的,用户可以将任何内容放入(检查ID后面url中的字符串),我猜使用关键方法,我刚刚记住了“规则”,你不应该在一列中存储可以从另一列中创建的值…比如:不要在一列中存储净工资,在另一列中存储总工资,因为你可以很容易地从另一列中创建一个。但是我想,对于只能单向创建的值,在这种情况下可以忽略规则。+1这些设计考虑是为什么我会回过头来说ID需要保留。客户所说的他们想要的和他们实际需要的有时是非常不同的事情,我们工作的一部分是将两者对齐…我已经和他讨论过类似的名称问题,甚至向他展示stackoverflow使用这种方法,但是…他仍然想要没有编号的方法卢比;)
CREATE DEFINER=`username`@`%` FUNCTION `alphanumeric`(`str` VARCHAR(255) )
RETURNS varchar(255) CHARSET utf8
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE i, len SMALLINT DEFAULT 1;
DECLARE ret VARCHAR(255) DEFAULT '';
DECLARE c VARCHAR(1);
SET len = CHAR_LENGTH( str );
REPEAT
BEGIN
SET c = MID( str, i, 1 );
IF c REGEXP '[[:alpha:]]' or c REGEXP '[[:digit:]]' THEN
SET ret=CONCAT(ret,c);
END IF;
SET i = i + 1;
END;
UNTIL i > len END REPEAT;
RETURN ret;
END