PHP中對mysql預編譯查詢語句的乙個封裝

2022-08-12 23:48:29 字數 2475 閱讀 5170

為了防止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())

/* the result stored in array $results */

print_r($results);

二.封裝後.

/*

* 執行預編譯形式的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) else

call_user_func_array(array($stmt, 'bind_result'), _refvalues($parameters)); //繫結結果

//有多行記錄時將多行記錄存入$results陣列中.

while ($stmt->fetch())

$results = $x;

}$result = $results;

}$stmt->close();

//$closeflag為true則需要關閉資料庫控制代碼

if($closeflag)

return $result;}/*

* 作用:把返回的陣列中的元素變為引用狀態.

* (如果$arr為含有引用狀態元素的陣列,則會影響呼叫者的引數陣列,反之則反)

*/function _refvalues($arr)

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操作類中的乙個方法.使用形式可以多種多樣!

mysql怎麼實現預編譯 MySQL預編譯功能詳解

1 預編譯的好處 大家平時都使用過jdbc中的preparedstatement介面,它有預編譯功能。什麼是預編譯功能呢?它有什麼好處呢?當客戶傳送一條sql語句給伺服器後,伺服器總是需要校驗sql語句的語法格式是否正確,然後把sql語句編譯成可執行的函式,最後才是執行sql語句。其中校驗語法,和編...

mysql 預編譯 MySQL預編譯功能詳解

1 預編譯的好處 大家平時都使用過jdbc中的preparedstatement介面,它有預編譯功能。什麼是預編譯功能呢?它有什麼好處呢?當客戶傳送一條sql語句給伺服器後,伺服器總是需要校驗sql語句的語法格式是否正確,然後把sql語句編譯成可執行的函式,最後才是執行sql語句。其中校驗語法,和編...

mysql 預編譯的好處 MySQL的預編譯功能

1 預編譯的好處 大家平時都使用過jdbc中的preparedstatement介面,它有預編譯功能。什麼是預編譯功能呢?它有什麼好處呢?當客戶傳送一條sql語句給伺服器後,伺服器總是需要校驗sql語句的語法格式是否正確,然後把sql語句編譯成可執行的函式,最後才是執行sql語句。其中校驗語法,和編...