在前一篇 mysqli基礎知識中談到mysqli的安裝及基礎操作(主要是單條sql語句的查詢操作),今天介紹的是mysqli中很重要的一個部分:預處理。
在mysqli操作中常常涉及到它的三個主要類:MySQLi類,MySQL_STMT類,MySQLi_RESULT類。預處理主要是利用MySQL_STMT類完成的。
預處理是一種重要的 防止SQL注入的手段,對提高網站安全性有重要意義。
本文案例為 數據庫名為test,數據表名為test, 字段有id ,title 兩個,id自增長主鍵。
使用mysqli預處理執行插入操作:
<?php define("HOST", "localhost"); define("USER", 'root'); define("PWD", ''); define("DB", 'test'); $mysqli=new Mysqli(HOST,USER,PWD,DB); if ($mysqli->connect_errno) { "Connect Error:".$mysqli->connect_error; } $mysqli->set_charset('utf8'); $id=''; $title='title4'; //用?代替 變量 $sql="INSERT test VALUES (?,?)"; //獲得$mysqli_stmt對象,一定要記住傳$sql,預處理是對sql語句的預處理。 $mysqli_stmt=$mysqli->prepare($sql); //第一個參數表明變量類型,有i(int),d(double),s(string),b(blob) $mysqli_stmt->bind_param('is',$id,$title); //執行預處理語句 if($mysqli_stmt->execute()){ echo $mysqli_stmt->insert_id; }else{ echo $mysqli_stmt->error; } $mysqli->close();
使用mysqli預處理防止sql注入:
$id='4'; $title='title4'; $sql="SELECT * FROM test WHERE id=? AND title=?"; $mysqli_stmt=$mysqli->prepare($sql); $mysqli_stmt->bind_param('is',$id,$title); if ($mysqli_stmt->execute()) { $mysqli_stmt->store_result(); if($mysqli_stmt->num_rows()>0){ echo "驗證成功"; }else{ echo "驗證失敗"; } } $mysqli_stmt->free_result(); $mysqli_stmt->close();
使用mysqli預處理執行查詢語句:
$sql="SELECT id,title FROM test WHERE id>=?"; $mysqli_stmt=$mysqli->prepare($sql); $id=1; $mysqli_stmt->bind_param('i',$id); if($mysqli_stmt->execute()){ $mysqli_stmt->store_result();
//將一個變量綁定到一個prepared語句上用於結果存儲 $mysqli_stmt->bind_result($id,$title); while ($mysqli_stmt->fetch()) { echo $id.' :'.$title.'<br/>'; } }
更多mysqli技術請參見php官方手冊,查手冊是學習的最好方法~