针对thinkPHP5框架存储过程bug重写的存储过程扩展类的示例分析
发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章主要介绍了针对thinkPHP5框架存储过程bug重写的存储过程扩展类的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
千家信息网最后更新 2025年01月18日针对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安全错误
数据库的锁怎样保障安全
软件开发的创业优势
游戏服务器存储硬件
统信软件开发有前途吗
服务器硬盘怎么看转速
福建云空间服务器
淘宝网络安全方案需求分析
福州冠川互联网科技有限公司
重庆数据网络安全工程
数据库列表匹配主键
博雅数据库江苏文科一分一段表
华为网络安全匿名化
怎样创建销售管理数据库
软件开发工程师创业
大众迈腾正时链条数据库
peer强震数据库
云时间服务器转让
网络安全技术干啥的
gis数据库的建立与入库
网络安全宣传郑州高新区
数据库软件编写
wow新人服务器
狮控互联网科技
重庆服务器电源制造商
艾科莱特网络技术北京有限公司
怎样降低网络安全级别
吉安香港服务器价格
球OL服务器
广联达软件开发用的什么语言
维基百科数据库
商品 条形码数据库