在mysql或php中取消清理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 但这是客户的要求,不应该有额外的数字,因为搜索引擎

我使用一种方法来清理用户提交到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匹配,但我认为当数据库变大时,这样做会很愚蠢

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