您好,登錄后才能下訂單哦!
這篇文章主要介紹了針對thinkPHP5框架存儲過程bug重寫的存儲過程擴展類的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
具體如下:
近期用tp5框架調(diào)取存儲過程發(fā)現(xiàn)有bug,借鑒了一些官方的函數(shù)、以及找了個mysqli的類把存儲過程重新寫了個擴展類,下面兩個類直接放置項目extend目錄的stored(這個文件夾名稱請按個人習(xí)慣命名)目錄下,需要注意的是類增加命名空間namespace stored
就OK。
1、mysqli類,此類直接在網(wǎng)上找的,新增一個getAllData()
的函數(shù)來獲取存儲過程多條數(shù)據(jù)集
<?php namespace stored; /* 掌握滿足單例模式的必要條件 (1)私有的構(gòu)造方法-為了防止在類外使用new關(guān)鍵字實例化對象 (2)私有的成員屬性-為了防止在類外引入這個存放對象的屬性 (3)私有的克隆方法-為了防止在類外通過clone成生另一個對象 (4)公有的靜態(tài)方法-為了讓用戶進行實例化對象的操作 */ class mysqli{ //私有的屬性 private static $dbcon=false; private $host; private $port; private $user; private $pass; private $db; private $charset; private $link; //私有的構(gòu)造方法 protected function __construct($config=array()){ header('content-type:text/html;charset=utf-8'); $this->host = $config['hostname'] ? $config['hostname'] : 'localhost'; $this->port = $config['hostport'] ? $config['hostport'] : '3306'; $this->user = $config['username'] ? $config['username'] : 'root'; $this->pass = $config['password'] ? $config['password'] : 'root'; $this->db = $config['database'] ? $config['database'] : 'zhijian'; $this->charset=isset($config['charset']) ? $config['charset'] : 'utf8'; //連接數(shù)據(jù)庫 $this->db_connect(); //選擇數(shù)據(jù)庫 $this->db_usedb(); //設(shè)置字符集 $this->db_charset(); } //連接數(shù)據(jù)庫 private function db_connect(){ $this->link=mysqli_connect($this->host,$this->user,$this->pass); if(!$this->link){ echo "數(shù)據(jù)庫連接失敗<br>"; echo "錯誤編碼".mysqli_errno($this->link)."<br>"; echo "錯誤信息".mysqli_error($this->link)."<br>"; exit; } } //設(shè)置字符集 private function db_charset(){ mysqli_query($this->link,"set names {$this->charset}"); } //選擇數(shù)據(jù)庫 private function db_usedb(){ mysqli_query($this->link,"use {$this->db}"); } //私有的克隆 private function __clone(){ die('clone is not allowed'); } //公用的靜態(tài)方法 public static function getIntance(){ if(self::$dbcon==false){ self::$dbcon=new self; } return self::$dbcon; } //執(zhí)行sql語句的方法 public function query($sql){ $res=mysqli_query($this->link,$sql); if(!$res){ echo "sql語句執(zhí)行失敗<br>"; echo "錯誤編碼是".mysqli_errno($this->link)."<br>"; echo "錯誤信息是".mysqli_error($this->link)."<br>"; } return $res; } //打印數(shù)據(jù) public function p($arr){ echo "<pre>"; print_r($arr); echo "</pre>"; } public function v($arr){ echo "<pre>"; var_dump($arr); echo "</pre>"; } //獲得最后一條記錄id public function getInsertid(){ return mysqli_insert_id($this->link); } /** * 查詢某個字段 * @param * @return string or int */ public function getOne($sql){ $query=$this->query($sql); return mysqli_free_result($query); } //獲取一行記錄,return array 一維數(shù)組 public function getRow($sql,$type="assoc"){ $query=$this->query($sql); if(!in_array($type,array("assoc",'array',"row"))){ die("mysqli_query error"); } $funcname="mysqli_fetch_".$type; return $funcname($query); } //獲取一條記錄,前置條件通過資源獲取一條記錄 public function getFormSource($query,$type="assoc"){ if(!in_array($type,array("assoc","array","row"))) { die("mysqli_query error"); } $funcname="mysqli_fetch_".$type; return $funcname($query); } //獲取多條數(shù)據(jù),二維數(shù)組 public function getAll($sql){ $query=$this->query($sql); $list=array(); while ($r=$this->getFormSource($query,"row")) { $list[]=$r; } return $list; } /** * 定義添加數(shù)據(jù)的方法 * @param string $table 表名 * @param string orarray $data [數(shù)據(jù)] * @return int 最新添加的id */ public function insert($table,$data){ //遍歷數(shù)組,得到每一個字段和字段的值 $key_str=''; $v_str=''; foreach($data as $key=>$v){ if(empty($v)){ die("error"); } //$key的值是每一個字段s一個字段所對應(yīng)的值 $key_str.=$key.','; $v_str.="'$v',"; } $key_str=trim($key_str,','); $v_str=trim($v_str,','); //判斷數(shù)據(jù)是否為空 $sql="insert into $table ($key_str) values ($v_str)"; $this->query($sql); //返回上一次增加操做產(chǎn)生ID值 return $this->getInsertid(); } /* * 刪除一條數(shù)據(jù)方法 * @param1 $table, $where=array('id'=>'1') 表名 條件 * @return 受影響的行數(shù) */ public function deleteOne($table, $where){ if(is_array($where)){ foreach ($where as $key => $val) { $condition = $key.'='.$val; } } else { $condition = $where; } $sql = "delete from $table where $condition"; $this->query($sql); //返回受影響的行數(shù) return mysqli_affected_rows($this->link); } /* * 刪除多條數(shù)據(jù)方法 * @param1 $table, $where 表名 條件 * @return 受影響的行數(shù) */ public function deleteAll($table, $where){ if(is_array($where)){ foreach ($where as $key => $val) { if(is_array($val)){ $condition = $key.' in ('.implode(',', $val) .')'; } else { $condition = $key. '=' .$val; } } } else { $condition = $where; } $sql = "delete from $table where $condition"; $this->query($sql); //返回受影響的行數(shù) return mysqli_affected_rows($this->link); } /** * [修改操作description] * @param [type] $table [表名] * @param [type] $data [數(shù)據(jù)] * @param [type] $where [條件] * @return [type] */ public function update($table,$data,$where){ //遍歷數(shù)組,得到每一個字段和字段的值 $str=''; foreach($data as $key=>$v){ $str.="$key='$v',"; } $str=rtrim($str,','); //修改SQL語句 $sql="update $table set $str where $where"; $this->query($sql); //返回受影響的行數(shù) return mysqli_affected_rows($this->link); } /** * @func: 獲取存儲過程多條數(shù)據(jù)集 * @author: bieanju * @return: array * @createtime: 2017-12-25 */ public function getAllData($sql){ if (mysqli_multi_query($this->link,$sql)) { do { if ($result = mysqli_store_result($this->link)) { while ($row = mysqli_fetch_assoc($result)) { $list[] = $row; } /*必須釋放*/ mysqli_free_result($result); }else{ return false; } /*mysqli_next_result($this->link) && mysqli_more_results($this->link)*/ } while (mysqli_next_result($this->link) && mysqli_more_results($this->link)); } else { return false; } return $list; } } ?>
2、存儲過程調(diào)用擴展類庫:
<?php /** * 針對存儲過程處理類 * @author: bieanju * @createtime: 2017-12-21 */ namespace stored; use think\Config; class procs extends mysqli{ public $mysqli; /* * 存儲過程數(shù)據(jù)參數(shù) * */ protected $data = []; /* * 執(zhí)行語句 * */ protected $sql = ''; public function __construct($type = "mysqli"){ $config = C("存儲過程庫配置參數(shù)"); if($type == "mysql"){ $config = Config::get('database'); } $this->mysqli = new mysqli($config); } /** * 根據(jù)參數(shù)綁定組裝最終的SQL語句 便于調(diào)試 * @access public * @param string $sql 帶參數(shù)綁定的sql語句 * @param array $bind 參數(shù)綁定列表 * @return string */ private function getRealSql($sql, array $bind = []) { foreach ($bind as $key => $val) { $value = is_array($val) ? $val[0] : $val; $value = is_string($val) ? "'{$val}'" : $val; // 判斷占位符 $sql = is_numeric($key) ? substr_replace($sql, $value, strpos($sql, '?'), 1) : str_replace( [':' . $key . ')', ':' . $key . ',', ':' . $key . ' '], [$value . ')', $value . ',', $value . ' '], $sql . ' '); } return rtrim($sql); } /** * @func:存儲過程執(zhí)行并得到數(shù)據(jù)集 * @author: bieanju * @return: boolean * @createtime: 2017-12-22 */ protected function procs(){ $procedure = in_array(strtolower(substr(trim($this->sql), 0, 4)), ['call', 'exec']); // 參數(shù)綁定 if ($procedure) { $sql = $this->getRealSql($this->sql,$this->data); return $this->mysqli->getAllData($sql); } return false; } /** * @func: 存儲過程數(shù)據(jù) * @author: bieanju * @return: array * @createtime: 2017-12-22 */ public function data($data = []) { $this->data = $data; return $this; } /** * @func: 存儲過程sql * @author: bieanju * @return: array * @createtime: 2017-12-22 */ public function sql($sql = '') { $this->sql = $sql; return $this; } /** * 使用DEMO */ public function demo(){ return $this->sql("call demo(?,?,?,?,?,?)")->procs(); } } ?>
3、最終項目中使用demo:
use stored\procs; /*用use加載后第一步實例化下存儲過程類*/ $this->procs = new procs("mysqli"); /*第二步調(diào)用demo方法并獲取數(shù)據(jù)*/ //$data為給存儲過程占位符傳遞的參數(shù)必須為array|[ ] $this->procs->data($data)->demo();
ok是不是調(diào)用很簡單、多條存儲過程的數(shù)據(jù)集就此拿到!
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“針對thinkPHP5框架存儲過程bug重寫的存儲過程擴展類的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。