php中對mysql預編譯查詢語句的一個封裝

       最近在做的一個項目,因爲使用原生寫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;

        記住,每次參數類型必須放在參數數組第一位,這樣我們就可以使用預處理方法,代碼簡潔,使用也方便,同時也可以防止被注入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章