代码之家  ›  专栏  ›  技术社区  ›  Tim

SQL“like”导致内容重复

  •  0
  • Tim  · 技术社区  · 16 年前

    我使用mysql和like查询来查找页面。我需要能够这样做,但这意味着这些页面将是相同的:

    www.mysite.com/blog/hello-world

    www.mysite.com/blog/hello-worl

    它们都起作用,并显示同一页。如何(可能使用.htaccess?)我能解决这个问题吗?:

    多谢

    编辑:

    PHP-

    if(isset($_GET['title'])) {
                    $blogtitle=mysql_real_escape_string($_GET['title']);
                    $title_two = strtolower(str_replace("-", " ", $blogtitle));
                    $title_two = strtolower(str_replace("?", "", $title_two));
                    $title_two = mysql_real_escape_string($title_two);
    
                    $postmatch = "select * from blog where title LIKE '%".$title_two."%' LIMIT 1;";
                    $postquery = mysql_query($postmatch) or die ("Could not match data because ".mysql_error());
                    $blogtitle=mysql_result($postquery,0,"title");
    
                    $title="$blogtitle";
    
    3 回复  |  直到 16 年前
        1
  •  0
  •   Hadi    16 年前

    你的网址是:www.mysite.com/blog/hello-world 你好世界 是搜索字符串

    我建议你把它们像

    $keyWrd = array();
    $keyWrd = strtolower($_GET['keywd']); // MUST DO VALIDATION
    $keyWrd = explode(" ",$keyWrd);
    $TotalKeyVal = count($keyWrd);
    
    if(!empty($keyWrd[0]))
        {
            $SrcQryStr = "SELECT id,title,body FROM tbl_name WHERE";
            for($i=0;$i<$TotalKeyVal;$i++)
                {
                    $SrcQryStr .= " title LIKE '%";
                    $SrcQryStr .= $keyWrd[$i];
                    $SrcQryStr .= "%'";
    
                    $SrcQryStr .= ' OR ';
    
                    $SrcQryStr .= " body LIKE '%";
                    $SrcQryStr .= $keyWrd[$i];
                    $SrcQryStr .= "%'";
    
                    if(($TotalKeyVal-1)!=$i) $SrcQryStr .= ' OR ';
                }
            $SrcQryStr .= " ORDER by created_date DESC";
    

    现在你有了 $SRCQRYSTR 可以在其上设置更多条件的查询字符串 if(!empty($keyWrd[0]) && MORE HERE) 在这里,您可以使用内爆或多内爆,而不是for循环。

    为什么是%.$keywd.%

    例子:

    字符串:欢迎使用堆栈溢出!

    搜索关键字:ack

    它将 显示 找到匹配项,因为在堆栈上找到ACK 而%.$keywd.%

    它将 不显示 找到匹配项,因为没有以ack开头的单词 而$KEWD. %

    它将 不显示 找到匹配项,因为没有确切的单词ack 当钥匙

        2
  •  1
  •   Matt Mitchell    16 年前

    你能提供一个你需要这样做的理由吗?

    您是否需要“Hello World”和“Hello-World123”匹配,但不需要“Hello World”?

    否则,我想不出任何理由你会想用一个like,但不想让“你好世界”匹配。

        3
  •  1
  •   Matt Huggins    16 年前

    为什么不更换:

    $postmatch = "select * from blog where title LIKE '%".$title_two."%' LIMIT 1;";
    

    ……用这个?

    $postmatch = "select * from blog where title LIKE '$title_two' LIMIT 1;";
    

    这样,无论大小写如何,您仍然可以进行搜索,但无论周围的字符如何,都无法进行匹配。