PHP中对mysql预编译查询语句的一个封装
原文地址:http://chen-shan.net/?p=474
为了防止sql注入,我们都使用过mysqli这个类,但是每次都需要绑定参数,绑定结果等,比较麻烦,所以可以把这些重复的语句封装成一个函数.
一.封装前.
传统的一个预编译方式的”select”查询代码:
$id = "1";
$name = "test_name"; $db_obj = new mysqli("localhost", "db_user", "db_passwd", "db");
$db_obj->set_charset("utf8"); $query = "SELECT column1, column2, column3, column4 FROM tb_test WHERE id = ? and name = ?";
$stmt = $db_obj->prepare($query);
$stmt->bind_param("is", $id, $name);
$stmt->execute(); $stmt->bind_result($column1, $column2, $column3, $column4);
while ($stmt->fetch()) {
$result = array();
$result['column1'] = $column1;
$result['column2'] = $column2;
$result['column3'] = $column3;
$result['column4'] = $column4;
$results[] = $result;
} /* The result stored in array $results */
print_r($results);
二.封装后.
封装函数 (忘了是根据php手册中哪条评论修改得来的了) 如下:
/*
* 执行预编译形式的mysql语句
*
* @$query (string) -- 查询语句,例如:"SELECT * FROM table WHERE id = ?"
* @$params (array) -- 绑定参数,例如:array('i', $id)
* @$resultFlag (string) -- 是否为含有返回结果的查询,注意!!!: 为“select”查询时为“false”,为“insert”,"delete" 与 "update" 时为“true”
* @$closeFlag (string) -- 是否关闭数据库连接句柄, 关闭为 "ture", 不关闭为 "false"
*/ function _queryStmt($db_obj, $query, $params, $resultFlag, $closeFlag) {
$mysqli = $db_obj; $stmt = $mysqli->prepare($query);
call_user_func_array(array($stmt, 'bind_param'), _refValues($params)); //绑定参数
$stmt->execute(); //$resultFlag为true,则为“insert”,"delete" 与 "update"操作,无需绑定结果;false则为 “select”操作,需要绑定查询结果.
if ($resultFlag) { $result = $mysqli->affected_rows; //进行了修改的行数 } else { $meta = $stmt->result_metadata(); //将结果绑定数组元素设置为引用状态,因为call_user_func_array(array($stmt, 'bind_result'), $parameters)中的回调函数参数$parameters需要引用状态.
while ($field = $meta->fetch_field()) {
$parameters[] = &$row[$field->name];
} call_user_func_array(array($stmt, 'bind_result'), _refValues($parameters)); //绑定结果 //有多行记录时将多行记录存入$results数组中.
while ($stmt->fetch()) {
$x = array();
foreach ($row as $key => $val) {
$x[$key] = $val;
}
$results[] = $x;
} $result = $results;
} $stmt->close(); //$closeFlag为true则需要关闭数据库句柄
if($closeFlag) {
$mysqli->close();
} return $result;
} /*
* 作用:把返回的数组中的元素变为引用状态.
* (如果$arr为含有引用状态元素的数组,则会影响调用者的参数数组,反之则反)
*/ function _refValues($arr) {
if (strnatcmp(phpversion(), '5.3') >= 0) { //Reference is required for PHP 5.3+
$refs = array();
foreach ($arr as $key => $value) {
$refs[$key] = &$arr[$key];
}
return $refs;
}
return $arr;
}
封装函数中有两点需要注意:一个是mysqli_stmt::bind_param方法与mysqli_stmt::bind_result方法都为可变函数,所以需要使用call_user_func_array()这个函数进行回调;第二个是以上两个方法所需要的参数都为引用形式,所以在使用call_user_func_array()函数进行回调时要特别小心,所以才有封装函数中_refValues()的必要.
调用如下:
$id = "1";
$name = "test_name"; $db_obj = new mysqli("localhost", "db_user", "db_passwd", "db");
$db_obj->set_charset("utf8"); $query = "SELECT column1, column2, column3, column4 FROM tb_test WHERE uid = ? and name = ?";
$params = array("is", $id, $name);
$results = _queryStmt($db_obj, $query, $params, FALSE, TRUE); /* The result stored in array $results */
print_r($results);
这里只是举例了 “SELECT” 语句,此函数还可以应用于 “INSERT”, “DELETE”, “UPDATE”等, 只是要注意把函数_queryStmt()中的第四个参数设为 TRUE,因为没有记录数据的返回.
封装的函数也可以当作你mysql操作类中的一个方法.使用形式可以多种多样!
PHP中对mysql预编译查询语句的一个封装的更多相关文章
- weblogic对JSP预编译、weblogic读取JSP编译后的class文件、ant中weblogic.jspc预编译JSP
我们都知道在weblogic中JSP是每次第一次访问的时候才会编译,这就造成第一次访问某个JSP的时候性能下降,有时候我们也希望JSP被编译成class然后打包在jar中实现隐藏JSP的功能,下面介绍 ...
- hibernate预编译SQL语句中的setParameter和setParameterList
使用预编译SQL语句和占位符參数(在jdbc中是?),可以避免由于使用字符串拼接sql语句带来的复杂性.我们先来简单的看下.使用预编译SQL语句的优点. 使用String sql = "se ...
- mysql预编译
一.背景: 用Mybatis+mysql的架构做开发,大家都知道,Mybatis内置参数,形如#{xxx}的,均采用了sql预编译的形式,举例如下: <select id=”aaa” param ...
- {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析
MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...
- python 3 mysql sql逻辑查询语句执行顺序
python 3 mysql sql逻辑查询语句执行顺序 一 .SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_t ...
- 深入MySQL(四):MySQL的SQL查询语句性能优化概述
关于SQL查询语句的优化,有一些一般的优化步骤,本节就介绍一下通用的优化步骤. 一条查询语句是如何执行的 首先,我们如果要明白一条查询语句所运行的过程,这样我们才能针对过程去进行优化. 参考我之前画的 ...
- 在Delphi中动态地使用SQL查询语句 Adoquery sql 参数 冒号
在Delphi中动态地使用SQL查询语句 在一般的数据库管理系统中,通常都需要应用SQL查询语句来提高程序的动态特性.下面介绍如何在Delphi中实现这种功能.在Delphi中,使用SQL查询语句的途 ...
- MySQL知识树-查询语句
在日常的web应用开发过程中,一般会涉及到数据库方面的操作,其中查询又是占绝大部分的.我们不仅要会写查询,最好能系统的学习下与查询相关的知识点,这篇随笔我们就来一起看看MySQL查询知识相关的树是什么 ...
- MYSQL 数据库高频查询语句整理
一查询数值型数据: SELECT * FROM tb_name WHERE sum > 100; 查询谓词:>,=,<,<>,!=,!>,!<,=>,= ...
随机推荐
- PHP文件相关函数试题
一.问答题 1.返回路径中的文件名部分的函数是什么? 2.改变文件模式的函数是什么? 3.拷贝文件的函数是什么? 4.返回路径中的目录部分的函数是什么? 5.将上传的文件移动到指定位置的函数是? 6. ...
- 数论+dp Codeforces Beta Round #2 B
http://codeforces.com/contest/2/problem/B 题目大意:给你一个n*n的矩形,问从(1,1)出发到(n,n),把图中经过的所有的数字都乘在一起,最后这个数字有多少 ...
- TextUtils判断
System.out.println(TextUtils.isEmpty(null)); System.out.println(TextUtils.isEmpty(""));
- sql server 的约束的作用 于 理解 [转]
SQL Server中的约束用来确保系统的完整性.一般约束可以分为:主键约束外键约束检查约束默认约束唯一约束非空约束 但是一般我们需要特别注意前三种约束:主键约束,一就是说跟你系统的实体有很大的关系, ...
- linux 查看 cpu 和内存的命令 - top
1.查看内存,cpu ,当前进程task数目, 每个进程的cpu, 内存使用率, 用top 命令: 在这个页面,按 P,下面的进程排序,以cpu使用率降序排列. 按M,按内存使用率降序排列: 按N, ...
- web-service客户端与服务器端的连接
1 首先讲解下xfire XFire是新一代的Java Web服务引擎,XFire使得在JavaEE应用中发布Web服务变得轻而易举.和其他Web服务引擎相比,XFire的配置非常简单,可以非常容易地 ...
- c++模板入门
最近使用了c++模板,觉得非常强大,只是写起来需要掌握一点技巧.大部分模板都是直接把定义写在.h头文件,并且有些人还说这样做的原因是模板不支持分编译,可是以前的编译器对模板的支持不够好吧,但是现在完全 ...
- linux视频学习6(mysql的安装/)
1.mysql的优点: 免费,跨平台,轻,支持多并发. 2.mysql的安装步骤: 把安装文件准备好,拷贝到home目录下.mount /mnt/cdrom cp mysql* /home 把安装文件 ...
- linux的学习系列 5--环境变量
在Linux中,环境变量是一个很重要的概念.环境变量可以由系统.用户.Shell以及其他程序来设定. 变量就是一个可以被赋值的字符串,赋值范围包括数字.文本.文件名.设备以及其他类型的数据. 下面的例 ...
- android上的JAVA8:使用retrolambda
android上的JAVA8:使用retrolambda posted by juuda 2015年6月3日 下午7:33 under Android Java8引入了lambda表达式,让许多开发者 ...