针对thinkPHP5框架存储过程bug重写的存储过程扩展类的示例分析
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍了针对thinkPHP5框架存储过程bug重写的存储过程扩展类的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
千家信息网最后更新 2026年11月01日针对thinkPHP5框架存储过程bug重写的存储过程扩展类的示例分析
这篇文章主要介绍了针对thinkPHP5框架存储过程bug重写的存储过程扩展类的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
具体如下:
近期用tp5框架调取存储过程发现有bug,借鉴了一些官方的函数、以及找了个mysqli的类把存储过程重新写了个扩展类,下面两个类直接放置项目extend目录的stored(这个文件夹名称请按个人习惯命名)目录下,需要注意的是类增加命名空间namespace stored就OK。
1、mysqli类,此类直接在网上找的,新增一个getAllData()的函数来获取存储过程多条数据集
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'; //连接数据库 $this->db_connect(); //选择数据库 $this->db_usedb(); //设置字符集 $this->db_charset(); } //连接数据库 private function db_connect(){ $this->link=mysqli_connect($this->host,$this->user,$this->pass); if(!$this->link){ echo "数据库连接失败
"; echo "错误编码".mysqli_errno($this->link)."
"; echo "错误信息".mysqli_error($this->link)."
"; exit; } } //设置字符集 private function db_charset(){ mysqli_query($this->link,"set names {$this->charset}"); } //选择数据库 private function db_usedb(){ mysqli_query($this->link,"use {$this->db}"); } //私有的克隆 private function __clone(){ die('clone is not allowed'); } //公用的静态方法 public static function getIntance(){ if(self::$dbcon==false){ self::$dbcon=new self; } return self::$dbcon; } //执行sql语句的方法 public function query($sql){ $res=mysqli_query($this->link,$sql); if(!$res){ echo "sql语句执行失败
"; echo "错误编码是".mysqli_errno($this->link)."
"; echo "错误信息是".mysqli_error($this->link)."
"; } return $res; } //打印数据 public function p($arr){ echo ""; print_r($arr); echo "
"; } public function v($arr){ echo ""; var_dump($arr); echo "
"; } //获得最后一条记录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 一维数组 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); } //获取多条数据,二维数组 public function getAll($sql){ $query=$this->query($sql); $list=array(); while ($r=$this->getFormSource($query,"row")) { $list[]=$r; } return $list; } /** * 定义添加数据的方法 * @param string $table 表名 * @param string orarray $data [数据] * @return int 最新添加的id */ public function insert($table,$data){ //遍历数组,得到每一个字段和字段的值 $key_str=''; $v_str=''; foreach($data as $key=>$v){ if(empty($v)){ die("error"); } //$key的值是每一个字段s一个字段所对应的值 $key_str.=$key.','; $v_str.="'$v',"; } $key_str=trim($key_str,','); $v_str=trim($v_str,','); //判断数据是否为空 $sql="insert into $table ($key_str) values ($v_str)"; $this->query($sql); //返回上一次增加操做产生ID值 return $this->getInsertid(); } /* * 删除一条数据方法 * @param1 $table, $where=array('id'=>'1') 表名 条件 * @return 受影响的行数 */ 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); //返回受影响的行数 return mysqli_affected_rows($this->link); } /* * 删除多条数据方法 * @param1 $table, $where 表名 条件 * @return 受影响的行数 */ 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); //返回受影响的行数 return mysqli_affected_rows($this->link); } /** * [修改操作description] * @param [type] $table [表名] * @param [type] $data [数据] * @param [type] $where [条件] * @return [type] */ public function update($table,$data,$where){ //遍历数组,得到每一个字段和字段的值 $str=''; foreach($data as $key=>$v){ $str.="$key='$v',"; } $str=rtrim($str,','); //修改SQL语句 $sql="update $table set $str where $where"; $this->query($sql); //返回受影响的行数 return mysqli_affected_rows($this->link); } /** * @func: 获取存储过程多条数据集 * @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、存储过程调用扩展类库:
mysqli = new mysqli($config); } /** * 根据参数绑定组装最终的SQL语句 便于调试 * @access public * @param string $sql 带参数绑定的sql语句 * @param array $bind 参数绑定列表 * @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:存储过程执行并得到数据集 * @author: bieanju * @return: boolean * @createtime: 2017-12-22 */ protected function procs(){ $procedure = in_array(strtolower(substr(trim($this->sql), 0, 4)), ['call', 'exec']); // 参数绑定 if ($procedure) { $sql = $this->getRealSql($this->sql,$this->data); return $this->mysqli->getAllData($sql); } return false; } /** * @func: 存储过程数据 * @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");/*第二步调用demo方法并获取数据*///$data为给存储过程占位符传递的参数必须为array|[ ]$this->procs->data($data)->demo();ok是不是调用很简单、多条存储过程的数据集就此拿到!
感谢你能够认真阅读完这篇文章,希望小编分享的"针对thinkPHP5框架存储过程bug重写的存储过程扩展类的示例分析"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
数据
过程
存储
字段
方法
参数
多条
数据库
语句
影响
数组
条件
篇文章
错误
框架
示例
分析
信息
函数
字符
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网金融科技
广州淘业互联网络科技
广州紫鲸互联网科技有限公司
互联网科技行业发展
金诺互联网科技
中国互联网科技发展
郑州华宇互联网科技
互联网科技视频素材
互联网科技有限公司 翻译
科技伦理 互联网公司
山东吉时兔互联网科技有限公司
济南和联互联网科技有限公司
科技互联网海报
美国互联网科技实力
21世纪互联网科技成就
张召忠谈中国互联网科技
互联网科技股为什么大涨
西安有哪些互联网高科技企业
安徽九吞吴互联网科技有限公司
高科技和互联网的现代国家
互联网黑科技
上海挚品互联网科技有限公司
互联网中国科技
互联网 科技公司
凡科互联网科技
科技赋能互联网健康
北京三清互联网科技
知域互联网科技有限公司大骗子
全球科技与互联网公司市值变化
互联网高科技绘画