博客列表 >8.1 php链式数据库查询过程

8.1 php链式数据库查询过程

大灰狼的博客
大灰狼的博客原创
2019年08月07日 15:13:51896浏览

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'); //错误语句 少关键词


下来看下数据库链式查询小案例图
1.jpg

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>';
}

运行实例 »

点击 "运行实例" 按钮查看在线实例




声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议