/**
*   功能:高级搜索代码
*   编写时间:2003.5.11
*   编写人:偶然
*   变量:  $keyword    关键字
*           $con        关系,and或or
*           $method     模糊或精确
*           $field      要查找的字段
*   返回值:$tmp        sql主体
*/
function super_search($keyword,$con,$method,$field)
{
    $keyword  = eregi_replace("[ \t\r\n\,]+","|",$keyword);
    $keyword  = explode("|",$keyword);
    $num_word = count($keyword);//统计关键字个数
    if($con=="")
    {
        $con = "OR";
    }
    if($method=="like")//模糊查找
    {
        if($num_word=="1")
        {
            $tmp = $field. " LIKE \"%".$keyword[0]."%\" ";
        }
        elseif($num_word>1)
        {
            $tmp = "( ";
            for($i = 0;$i<$num_word;$i++)
            {
                $first = 0;
                if($first==0)
                {
                    $tmp.= $field." LIKE \"%".$keyword[$i]."%\" ";
                    $first = 1;
                }
                if($first!= 0)
                {
                    $i++;
                    $tmp.= $con." ".$field." LIKE \"%".$keyword[$i]."%\" ";
                }
                if(trim($tmp)!= "(")
                {
                    $tmp.= " )";
                }
            }
        }
    }
    elseif($method=="exact")//精确查找
    {
        if($num_word>"0")
        {
            $tmp   = " instr(".$field.",'".$keyword[0]."')!=0";
            $first = "1";
        }
        if($first=="1")
        {
            for($n = 1;$n<$num_word;$n++)
            {
                $tmp.=" ".$con." instr(".$field.",'".$keyword[$n]."')!=0 ";
            }
        }
    }
    return $tmp;
}

