博主信息
博文 36
粉丝 4
评论 3
访问量 39032
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
8.1 php链式数据库查询过程
大灰狼的博客
原创
1066人浏览过

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

运行实例 »

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




批改状态:合格

老师批语:limit 后面最多二个值, 没必要用数组
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学