+ -
当前位置:首页 → 问答吧 → 两行代码搞定多级关联搜索.小试牛刀

两行代码搞定多级关联搜索.小试牛刀

时间:2006-12-28

来源:互联网

复制内容到剪贴板
代码:
<?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); // 打印出数组中的值.
?>
个人觉得挺简单的,不知你觉得怎么样?
如有不当之处,请指教.
多谢.

[ 本帖最后由 帅的不能再输啦 于 2006-12-27 17:31 编辑 ]

作者: 帅的不能再输啦   发布时间: 2006-12-27

呵呵,高手

作者: leehui1983   发布时间: 2006-12-27

请问如何联表查询,也就是复杂的SQL语句如何处理?

作者: thankwsx   发布时间: 2006-12-28

表list1中含有字段number,id,表list2中含有字段name,id
则可以
SELECT list1.number,list2.name FROM `list1`,`list2` WHERE list1.id==list2.id

作者: muqiao   发布时间: 2006-12-28

自己给自己加高亮:L

作者: muqiao   发布时间: 2006-12-28

我的意思是他这个应用如何多表查询。。。

作者: thankwsx   发布时间: 2006-12-28

引用:
原帖由 muqiao 于 2006-12-28 11:26 发表
表list1中含有字段number,id,表list2中含有字段name,id
则可以
SELECT list1.number,list2.name FROM `list1`,`list2` WHERE list1.id==list2.id
$table = "list1,list2";  //查寻的数据库表名
$filedd = array('list1.number','list2.name'); //要查寻的字段
$term  = array(''); // 要查寻的条件字段
$termv = array(''); // 要查寻的条件
$objsql = new Mysql_Class();  
$objsearch = new Search($table,$filedd,$term,$termv);  // 实例化这个类
$print_arr = $objsearch->GetSearch('list1.id',"==","list2.id")// 调用类中方法行到结果数组
print_r($print_arr); // 打印出数组中的值.
?>

作者: 帅的不能再输啦   发布时间: 2006-12-28

SELECT l1.number, FROM `list1` as l1 LEFT JOIN SELECT l2.name from `list2` as l2 ON l1.id=l2.id ORDER BY l1.id DESC
这个如何?

作者: thankwsx   发布时间: 2006-12-28

再说你这个应用起来也不止两行啊。就是看你这个两行有点不爽。

作者: thankwsx   发布时间: 2006-12-28

没有设计到左查寻

下面是不是两行...
$objsearch = new Search($table,$filedd,$term,$termv);  // 实例化这个类
$print_arr = $objsearch->GetSearch('list1.id',"==","list2.id")// 调用类中方法行到结果数组

作者: 帅的不能再输啦   发布时间: 2006-12-28

呵呵~~那你那些变量哪里来,输出也没有了。。。您这个两行就是个噱头。。
也可以改成一行好了,把所有\n都去掉。不就成一行了。。
没记错,你是bus的?

作者: thankwsx   发布时间: 2006-12-28

作者: fengyun   发布时间: 2006-12-29

啊哦 学习学习 呵呵

作者: ZiNYon!   发布时间: 2006-12-30

何止两行

作者: stanley.wy   发布时间: 2007-01-05

感觉有点多此一举哦。

作者: Poon   发布时间: 2007-01-13

看问题要看深入一点 不要较真与 2行这些 无畏的字眼

作者: k1ng   发布时间: 2007-01-31

昵称: lmhllr  时间: 2007-1-31 15:22
看看

作者: lmhllr   发布时间: 2007-01-31

不看标题看代码~:lol

作者: Internet   发布时间: 2007-02-04

好像真的只有2行~

作者: airwin   发布时间: 2007-02-05

呼悠咯。
等过些日子,把偶写的放出来。
$field =  array(
   "{$this->moduleTable}.id as id",
   "{$this->moduleTable}.mid as mid",
   "{$this->moduleTable}.pid as pid",
   "{$this->moduleTable}.name as name"
  );
  $option = array('where'=>" type='system' AND disable='n' AND {$this->moduleTable}.id={$this->table}.mid ");
  $option['where'] .= " AND {$this->table}.gid={$gid}";
  $this->table = $this->table.','.$this->moduleTable;
  return parent::find($field, $option);

[ 本帖最后由 angeljyt 于 2008-4-30 14:02 编辑 ]

作者: xiaocao001   发布时间: 2007-02-06

厉害

作者: angeljyt   发布时间: 2008-04-30

嘿嘿,没必要较劲,不过楼主写的东西很不错。支持下

作者: dzjzmj   发布时间: 2008-04-30

缺东西的。。。。。。。。
郁闷 给就给个齐全  好马上测试的喽

作者: MagicYang   发布时间: 2008-06-23

难道为了这样的代码  我要测试  自己还需要写个 Mysql_Class 吗

作者: saku87   发布时间: 2008-07-15