批改状态:合格
老师批语:
对于框架的链式查询的模拟如下. 首先是需要一个数据操作的入口类:在内部通过调用call_user_func_array方法来实现对数据操作类的链式调用.
* 用方法重载实现方法跨类调用
*/
//数据库操作的入口类
/**
*
*/
require 'Query.php';
class DB
{
public static function __callStatic($name,$arguments)
{
return call_user_func_array([(new Query()),$name],$arguments);
}
}
$result = DB::table('user')
->field('id,username,sex,phone')
->where('id > 7')
->select();以上的table,field,where,select就是相应的链式的组成sql的查询的方法.
具体方法如下:
<?php
/**
* 数据库查询类
*/
class Query
{
//保存sql语句中的各个组成部分
//selsect 字段列表 from 表名 where 条件
private $sql = [];
//数据库连接对象
private $pdo = null;
//构造方法,连接数据库
public function __construct()
{
//连接数据库并返回pdo对象
$this->pdo = new PDO('mysql:host=127.0.0.1;dbname=pdotest','root','root');
}
//table() 获取sql语句的表名
public function table($table)
{
$this->sql['table'] = $table;
return $this;
}
//获取sql语句的字段列表
public function field($field)
{
$this->sql['field'] = $field;
return $this;
}
//获取sql语句的条件
public function where($where)
{
$this->sql['where'] = $where;
return $this;
}
//查询,终极方法
public function select()
{
//拼接sql查询语句
$sql = "SELECT {$this->sql['field']} FROM {$this->sql['table']} WHERE {$this->sql['where']}";
$stmt = $this->pdo->prepare($sql);
$stmt->execute();
print_r($sql);
return $stmt->fetchALL(PDO::FETCH_ASSOC);
}
}通过一层一层的链式往下级的调用来组成整个sql的查询过程.而且方法的调用是不分顺序的,只要保证终极方法在最后即可.得到结果集后直接输出即可.可以说是一次编写,多次复用了,虽然第一次写看起来是有点麻烦,但是相对于每次查询都写一次的过程式程序来说,这个已经实现绝大多数的数据查询的代码复用.
具体的执行的结果如下:

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号