為了防止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);
/*封裝函式中有兩點需要注意:乙個是mysqli_stmt::bind_param方法與mysqli_stmt::bind_result方法都為可變函式,所以需要使用call_user_func_array()這個函式進行**;第二個是以上兩個方法所需要的引數都為引用形式,所以在使用call_user_func_array()函式進行**時要特別小心,所以才有封裝函式中_refvalues()的必要.* 執行預編譯形式的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;
}
呼叫如下:
$id = "1";這裡只是舉例了 「select」 語句,此函式還可以應用於 「insert」, 「delete」, 「update」等, 只是要注意把函式_querystmt()中的第四個引數設為 true,因為沒有記錄資料的返回.$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);
封裝的函式也可以當作你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語句。其中校驗語法,和編...