文档章节

php pdo类 防注入,事务,多库自动选择,链式操作

曲文
 曲文
发布于 07/12 18:17
字数 820
阅读 12
收藏 0
PHP

因为某些原因目前业务不用框架开发,自己写了一个pdo类实现防注入,事务等,后续还会继续完善 

<?php
/**
 * Created by PhpStorm.
 * User: ywx
 * Date: 2019/7/10
 * Time: 14:57
 */

class Db
{
    private $conn;
    private $sql = [
        'where'   => null,
        'wheresql'   => null,
        'orderBy' => null,
        'limit'   => null,
        'up'   => null,
        'ins'   => null,
    ];
    private $type;


    public function __construct( $data = [])
    {
        if($data){
            $this->_setDbDrive($data);
        }
    }

    private function _setDbDrive($dbConf){
        $dns = 'mysql:host='.$dbConf['DB_IP'].';dbname='.$dbConf['DB_NAME'].';charset=utf8mb4';

        try {
            $db = new PDO($dns,$dbConf['DB_USER'],$dbConf['DB_PASS']);
        } catch(PDOException $e) {
            die('Could not connect to the database:<br/>' . $e);
        }
        $this->conn[$dbConf['name']] = $db;
    }

    public function table($tablename) {
        //获取表库信息
        $db_info = $this->_getDBIP($tablename);
        $this->sql = [];//重置缓存
        $this->type = $db_info['name'];
        if(!isset($this->conn[$db_info['name']])){
            $this->_setDbDrive($db_info);
        }

        $this->tablename = $tablename;
        return $this;
    }

    public function select($fields = '*') {
        $querySql = sprintf("SELECT %s FROM %s", $fields, $this->tablename);
        if(!empty($this->sql['where'])) {
            $querySql .= ' WHERE ' . $this->sql['wheresql'];
        }
        if(!empty($this->sql['orderBy'])) {
            $querySql .= ' ORDER BY ' . $this->sql['orderBy'];
        }
        if(!empty($this->sql['limit'])) {
            $querySql .= ' LIMIT ' . $this->sql['limit'];
        }

        return $this->_query($querySql);
    }

    public function find($fields = '*') {
        $result = $this->select($fields);
        return isset($result[0]) ? $result[0] : null;
    }

    public function insert($data) {
        foreach ($data as $key => &$value) {
            $value = addslashes($value);
        }
        $keys = "`".implode('`,`', array_keys($data))."`";
        $values = ":i".implode(", :i", array_keys($data));
        $this->sql['ins'] = $data;

        $querySql = sprintf("INSERT INTO %s ( %s ) VALUES ( %s )", $this->tablename, $keys, $values);
        return $this->_query($querySql);
    }

    public function delete() {
        $querySql = sprintf("DELETE FROM %s WHERE ( %s )", $this->tablename, $this->sql['wheresql']);
        return $this->_query($querySql);
    }

    /**
     * 传入数组 ['apid'=>['+',15],'bpid'=>105] 目前二位数组仅支持 加减
     * @param $data
     * @return mixed
     */
    public function update($data) {
        $updateFields = [];
        foreach ($data as $key => $value) {
            if(!is_array($value)){
                $updateFields[] = "`$key`=:u{$key} ";
            }else{
                $updateFields[] = "`$key`= `{$key}` {$value[0]} {$value[1]}";
                unset($data[$key]);
            }
        }
        $this->sql['up'] = $data;
        $updateFields = implode(',', $updateFields);
        $querySql = sprintf("UPDATE %s SET %s", $this->tablename, $updateFields);

        if(!empty($this->sql['where'])) {
            $querySql .= ' WHERE ' . $this->sql['wheresql'];
        }

        return $this->_query($querySql);
    }

