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 )
简单粗暴,预处理语句很可靠,不怕担心被注入代码