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
实例
实例
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
实例
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 '
';
}
运行实例 »
点击 "运行实例" 按钮查看在线实例