    private function _query($querySql) {
        $querystr = strtolower(trim(substr($querySql,0,6)));
        $stmt = $this->conn[$this->type]->prepare($querySql);
        //绑定参数 where
        if($this->sql['wheresql']){
            foreach($this->sql['where'] as $k=>$v){
                if(!is_array($v)){
                    $val = $v;
                }else{
                    $val = $v[1];
                }
                $stmt->bindValue('w'.$k,addslashes($val));
            }
        }

        //update
        if($this->sql['up']){
            foreach($this->sql['up'] as $k=>$v){
                $stmt->bindValue('u'.$k,trim($v,'\''));
            }
        }

        //install
        if($this->sql['ins']){
            foreach($this->sql['ins'] as $k=>$v){
                $stmt->bindValue('i'.$k,addslashes($v));
            }
        }

        $ret = $stmt->execute();
        $this->sql = [];
        if(!$ret) var_dump($stmt->errorInfo());

        if($querystr == 'select') {
            $retData = $stmt->fetchAll(PDO::FETCH_ASSOC);
            return $retData;
        }elseif($ret && $querystr == 'insert') {
            return $this->conn[$this->type]->lastInsertId();
        }else{
            return $ret;
        }
    }

    public function limit($limit, $limitCount = null) {
        if(!$limitCount) {
            $this->sql['limit'] = $limit;
        }else{
            $this->sql['limit'] = $limit .','. $limitCount;
        }
        return $this;
    }

    public function orderBy($orderBy) {
        $this->sql['orderBy'] = $orderBy;
        return $this;
    }

    public function where($where) {
        if(!is_array($where)) {
            return null;
        }

        $crondsArr = [];
        foreach ($where as $key => $value) {
            $fieldValue = $value;
            if(is_array($fieldValue)) {
                $crondsArr[] = "`$key` ".$fieldValue[0]. ' :w' . $key;
            }else{
                $crondsArr[] = "`$key`=:w{$key}";
            }
        }

        $this->sql['wheresql'] = implode(' AND ', $crondsArr);
        $this->sql['where'] = $where;
        return $this;
    }

    public function close() {
        return $this->conn = null;
    }

    //开启事务
    public function startTrans(){
        if(empty($this->conn[$this->type])){
            exit();
        }
        $this->conn[$this->type]->beginTransaction();
    }

    //提交事务
    public function dbCommit(){
        if(empty($this->conn[$this->type])){
            exit();
        }
        $this->conn[$this->type]->commit();
    }

    //回滚事务
    public function dbRollBack(){
        if(empty($this->conn[$this->type])){
            exit();
        }
        $this->conn[$this->type]->rollBack();
    }

    /**
     * 原生查询
     * @param $querySql
     * @return mixed
     */
    public function query($querySql) {
        $querystr = strtolower(trim(substr($querySql,0,6)));
        $stmt = $this->conn[$this->type]->prepare($querySql);

        $ret = $stmt->execute();
        $this->sql = [];
        if(!$ret) var_dump($stmt->errorInfo());

        if($querystr == 'select') {
            $retData = $stmt->fetchAll(PDO::FETCH_ASSOC);
            return $retData;
        }elseif($ret && $querystr == 'insert') {
            return $this->conn[$this->type]->lastInsertId();
        }else{
            return $ret;
        }
    }

    private function _getDBIP($tableName){
        switch($tableName){
            default:
                return array(
                    'name' =>'server',
                    'DB_IP'   => DB_IP,
                    'DB_NAME' => DB_NAME,
                    'DB_USER' => DB_USER,
                    'DB_PASS' => DB_PASS,
                );
                break;

            case 'xxxx':
            case 'xxxx':
                return array(
                    'name' =>'master',
                    'DB_IP'   => DB_MAS_IP,
                    'DB_NAME' => DB_MAS_NAME,
                    'DB_USER' => DB_MAS_USER,
                    'DB_PASS' => DB_MAS_PASS,
                );
                break;

            case 'xxx':
            case 'xxx':
                return array(
                    'name' =>'manage',
                    'DB_IP'   => DB_MNG_IP,
                    'DB_NAME' => DB_MNG_NAME,
                    'DB_USER' => DB_MNG_USER,
                    'DB_PASS' => DB_MNG_PASS,
                );
                break;

            // LOGS
            case 'xxx':
                return array(
                    'name' =>'log',
                    'DB_IP'   => DB_LOG_IP,
                    'DB_NAME' => DB_LOG_NAME,
                    'DB_USER' => DB_LOG_USER,
                    'DB_PASS' => DB_LOG_PASS,
                );
                break;
        }
    }
}

 

