两行代码搞定多级关联搜索

网络整理 - 07-26

<?php
/*
        Name:                 Search.class.php
        Author:         Genghonghao
        Revisions:        2006/12/16
        功能     :   多条件关联查寻类
*/
class Search extends Mysql_Class
{
        /**
         * $dbname:数据库名
         * $searchfiled:查询的字段名例如:SELECT username,userage,usersex FROM
         * $termfiled查询的条件的字段,where后面的字段名。例如:如WHERE USERID<>25 AND usersex=1
         * $termvalue查询条件对应的值和条件符号,例如:=@1@,<>@25@,like '%@com@%'等,最之是条件表达式右侧的东西和$termfiled数组一一对应,
         * 且下标必需为数字,通常情况下符号右边可能是变量,所以变量的前后一定要加上'@'符号
         *
         */
        private $dbname;                  
        private $searchfiled = array();  
        private $termfiled = array();   
        private $termvalue = array();

        /**
         * 设置所有属性的值,参数为两个属性和其值
         */
        public function __construct($dbv,$sv,$fiv,$vv)
        {
                $this->SetPm($dbv,$sv,$fiv,$vv);
        }
        
        /**
         * 设置所有属性的值
         *
         */
        public function SetPm($v1,$v2,$v3,$v4)
        {
                self::__set('dbname',$v1);
                self::__set('searchfiled',$v2);
                self::__set('termfiled',$v3);
                self::__set('termvalue',$v4);
        }
        // * 设置属性的值的函数
        public function __set($pmname,$value)
        {
                if(isset($value))
                {
                        $this->$pmname = $value;
                }
                else
                {
                        return null;
                }
        }
        
        /**
         * 参数$id是WHERE 后边跟的第一个字段名用来进行第一次判断
         * 参数$value是字段$id的默认值
         * 参数$emblem是条件判断的符号,例如>,<,<>等
         * 参数$last是SQL语句最部分,可以为空
         * */
        public function GetSearch($id,$emblem="<>",$emblemvalue=0,$last="ORDER BY subtime DESC")
        {
                $termfiled = $this->termfiled;
                $termvalue = $this->termvalue;
                $filenum = count($this->termvalue);
                if(count($this->termfiled) != count($this->termvalue))
                {
                        return null;
                }
                else
                {
                        $filed = "";
                        foreach($this->searchfiled as $value)
                        {
                                $filed .= $value.",";
                        }
                        $fnum = strlen($filed);
                        $filed = substr($filed,0,($fnum-1));
                        $sql = "SELECT ";
                        $sql .= $filed;
                        $sql .= " FROM ";
                        $sql .= $this->dbname;
                        $sql .= " WHERE {$id}{$emblem}{$emblemvalue} ";
                        for($i=0;$i<$filenum;$i++)
                        {
                                //$termvalue[$i] = str_replace(" ","",$termvalue[$i]);
                                if(!strstr($termvalue[$i],"@@") and !strstr($termvalue[$i],"\"\"") and !strstr($termvalue[$i],"%%"))
                                {
                                        $termvalue[$i] = str_replace("@","",$termvalue[$i]);
                                        $sql.= "AND {$termfiled[$i]}{$termvalue[$i]} ";
                                }
                        }
                        if(!empty($last))
                        {
                                $sql.=$last;
                        }
                        // * Execute为父类中的数据据库操作方法,返回的值是数组!
                        return parent::Execute($sql);
                }
        }
}
?>
实例:
<?php
include_once('include/common.inc.php');
include_once('include/Search.class.php');  // 调用这个文件
$table = "tax_codex";  //查寻的数据库表名
$filedd = array('Title','Text'); //要查寻的字段
$term  = array('Click','City','Title'); // 要查寻的条件字段
$termv = array('>@0@','="@上海@"',' LIKE "%@中国@%"'); // 要查寻的条件
$objsql = new Mysql_Class();  
$objsearch = new Search($table,$filedd,$term,$termv);  // 实例化这个类
$print_arr = $objsearch->GetSearch('CodexId',"<>","0","ORDER BY SubTime DESC"); // 调用类中方法行到结果数组
print_r($print_arr); // 打印出数组中的值.
?>