您好,欢迎访问一九零五行业门户网

PHP PDO操作MYSQL封装类

dbname = $dbname; $this->persistent = $attr; } public static function db($flag='r',$persistent=false) { if(!isset($flag)){ $flag = 'r'; } if (!class_exists('pdo')) { throw new exception('not found pdo'); return false; } $mysql_server = yaf_registry::get('mysql'); if(!isset($mysql_server[$flag])){ return false; } $options_arr = array(pdo::mysql_attr_init_command => 'set names '.$mysql_server[$flag]['charset'],pdo::attr_default_fetch_mode=>pdo::fetch_assoc); if($persistent === true){ $options_arr[pdo::attr_persistent] = true; } try { $pdo = new pdo($mysql_server[$flag]['connectionstring'],$mysql_server[$flag]['username'],$mysql_server[$flag]['password'],$options_arr); } catch (pdoexception $e) { throw new exception($e->getmessage()); //exit('连接失败:'.$e->getmessage()); return false; } if(!$pdo) { throw new exception('pdo connect error'); return false; } return $pdo; } /** * 得到操作数据库对象 * @param string $dbname 对应的数据库是谁 * @param bool $attr 是否长连接 * return false说明给定的数据库不存在 */ public static function getinstance($dbname = 'r',$attr = false) { $mysql_server = yaf_registry::get('mysql'); if(!isset($mysql_server[$dbname])){ return false; } $key = md5(md5($dbname.$attr,true)); if (!isset(self::$_instance[$key]) || !is_object(self::$_instance[$key])) self::$_instance[$key] = new self($dbname,$attr); return self::$_instance[$key]; } private function getconnect(){ $this->pdo = self::db($this->dbname,$this->persistent); } /** * 查询操作 * @param string $sql 执行查询的sql语句 * @param array $data 查询的条件 格式为[':id'=>$id,':name'=>$name](推荐)或者为[1=>$id,2=>$name] * @param bool $one 是否返回一条内容 默认为否 */ public function query($sql, $data = [], $one = false) { if (!is_array($data) || empty($sql) || !is_string($sql)) return false; $this->free(); return $this->querycommon($data,$sql,$one); } /** * 内部查询的共用方法 */ private function querycommon($data,$sql,$one) { $this->pdoexec($data,$sql); if ($one){ return $this->statement->fetch(pdo::fetch_assoc); }else{ return $this->statement->fetchall(pdo::fetch_assoc); } } /** * 多条sql语句的查询操作 * @param array $arr_sql 执行查询的sql语句数组 格式为[$sql1,$sql2] * @param array $arr_data 查询与$arr_sql对应的条件 格式为[[':id'=>$id,':name'=>$name],[':id'=>$id,':name'=>$name]](推荐)或者为[[1=>$id,2=>$name],[1=>$id,2=>$name]] * @param bool $one 是否返回一条内容 默认为否 这里如果设置为true那么每一条sql都只返回一条数据 */ public function queryes($arr_sql, $arr_data = [], $one = false) { if(!is_array($arr_sql) || empty($arr_sql) || !is_array($arr_data)) return false; $this->free(); $res = [];$i = 0; foreach ($arr_sql as $val) { if(!isset($arr_data[$i])) $arr_data[$i] = []; elseif(!is_array($arr_data[$i])) throw new exception('error where queryes sql:'.$val.' where:'.$arr_data[$i]); $res[] = $this->querycommon($arr_data[$i],$val,$one); $i++; } return $res; } /** * 分页封装 * * @param string $sql * @param int $page 表示从第几页开始取 * @param int $pagesize 表示每页多少条 * @param array $data 查询的条件 */ public function limitquery($sql, $page=0, $pagesize=20, $data = []) { $page = intval($page); if ($page return []; } $pagesize = intval($pagesize); if ($pagesize > 0) { // pagesize 为0时表示取所有数据 $sql .= ' limit ' . $pagesize; if ($page > 0) { $start_limit = ($page - 1) * $pagesize; $sql .= ' offset ' . $start_limit; } } return $this->query($sql, $data); } /** * 这个是用来进行添加 删除 修改操作 使用事务操作 * @param string $sql 执行查询的sql语句 * @param array $data 查询的条件 格式为[':id'=>$id,':name'=>$name](推荐)或者为[1=>$id,2=>$name] * @param bool $transaction 是否事务操作 默认为否 */ public function executeddl($sql, $data = [],$transaction = false){ if (!is_array($data) || !is_string($sql)) return false; $this->free(); if($transaction) $this->pdo->begintransaction();//开启事务 try{ $this->execres($data,$sql); if($transaction) $this->pdo->commit();//事务提交 return $this->lastinsid; } catch (exception $e) { if($transaction) $this->pdo->rollback();//事务回滚 throw new exception('error ddlexecute '.$e->getmessage()); return false; } } /** * 这个是用来进行添加 删除 修改操作 使用事务操作 * 它是执行多条的 * @param array $arr_sql 需要执行操作的sql语句数组 * @param array $arr_data 与数组对应sql语句的条件 * @param bool $transaction 是否事务操作 默认为否 */ public function executeddles($arr_sql, $arr_data = [],$transaction = false){ if(!is_array($arr_sql) || empty($arr_sql) || !is_array($arr_data)) return false; $res = []; $this->free(); if($transaction) $this->pdo->begintransaction();//开启事务 try{ $i = 0; foreach($arr_sql as $val){ if(!isset($arr_data[$i])) $arr_data[$i] = []; elseif(!is_array($arr_data[$i])){ if($transaction) $this->pdo->rollback();//事务回滚 throw new exception('error where ddlexecutees sql:'.$val.' where:'.$arr_data[$i]); } $this->execres($arr_data[$i],$val); $res[] = $this->lastinsid; $i++; } if($transaction) $this->pdo->commit();//事务提交 return $res; } catch (exception $e) { if($transaction) $this->pdo->rollback();//事务回滚 throw new exception('error ddlexecutees array_sql:'.json_encode($arr_sql).' '.$e->getmessage()); return false; } return $res; } /** * 此方法是用来计算查询返回的条数 注意 它只支持select count(*) from table...或者select count(0) from table...方式 * @param string $sql 查询的sql语句 * @param array $data sql语句的条件 */ public function countrows($sql,$data = []){ if (!is_array($data) || empty($sql) || !is_string($sql)) return false; $this->free(); $res = $this->pdoexec($data,$sql); if($res == false) return false; return $this->statement->fetchcolumn(); } /** * 此方法是用来计算查询返回的条数 它是执行多条sql * @param string $sql 查询的sql语句 * @param array $data sql语句的条件 */ public function countrowses($arr_sql,$arr_data = []){ if(!is_array($arr_sql) || empty($arr_sql) || !is_array($arr_data)) return false; $res = []; $this->free(); $i = 0; foreach ($arr_sql as $val) { if(!isset($arr_data[$i])) $arr_data[$i] = []; elseif(!is_array($arr_data[$i])) throw new exception('error where countrowses sql:'.$val.' where:'.$arr_data[$i]); $res1 = $this->pdoexec($arr_data[$i],$val); if($res1 == false) $res[] = false; else $res[] = $this->statement->fetchcolumn(); } return $res; } /** * 这里再提供一个方法 由于项目中会有很多需要提供开启事务 然后再进行操作 最后提交 * @param bool $transaction 是否事务操作 默认为否 */ public function getdb($transaction=false) { $this->transaction = $transaction; $this->getconnect(); if($transaction === true) $this->pdo->begintransaction();//开启事务 return $this; } /** * 此方法可以执行多次 它是执行ddl语句的 * 注意 它是需要配合getdb和sqcommit一起使用 不能单独使用哦 * 如果没有开启事务 sqcommit方法可以不调用 * @param string $sql 查询的sql语句 * @param array $data sql语句的条件 */ public function execsq($sql,$data = []) { if($this->checkparams($sql,$data) === false) return false; try{ $this->execres($data,$sql); return $this->lastinsid; } catch (exception $e) { if(isset($this->transaction) && $this->transaction === true) $this->pdo->rollback();//事务回滚 throw new exception('error execsq'.$e->getmessage()); return false; } finally { if (!empty($this->statement)) { $this->statement->closecursor(); unset($this->statement); } } } /** * 执行查询的方法 它需要传一个连接数据库对象 * @param string $sql 执行查询的sql语句 * @param array $data 查询的条件 格式为[':id'=>$id,':name'=>$name](推荐)或者为[1=>$id,2=>$name] * @param bool $one 是否返回一条内容 默认为否 */ public function querysq($sql,$data = [],$one = false) { if($this->checkparams($sql,$data) === false) return false; return $this->pdoexecsq($sql,$data,[1,$one]); } /** * 分页封装 * * @param string $sql * @param int $page 表示从第几页开始取 * @param int $pagesize 表示每页多少条 * @param array $data 查询的条件 */ public function limitquerysq($sql, $page=0, $pagesize=20, $data = []) { $page = intval($page); if ($page return []; } $pagesize = intval($pagesize); if ($pagesize > 0) { // pagesize 为0时表示取所有数据 $sql .= ' limit ' . $pagesize; if ($page > 0) { $start_limit = ($page - 1) * $pagesize; $sql .= ' offset ' . $start_limit; } } return $this->querysq($sql, $data); } /** * 此方法是用来计算查询返回的条数 注意 它只支持select count(*) from table...或者select count(0) from table...方式 * @param string $sql 查询的sql语句 * @param array $data sql语句的条件 */ public function countrowssq($sql,$data = []){ if($this->checkparams($sql,$data) === false) return false; return $this->pdoexecsq($sql,$data,[2]); } /** * 这里再提供一个方法 这是最后提交操作 如果没有开启事务 此方法最后可以不调用的 */ public function sqcommit() { if(empty($this->pdo) || !is_object($this->pdo)) return false; if(isset($this->transaction) && $this->transaction === true) $this->pdo->commit();//提交事务 unset($this->pdo); } /** * 内部调用方法 */ public function checkparams($sql,$data) { if (empty($this->pdo) || !is_object($this->pdo) || !is_array($data) || empty($sql) || !is_string($sql)) return false; return true; } /** * 内部调用方法 */ private function pdoexecsq($sql,$data,$select = []){ try{ $res = $this->pdoexec($data,$sql); if(empty($select)) return $res; else{ if($select[0] === 1){ if($select[1] === true) return $this->statement->fetch(pdo::fetch_assoc); else return $this->statement->fetchall(pdo::fetch_assoc); }elseif($select[0] === 2) return $this->statement->fetchcolumn(); else return false; } } catch (exception $e) { throw new exception($e->getmessage()); return false; } finally { if (!empty($this->statement)) { $this->statement->closecursor(); unset($this->statement); } } } /** * 内部调用方法 */ private function execres($data,$sql){ $res = $this->pdoexec($data,$sql); $in_id = $this->pdo->lastinsertid(); if (preg_match(/^\s*(insert\s+into|replace\s+into)\s+/i, $sql) && !empty($in_id)) $this->lastinsid = $in_id; else $this->lastinsid = $res; } /** * 内部调用方法 用来直接执行sql语句的方法 */ private function pdoexec($data,$sql){ $this->statement = $this->pdo->prepare($sql); if (false === $this->statement) return false; if (!empty($data)) { foreach ($data as $k => $v) { $this->statement->bindvalue($k, $v); } } $res = $this->statement->execute(); if (!$res) { throw new exception('sql:'.$sql.'where:'.json_encode($data).'error:'.json_encode($this->statement->errorinfo())); }else{ return $res; } } /** * 内部调用方法 用来释放的 */ private function free() { if (is_null($this->pdo)) $this->getconnect(); if (!empty($this->statement)) { $this->statement->closecursor(); $this->statement = null; } }}?>
复制代码
php, pdo, mysql
其它类似信息

推荐信息