標籤:優點 成功 字元集 param 分析 pre 串連資料庫 順序 最佳化
<!--- 預先處理(先行編譯) --->
<?php
/*
防止 sql 注入的兩種方式:
1. 人為提高代碼的邏輯性,使其變得更嚴謹,滴水不漏。 比如說 增加判斷條件,增加輸入過濾等,但是智者千慮必有一失。(不推薦)
2. sql 語句的預先處理
*/
// 預先處理: 就是在程式正式編譯之前,事先處理,因為有些功能實現是一樣的,只是發生了一些簡單的值替換
/*
********** 預先處理的原理: *********
insert into register_info values(?,?,?,?);
01. 建立 sql語句模板,並發送到資料庫。預留的值使用參數 ? 標記
02. 資料庫對模板解析,編譯,對sql 語句模板執行查詢最佳化,並儲存結果不輸出
03. 最多將綁定的參數傳給之前 ? 標記的地方,模板執行語句。如果傳的參數不一樣,模板就可以多次使用。但是對模板的解析只需要做一次
********** 預先處理的優點 ***********
01. 預先處理語句大大減少了分析時間,只做了一次增刪改查(至於值被多次賦予,已經不需要資料庫來操作)
02. 綁定參數減少了伺服器頻寬,你只需要發送查詢或者增加的參數,而不是整個 sql 語句
03. 預先處理語句能很好的防止 sql注入,因為參數的發送不會影響一開始對模板的解析,編譯,模版又是自己定義的,根本不會有漏洞
*/
// 物件導向
// 1. 串連資料庫伺服器,選擇資料庫 register
$mysqli = new mysqli(‘localhost‘,‘root‘,‘‘,‘register‘);
if ($mysqli){
echo ‘<h2><i>串連資料庫成功</i></h2>‘;
// 2. 設定字元集
$mysqli->set_charset(‘utf8‘);
// 3. 預先處理的核心代碼(這部分代碼資料庫只執行一次)
// a. 寫sql語句模板 (register_info是已有的表)
$sql = "insert into register_info(id,username,password,email,tel)VALUES (?,?,?,?,?)";
// b. prepare() 方法,預先處理階段
$stmt = $mysqli->prepare($sql);
/*------------- 以下代碼都是重複執行的,都是由 $stmt 對象操作 --------------*/
// a. 綁定參數 bind_param()
// 給預留的 ? 賦值,要求類型和順序要和 ? 所表示的一致
/*
格式預留位置,格式列表:
i ---> int 整型
s ---> string 字串
d ---> double 雙精確度浮點型
b ---> blob(binary large object) 二進位大對象
*/
$id = 2;
$username = ‘王二‘;
$password = ‘1237890‘;
$email = ‘[email protected]‘;
$tel = ‘12345678987‘;
$stmt->bind_param(‘issss‘,$id,$username,$password,$email,$tel);
// b. 開始插入
if ($stmt->execute()){
echo ‘<h2><i>插入成功</i></h2>‘;
}else{
echo ‘<h2><i>插入失敗</i></h2>‘;
}
// 4. 關閉預先處理
$stmt->close();
// 5. 關閉資料庫
$mysqli->close();
}else{
die(‘串連資料庫失敗!‘);
}
預先處理(防止sql注入的一種方式)