最近在做的一個項目,因爲使用原生寫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;
記住,每次參數類型必須放在參數數組第一位,這樣我們就可以使用預處理方法,代碼簡潔,使用也方便,同時也可以防止被注入。