php链式数据库查询过程
使用了魔术变量 __callStatic特性 当对找不到对应方法时便会执行方法,在__callStatic()方法内在使用call_user_func_array()回调 调用找对应的方法来执行。
小案例插曲 :平时写PDO后会使用var_dump()快速测试是否链接成功,若返回 object(PDO)#1 (0) 会认为已经链接成功!但并非如此 就算返回这个也不代表成功。。。当时就是默写少了一个关键词 但测试链接成功 所以分段 分块调试很重要得冷静思考为啥查询语句正确不返回数据应该就是 链接问题。
self::$pdo=new \PDO('mysql:127.0.0.1;dbname=php','root','root'); //错误语句 少关键词
下来看下数据库链式查询小案例图
Query.php
实例
实例
<?php namespace _chaxun; class Query2 { //链接对象 public $pdo=null; //数据表 public $table; //返回字段 public $field='*'; //查询条件 public $where; //数据排序 public $order; //显示数量 public $limit; //构造方法,链接数据库 public function __construct($pdo) { $this->pdo=$pdo; } //设置表名 public function table($tableName) { $this->table=$tableName; return $this;//关键性动作 返回一个当前类的实例(返回自己) } //返回字段 public function field($fields='*') { $this->field=empty($fields) ? '*':$fields; return $this; } //数据排序 public function order($order='') { $this->order=empty($prder) ? ' ORDER BY '.$order:''; return $this; } //查询条件 public function where($where='') { $this->where=empty($where) ? $where : ' WHERE '.$where; return $this; } //显示数量 public function limit($limit) { //支持偏移量与查询条数[5,6] 也可以单独限制条数 is_array($limit)? $limit="{$limit[0]},{$limit[1]}" :$limit; $this->limit = empty($limit) ? $limit : ' LIMIT ' . $limit; return $this; } //拼装SQL语句 public function select() { //拼接 $sql='SELECT ' .$this->field //返回字段 .' FROM ' .$this->table //数据表 .$this->where //查询条件 .$this->order //排序 .$this->limit; //查询字段 //预处理查询 $stmt = $this->pdo->prepare($sql); $stmt->execute(); // die($stmt->debugDumpParams()); //错误调试 查看sql语句 return $stmt->fetchAll(\PDO::FETCH_ASSOC); } }
运行实例 »
点击 "运行实例" 按钮查看在线实例
index.php
实例
<?php namespace _0801; require 'Query.php'; use _chaxun\Query2; class Db { //数据库的链接对象 protected static $pdo=null; //链接方法 public static function connection() { self::$pdo=new \PDO('mysql:host=127.0.0.1;dbname=php','root','root'); } public static function __callStatic($name,$arguments) { //链接数据库 self::connection(); //实例化一个查询类, $query=new Query2(self::$pdo); //执行查询类中的方法 return call_user_func_array([$query,$name],$arguments); } } $datas=Db::table('staff')//查询staff表 ->field('age,name,mobile')//返回 age,name ,mobile字段的数据 ->order('age desc')//以年龄降序排序 ->limit([3,50])//查询50条数据 从第4条开始 ->where('age>35 AND mobile LIKE "%13%"')//年龄大于35岁 并且手机号包含13数字 ->select(); //var_dump($datas); foreach ($datas as $data){ print_r($data); echo '<br>'; }
运行实例 »
点击 "运行实例" 按钮查看在线实例