正确的方法来确保重写的URL始终能找到您期望的结果?

问题描述

| 我正在尝试使用ѭ0来向用户搜索引擎提供外观更好的URL,这在许多动态网站上都是相当普遍的做法。 因此,例如,我开始于:
http://www.mydomain.com/profile/view.PHP?id=136
出于参数
Bob T. Smith the 3rd
,假设调用用户编号136(如果存在,则道歉鲍勃)。 据我了解,我的\'nasty \'URL中必须有Bob \名称的变体,因为您只能重写存在的内容-因此,我需要更改代码,以便此URL找到我们正在寻找的个人资料:
http://www.mydomain.com/profile/view.PHP?id=bob-t-smith-the-3rd
现在可以成为
http://www.mydomain.com/profile/bob-t-smith-the-3rd
我正在使用自定义函数将下划线和空格转换为破折号,去除所有非字母数字字符,然后将所有内容都小写以使URL看起来非常漂亮。 因此,在我的页面中,而不是查找非常唯一的主键\'136 \',我现在必须查找用户名-但是是经过清理的版本,所以我正在使用类似这样的东西-因为MysqL不能做正则表达式:
SELECT LOWER(REPLACE(REPLACE(REPLACE(\'Bob T. Smith the 3rd\',\" \",\"-\"),\"_\",\".\",\"\"));
名称显然将替换为URL中包含的所有内容,并进行清理。 我期望的问题是,不想将MysqL REPLACE()函数链接在一起以处理所有可能的非法字符(这会造成混乱,难以维护,并且可能效率低下),并且无法在查询端,如何确保每次找到用户个人资料并得到返回? 如果Bob签名为\'
Bob T. Smith! (The 3rd)
\'-由于would8ѭ去除感叹号和括号,我仍然会在PHP中将其清理为
bob-t-smith-the-3rd
,但是我的查询-除非我添加更多的REPLACE()函数,否则\'找不到那个用户。 我是否应该确保用户只能使用A-Z,0-9,破折号和下划线进行注册? 我是否应该以某种方式继续传递唯一的数字ID,而只是以某种方式从重写规则中忽略它? 我是否完全忘记了要点?有没有我想到过的公认方法? 谢谢 :-)     

解决方法

        如果我丢失了某些内容,请纠正我,但是为什么不调用php脚本时将用户名从重写规则中添加的破折号中删除呢?
$undashed_username = explode(\"-\",$dashed_username);
$username = implode(\" \",$undashed_username);
然后您可以在数据库中进行搜索。     ,        您为什么不发出此请求?
http://www.mydomain.com/profile/bob-t-smith-the-3rd?id=136
因此,您拥有一个不错的URL,并且不需要处理实际搜索用户名的情况。 如果您担心网址中包含“ 11”,也可以执行以下操作:
http://www.mydomain.com/profile/136/bob-t-smith-the-3rd
然后解析请求字符串中的数字信息。 这也将减少数据库的工作。