解决方案 »

  1.   

    感谢偶然: 小弟我对这个函数没有理解太好:   *   变量:   $keyword    关键字   [a b abc ???这样的吗?]
       *           $con        关系,and或or  [只能选一个?]
       *           $method     模糊或精确  [ok]
       *           $field      要查找的字段 [ok] 如何使用关键字。它的格式是什么样的? 如果$con只能选择一个的话、那这个函数的意义就不大了。还请您说明一下。谢谢!还有具体的用法。
      

  2.   

    关键字你可以用空白字符或逗号隔开,如果你还想设置更多的分隔标记
    改一下这一句,比如想用+来隔开,可以改成这样
    $keyword  = eregi_replace("[ \t\r\n\,\+]+","|",$keyword);and或是or在任何情况下都只能有一个出来,默认是or,可以增大匹配几率。
    我不明白一个即是0又是1的数是什么,相信你也不知道。//具体用法:
    //比如你可以从表单中得到查询数据:
    $keyword = "abc xyz";//关键字
    $con     = "and";//与
    $method  = "like";//模糊
    $field   = "title";//如果你有title字段的话
    $tmp     = super_search($keyword,$con,$method,$field);//假设你有一个叫news的表,你想从标题里找到匹配的关键字,下面是SQL
    $sql = "select * from news where $tmp";
      

  3.   

    与 ustb(偶然) 商榷
    函数有点问题吧?
    echo super_search("a b c d","","like","var");结果:
    ( var LIKE "%a%" OR var LIKE "%b%"  )var LIKE "%c%" OR var LIKE "%d%"  )
    显然是错的
      

  4.   

    非常感谢老大指出这个错误,我修改了一下,敬请指正。/**
    *   功能:高级搜索代码
    *   编写时间:2003.5.11
    *   编写人:偶然
    *   变量:  $keyword    关键字
    *          $con        关系,and或or
    *          $method     模糊或精确
    *          $field      要查找的字段
    *   返回值:$tmp        sql主体
    */
    function super_search($keyword,$con,$method,$field)
    {
        $keyword  = eregi_replace("[ \t\r\n\,]+","|",$keyword);
        $keyword  = explode("|",$keyword);
        $num_word = count($keyword);//统计关键字个数
        if($con=="")
        {
            $con = "OR";
        }
        if($method=="like")//模糊查找
        {
            if($num_word=="1")
            {
                $tmp = $field. " LIKE \"%".$keyword[0]."%\" ";
            }
            elseif($num_word>1)
            {
                $tmp = "( ";
                for($i = 0;$i<$num_word;$i++)
                {
                    if($i==0)
                    {
                        $tmp.= $field." LIKE \"%".$keyword[$i]."%\" ";
                    }
                    if($i!= 0)
                    {
                        $tmp.= $con." ".$field." LIKE \"%".$keyword[$i]."%\" ";
                    }
                }
                $tmp.=")";
            }
        }
        elseif($method=="exact")//精确查找
        {
            if($num_word>"0")
            {
                $tmp   = " instr(".$field.",'".$keyword[0]."')!=0";
                $first = "1";
            }
            if($first=="1")
            {
                for($n = 1;$n<$num_word;$n++)
                {
                    $tmp.=" ".$con." instr(".$field.",'".$keyword[$n]."')!=0 ";
                }
            }
        }
        return $tmp;
    }echo super_search("a b c d","","like","var");
    output:( var LIKE "%a%" OR var LIKE "%b%" OR var LIKE "%c%" OR var LIKE "%d%" )
      

  5.   

    似可这样简化
    <?php
    /**
    *   功能:高级搜索代码
    *   编写时间:2003.5.11
    *   编写人:偶然
    *   变量:  $keyword    关键字
    *          $con        关系,and或or
    *          $method     模糊或精确
    *          $field      要查找的字段
    *   返回值:$tmp        sql主体
    */
    function super_search($keyword,$con,$method,$field)
    {
        $keyword = split("[ \t\r\n\,]+",$keyword);
        $num_word = count($keyword);//统计关键字个数
        if($con=="")
        {
            $con = "OR";
        }
        if($method=="like")//模糊查找
        {
            $tmp = " $field $method '%".join("%' $con $field $method '%",$keyword)."%'";
        }
        elseif($method=="exact")//精确查找
        {
            $tmp = " instr($field,'".join("')!=0 $con instr($field,'",$keyword)."')!=0";
            //或 $tmp = " $field='".join("' $con $field='",$keyword)."'";
        }
        return $tmp;
    }
    echo super_search("a b c d","","like","var")."<br>";
    echo super_search("a b c d","","exact","var");
    ?>
      

  6.   

    再少占点篇幅:)/**
    *   功能:高级搜索代码
    *   编写时间:2003.5.11
    *   编写人:偶然
    *   变量:  $keyword    关键字
    *          $con        关系,and或or
    *          $method     模糊或精确
    *          $field      要查找的字段
    *   返回值:$tmp        sql主体
    */
    function super_search($keyword,$con,$method,$field)
    {
        $keyword = split("[ \t\r\n\,]+",$keyword);
        $num_word = count($keyword);//统计关键字个数
        $con==""?$con = "OR":NULL;
        $method=="like"?$tmp = " $field $method '%".join("%' $con $field $method '%",$keyword)."%'":($method=="exact"?$tmp = " instr($field,'".join("')!=0 $con instr($field,'",$keyword)."')!=0":NULL);
        return $tmp;
    }
    echo super_search("a b c d","","like","var")."<br>";
    echo super_search("a b c d","","exact","var");
      

  7.   

    多字段搜索,请大家指正。/**
    *   功能:高级搜索代码
    *   编写时间:2003.5.11
    *   编写人:偶然
    *   变量:  $keyword    关键字
    *          $con        关系,and或or
    *          $method     模糊或精确
    *          $field      字段数组
    *   返回值:$tmp        sql主体
    */
    function super_search($keyword,$con,$method,$field)
    {
        global $tmp;
        $keyword = split("[ \t\r\n\,]+",$keyword);
        $num_word = count($keyword);//统计关键字个数
        $num = count($field);
        if($con=="")
        {
            $con = "OR";
        }
        if($method=="like")//模糊查找
        {
            for($i=0; $i<$num; $i++)
            {
                $i<$num-1?$condition = $con:$condition=NULL;
                $tmp.= " {$field[$i]} $method '%".join("%' $con {$field[$i]} $method '%",$keyword)."%' $condition";
            }
        }
        elseif($method=="exact")//精确查找
        {
            for($i=0; $i<$num; $i++)
            {
                $i<$num-1?$condition = $con:$condition=NULL;
                $tmp.= " instr({$field[$i]},'".join("')!=0 $con instr({$field[$i]},'",$keyword)."')!=0 $condition";
            }
        }
        return $tmp;
    }
    $fields = array("title","content","intro");
    echo super_search("a b c d","AND","exact",$fields);
    echo super_search("a b c d","OR","like",$fields);
      

  8.   

    两位老大,其他的还算看懂了,能不能解释一下instr()怎么用的?