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;

      记住,每次参数类型必须放在参数数组第一位,这样我们就可以使用预处理方法,代码简洁,使用也方便,同时也可以防止被注入。

1条评论

  • 黎鸣 2019-07-29 11:09:40

    哇,这个真棒,刚好需要用到,一搜就找到这里,感谢博主的贡献

    回复

发表评论