Blogger Information
Blog 36
fans 4
comment 3
visits 31872
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
8.1 php链式数据库查询过程
大灰狼的博客
Original
897 people have browsed it

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

运行实例 »

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




Correction status:qualified

Teacher's comments:limit 后面最多二个值, 没必要用数组
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post