在mysql或php中取消清理url

时间:2014-01-07 16:00:33

标签: php mysql

我使用一种方法来清理用户提交的字符串(问题)到网址。 除了字母数字之外,它会删除所有内容,并用短划线替换空格。

现在我需要在我的mysql数据库中找到正确的行,当调用该URL时。

  

例如:url:website.bla / what-is-this

应该在我的表格中找到一行,例如这个值

  

“这是什么??????”

我想在网址中使用这样的ID:

  

website.bla / 32423 /什么-是-这

     

website.bla /什么-是-this_32423

但是这是客户的要求,因为seo不应该有额外的数字。

所以逆转消毒方法实际上是不可能的。 我能做的是遍历我的数据库中的每个条目并使用sanitize方法,看看它是否与url匹配,但我认为当db变大时,这将是愚蠢的。

while ($row = mysql_fetch_array("SELECT * FROM questions"))
{
   if ($url == sanitize($row["question_text"])) return $row;
}

或者我可以用很多链接的mysql replace()在mysql中“重建”那个sanitize方法, 但我认为这很容易出错。

"SELECT * FROM questions WHERE Replace(Replace(Replace(REPLACE(question_text,'%',''),'&','')...

所以我目前的想法是只使用已清理的字符串作为我的数据库中的主键。

这是一种好方法,还是有其他更好或更标准化的方法?

4 个答案:

答案 0 :(得分:1)

这实际上是数据库中使用的密钥。如果你有识别特定条目的数据,那么无论如何都不是坏事。

但事实上,您的方法可能会出现多个同名的问题,这是您方法的不良部分。您可以通过使用唯一ID(例如,主数据库密钥作为自动递增整数)来防止这种情况。这也是大多数网站的最新技术(例如StackOverflow http:// stackoverflow.com/questions/20976228/un-sanitize-url-in-mysql-or-php可行,http:// stackoverflow.com/questions/20976228也是如此,因为20976228是此问题的唯一ID,而stackoverflow仅使用ID来识别问题。仅为了可读性或搜索引擎优化目的而添加了URL的其余部分。

答案 1 :(得分:1)

有一个很好的论据,为什么这是一个坏主意,为什么使用数字作为唯一标识符是最好的方法。

  • SEO论证纯粹是迷信。 Stack Overflow使用数字作为URL中的唯一标识符(请参阅上面的URL),他们的SEO性能具有传奇色彩。 Stack Overflow问题在全球数百万条查询中排名前10位。

  • 通过使它们成为唯一键,您可以大量限制可能的名称范围。例如,一旦获得密钥Zurich,我将无法创建名为...

    的记录
    • Zürich
    • (Zürich)
    • Zürich (苏黎世)
    • Zürich!!!!!!!!!!!!!!!!!!!!
    • Zürich!!!!!!
    • Zürich????????????

    ...绝对没有充分的理由! (他们并不是一个很好的例子,但你明白我的观点。)

  • 通过将名称用作唯一键,任何重命名操作都将创建无效的URL。更正名称中的拼写错误 - blam!来自搜索引擎的来访者获得了404.这太可怕了。

数字方法确实是最安全的方法。查看数字以识别记录;为了避免搜索引擎中出现重复内容,当标题与您在文件中的名称不匹配时,请将标题重定向到正确的清理名称。 (您会注意到,您可以在此页面的网址名称中输入任何非法内容,但它会重定向到正确的版本。)

答案 2 :(得分:0)

您已经说过:将字符串的已清理版本存储在数据库中并将其用作密钥(不一定是主键,而是可以搜索的密钥)。这也有助于确保每个slu is实际上是唯一的。其他任何东西都不是首发。

答案 3 :(得分:0)

存放已清理的密钥。

如果您有任何需要转换的遗留内容,请查看mysql函数。我个人使用自定义字母数字转换函数进行大量匹配(添加一个lcase然后设置)

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