© 著作权归作者所有

曲文
粉丝 2
博文 58
码字总数 18687
作品 0
朝阳
程序员
私信 提问
PHP PDOStatement对象bindpram()、bindvalue()和bindcolum

PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别 PDOStatement::bindParam ― 绑定一个参数到指定的变量名。 绑定一个PHP变量到用作预处理的SQL语句中的对应命名占位符或...

开元中国2015
2015/07/31
233
0
vb2005xu/sql.class.php

#sql.class.php 做最好的PHP数据库操作类 简单易懂的源代码 配置简单,方便易用 基于PDO 支持多种数据库,不耦合,不依赖第三方类库 功能适中,便于集成 支持PHP5.2+ 安全防sql注入 基于最小接口...

vb2005xu
2014/12/25
0
0
PHP 数据库操作类--EasyDB

EasyDB是一个基于PDO的数据库操作类,它使用了PDO的精髓--预编译--的思想,从而在根源上杜绝SQL注入的危险。 现在网上的大多数据库封装类,甚至一些知名的框架都仅仅只是包装一下数据库的操作...

奋斗de熊猫
2015/06/29
2.9K
2
最简单优雅的sql操作类库--sql.class.php

sql.class.php 做最好的PHP操作类库 简单易懂的源代码 配置简单,方便易用 基于PDO 支持多种数据库,不耦合,不依赖第三方类库 功能适中,便于集成 支持PHP5.2+ 安全防sql注入 基于最小接口原则 ...

vb2005xu
2014/12/16
2.1K
0
EasyDB 1.0.1正式版发布,MySQL操作类

EasyDB 1.0.1正式版发布.MySQL操作类 更新内容如下: 支持对insert/update/deldete/select的简化操作; 支持对复杂的insert/update/deldete/select SQL进行链式操作; 链式操作目前支持 fiel...

奋斗de熊猫
2016/01/14
3.1K
15

没有更多内容

加载失败,请刷新页面

加载更多

php 遇到 No input file specified的解决方法

(一)IIS Noinput file specified 方法一:改PHP.ini中的doc_root行,打开ini文件注释掉此行,然后重启IIS 方法二: 请修改php.ini 找到 ; cgi.force_redirect = 1 去掉前面分号,把后面的1...

chenhongjiang
今天
5
0
MySQL 基础

一、常用命令 在命令行中,配置好环境变量后,通过cmd可以直接进入mysql命令行模式,同时列举几种常用命令 # 进入mysql数据库,密码可以先不写,打完-p后再输入,防止被别人看到mysql -u账...

华山猛男
今天
6
0
简单的博客系统(四)Django请求HTML页面视图信息--基于函数的视图

1. 编写用于查询数据的功能函数 应用目录 下的 views.py 文件通常用于保存响应各种请求的函数或类 from django.shortcuts import renderfrom .models import BlogArticles# Create your ...

ZeroBit
今天
5
0
用脚本将本地照片库批量导入到Day One中

因为目前iCloud 空间已经不足,其中95%都是照片,之前入手了DayOne,且空间没有限制,订阅费一年也不少,再加上DayOne作为一款日记App 也比较有名,功能方面最大的就是地理视图与照片视图,尤...

在山的那边
昨天
19
0
jupyter部署安装

python373 -m ipykernel install --name python373 ipython kernelspec list sc create myjupyterservice binpath="D:\apply\Python373\Scripts\jupyter-notebook --config=V:/my_work/jupyt......

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部