標籤:
(1)先行編譯的好處
假如要執行100條類似的sql語句,每一次執行,在MySQL端都會進行一次編譯,效率很低。提高效率的方法就是--減少編譯的次數。
先製造一個sql語句的模板,在MySQL端預先編譯好,之後每次只需要傳遞資料即可。
除了提高效率之外,先行編譯還可以防止sql注入。
(2)dml語句的先行編譯
以向一個表中插入資料為例。表結構如下:
+----------+----------------------------+
| Field | Type |
+----------+----------------------------+
| id | int(11) |
| name | varchar(20) |
| height | float(5,2) |
| gender | enum(‘male‘,‘female‘) |
| class_id | int(11) |
+----------+----------------------------+
1 // dml語句的先行編譯 2 // 1.串連資料庫 3 $mysqli = new MySQLi(‘localhost‘,‘root‘,‘root‘,‘lianxi‘); 4 if(mysqli_connect_errno()){ 5 echo ‘串連失敗 ‘.$mysqli->connect_error; 6 } 7 $mysqli->query(‘set names utf8‘); 8 // 2.進行先行編譯 9 // 問號是預留位置10 $sql = ‘insert into student values (?,?,?,?,?)‘;11 // 通過MySQLi類的prepare()方法對sql模板進行編譯,返回一個MySQLi_STMT類對象12 $stmt = $mysqli->prepare($sql) or die($mysqli->connect_error);13 // 利用MySQLi_STMT類中的bind_param()方法綁定參數。第一個參數表示各個欄位的類型,i(int)、s(string)、d(double)14 $stmt->bind_param(‘isdii‘,$id,$name,$height,$gender,$classId);15 // 3.利用MySQLi_STMT類中的execute()方法插入資料16 $id = null;17 $name = ‘Mildred‘;18 $height = 165.00;19 $gender = 2;20 $classId = 12;21 $stmt->execute() or die($stmt->error);22 // 繼續插入資料23 $id = null;24 $name = ‘Shaw‘;25 $height = 174.50;26 $gender = 1;27 $classId = 11;28 $stmt->execute() or die($stmt->error);29 30 // 關閉串連31 $stmt->close();32 $mysqli->close();
(3)dql語句的先行編譯
和dml語句不同的地方在於,除了要綁定參數,還需要綁定結果集
1 // dql語句的先行編譯 2 // 1.串連資料庫 3 $mysqli = new MySQLi(‘localhost‘,‘root‘,‘root‘,‘lianxi‘); 4 if(mysqli_connect_error()){ 5 die(‘串連失敗 ‘.$mysqli->connect_error); 6 } 7 $mysqli->query(‘set names utf8‘); 8 // 2.編譯sql語句 9 $sql = ‘select * from student where id>?‘;10 $stmt = $mysqli->prepare($sql) or die($mysqli->error);11 // 3.綁定參數12 $stmt->bind_param(‘i‘,$id);13 // 4.綁定結果集14 $stmt->bind_result($id,$name,$height,$gender,$classId);15 // 5.執行16 $id = 2;17 $stmt->execute();18 // 6.利用MySQLi_STMT類中的fetch()方法,通過迴圈得到查詢的資料19 while($stmt->fetch()){20 echo $id.‘--‘.$name.‘--‘.$height.‘--‘.$gender.‘--‘.$classId;21 echo ‘<br>‘;22 }23 // 7.關閉串連24 $stmt->free_result();25 $stmt->close();26 $mysqli->close();
PHP-Mysqli擴充庫的先行編譯