PHP
PHP中对mysql预编译查询语句的一个封装
PHP中对mysql预编译查询语句的一个封装,实现对bind_param函数自定义封装
最近在做的一个项目,因为使用原生写mysql的缘故,为了防止mysql注入,找到了另一种写法,就是mysql的预处理函数,但是由于这种写法比较繁琐,所以特意对预处理语句进行封装,可以达到基本的增删查改语句以及多条件的兼容,下面贴出代码,代码如下:
/** * 获取列表数据 * @param $selfCon * @param $query * @param $params * @return array */ function _getDataList($selfCon, $query, $params) { //初始化返回结果接收容器 $parameters = array(); //初始化返回结果【返回数据】 $results = array(); //开始查询 $stmt = $selfCon->prepare($query); //回调函数传入参数 call_user_func_array(array($stmt, 'bind_param'), _refValues($params)); //绑定参数 //执行查询 $stmt->execute(); //获取结果 $meta = $stmt->result_metadata(); //循环塞进容器 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; } //关闭查询 $stmt->close(); //返回数据 return $results; } /** * 获取单条数据 * @param $selfCon * @param $query * @param $params * @return array */ function _getData($selfCon, $query, $params) { //开始查询 $stmt = $selfCon->prepare($query); //回调函数传入参数 call_user_func_array(array($stmt, 'bind_param'), _refValues($params)); //绑定参数 //执行查询 $stmt->execute(); //获取数据 $result = $stmt->get_result()->fetch_array(); //关闭连接 $stmt->close(); //返回 return $result; } /** * 获取数据条数 * @param $selfCon * @param $query * @param $params * @return mixed */ function _getDataRow($selfCon, $query, $params) { //开始查询 $stmt = $selfCon->prepare($query); //回调函数传入参数 call_user_func_array(array($stmt, 'bind_param'), _refValues($params)); //绑定参数 //执行查询 $stmt->execute(); //清除数据 $stmt->store_result(); //获取数据条数 $row = $stmt->num_rows; //关闭连接 $stmt->close(); //返回 return $row; } /** * 添加数据 * @param $selfCon * @param $query * @param $params * @return mixed */ function _insertData($selfCon, $query, $params) { //开始查询 $stmt = $selfCon->prepare($query); //回调函数传入参数 call_user_func_array(array($stmt, 'bind_param'), _refValues($params)); //绑定参数 //执行查询 $stmt->execute(); //获取本次插入ID $insertId = $stmt->insert_id; //关闭连接 $stmt->close(); //返回 return $insertId; } /** * 更新数据 * @param $selfCon * @param $query * @param $params * @return mixed */ function _updateData($selfCon, $query, $params) { //开始查询 $stmt = $selfCon->prepare($query); //回调函数传入参数 call_user_func_array(array($stmt, 'bind_param'), _refValues($params)); //绑定参数 //执行查询 $stmt->execute(); //获取本次操作的行数 $updateRow = $stmt->affected_rows; $stmt->close(); //返回 return $updateRow; } /** * 删除数据 * @param $selfCon * @param $query * @param $params * @return mixed */ function _deleteData($selfCon, $query, $params) { //开始查询 $stmt = $selfCon->prepare($query); //回调函数传入参数 call_user_func_array(array($stmt, 'bind_param'), _refValues($params)); //绑定参数 //执行查询 $stmt->execute(); //获取本次操作的行数 $deleteRow = $stmt->affected_rows; $stmt->close(); //返回 return $deleteRow; } ////////////////////////// 内部方法 ////////////////////////// /** * 转化引入参数 * @param $arr * @return array */ function _refValues($arr) { if (strnatcmp(phpversion(), '5.3') >= 0) { //Refer //ence is required for PHP 5.3+ $refs = array(); foreach ($arr as $key => $value) { $refs[$key] = &$arr[$key]; } return $refs; } return $arr; }
以上就是封装预处理的整个方法,包括获取多条数据、单天数据、添加、编辑、删除数据,使用也非常方便,实例如下:
$selfCon = mysqli_connect("地址", "账户名", "密码", "数据库名"); $sql = "INSERT INTO test (uid, content,date,time) VALUES (?,?,?,?)"; $type = 'ssss'; $data = array($type, '123', '测试', date('Y-m-d'), date('Y-m-d H:i:s')); $getData = _insertData($selfCon, $sql, $data); echo $getData;
记住,每次参数类型必须放在参数数组第一位,这样我们就可以使用预处理方法,代码简洁,使用也方便,同时也可以防止被注入。
哇,这个真棒,刚好需要用到,一搜就找到这里,感谢博主的贡献
回复