1 //由于PHP语法里面包含了mysqli基类,可以直接继承即可,不用写其它什么东西
 2 Class DB extends \mysqli {
 3     private $lastInsId;
 4 //    默认配置
 5     private $config=array(
 6         'host'=>'localhost',
 7         'user'=>'root',
 8         'password'=>'',
 9         'database'=>'',
10         'port'=>3306,
11         'charset'=>'utf8'
12     );
13 
14   // 初始化工作,需要传入$config,最后会写出来的.....
15     public function __construct($config){
16         $this->config=array_merge($this->config,$config);
17         @parent::__construct($this->config['host'],$this->config['user'],$this->config['password'],$this->config['database'],$this->config['port']);
18         if($this->connect_errno){
19             $this->dError($this->connect_error);
20         }
21         $this->set_charset($this->config['charset']);
22     }
23 
24     /*
25      * array(
26      *    'sql'=>INSERT INTO test(id,name,pic) VALUES(?,?,?),
27      *    'bind'=>array('iss',array(100,'Alex','Jones'))
28      * )
29      * */
30   // sql执行语句,实例上面那个也可以
31     public function execute($param){
32         $stmt=$this->stmt_init();
33         if($stmt->prepare($param['sql'])){
34             if(isset($param['bind'])){
35           // 特殊时期,特殊对待,看不懂没关系,直接这样用就可以了
36                 foreach ($param['bind'][1] as $key=>$val){
37                     $tmp[]=&$param['bind'][1][$key];
38                 }
39                 array_unshift($tmp,$param['bind'][0]);
40                 if(!@call_user_func_array(array($stmt,'bind_param'),$tmp)){
41                     $this->dError('参数绑定失败.');
42                 }
43             }
44             if($stmt->execute()){
45           // 如果执行之后有结果集,就全部从数据库那里取出来,这里有个弊端,如果结果集太多会耗资源,不保险,需要的话可以更改一个限制,例如每次取10条,分开取是好方法,我就没写了,
46           // 有需要的可以直接加上
47                 if($stmt->result_metadata()){
48                     $result=$stmt->get_result();
49                     return $result->fetch_all(MYSQLI_ASSOC);
50                 }
51                 $this->lastInsID=$stmt->insert_id;
52                 return $stmt->affected_rows;
53             }else{
54                 $this->dError($stmt->error);
55             }
56         }else{
57             $this->dError($stmt->error);
58         }
59     }
60 
61    // 取得上一步 INSERT 操作产生的 ID
62     public function getLastInsID(){
63         return $this->lastInsId;
64     }
65 
66    //转义
67     public function escape($data){
68         if(is_string($data)){
69             return $this->real_escape_string($data);
70         }
71         if(is_array($data)){
72             foreach($data as $key=>$val){
73           // 采用递归更加方便
74                 $data[$key]=$this->escape($val);
75             }
76         }
77         return $data;
78     }
79 
80    //错误信息
81     public function dError($error){
82         throw new \Exception($error);
83     }
84 
85    // 利用析构函数的特点,执行关闭数据库连接
86     public function __destruct(){
87         @$this->close();
88     }
89 }
 1 // 默认只需要传密码和数据库即可,其它的都有默认
 2 $db=new DB(array('password'=>'myPassword','database'=>'myDatabase'));
 3         $param=array(
 4        // 这里只是写了insert语句,select && delete && update 都是一样的写法
 5         // 也可以直接写明
 6         //'sql'=>'INSERT INTO test(name,pic) VALUES("Alex", "Jones")'
 7         'sql'=>'INSERT INTO test(name, pic) VALUES(?,?)',
 8         // 这里的ss,是变量绑定。用变量绑定? 表示的值,i表示整型,d表示浮点型,b代表二进制,s代表其它的所有
 9             'bind'=>array('ss',array(100, 'Alex', 'Jones'))
10         );

 

escape() 这个方法很简单的,建议最好是传数组

1 $data=array(
2             "as'df'cx'yv",
3             "xcvy‘’v4b、i#\dfnb\lv"
4         );
5         var_dump($db->escape($data));

返回:

1 Array
2 (
3     [0] => as\'df\'cx\'yv
4     [1] => xcvy‘’v4b、i#\\dfnb\\lv
5 )

简单粗暴,预处理语句很可靠,不怕担心被注入代码

posted on 2017-10-30 18:21  公子寒  阅读(218)  评论(0编辑  收藏  举报