首頁  >  文章  >  後端開發  >  關於mysql預處理技術的小技巧

關於mysql預處理技術的小技巧

一个新手
一个新手原創
2017-09-13 09:48:351564瀏覽

  我們先來看傳統的操作資料庫的方法。

  傳統的操作資料庫方法有兩種:

  1. #先寫一條sql語句,然後透過mysqli->query($sql) 去操作資料庫(筆者這裡使用的是mysqli擴充庫)。這樣操作 並不會有什麼大的錯誤,但是當你要插入上千條上萬條資料呢?難道也還是要這樣寫一 條sql語句然後再操作一下資料庫?那有人會說, 好辦嘛 ,用mysqli自帶的操作多條sql語句的方法,即第二種方法。

  2. mysqli->multi_query($sql),這是操作多條sql語句的方法,如下:

  如果你認為這樣就可以完全解決問題,那麼你就錯了,接下來讓我們來看看MySQL資料庫執行sql語句的原理吧!

     從上圖可以看出,無論我們是發送一條sql語句還是發送多條sql語句,資料庫都要對其一一的進行編譯,那麼當資料達到一定量之後,資料庫的開銷必然很大。那究竟要怎麼解決這個問題呢?此時就引入了預處理技術的概念。

   下面我們來看一段預處理技術的程式碼:    

 <?         =  mysqli("localhost", "root", "123456", "student"  (->     ("连接失败" . ->  ->query("set names utf8"  = "insert into student_info(name,age,sex,studentNo,grade) values (?,?,?,?,?)"   = ->prepare(   = "张三"  = 30  = 0;  = "1501222"  = 89 
 ->bind_param("siisd", , , , ,   ->  ->close();

  首先我們來看

  
  等等,为什么values会是问号呢?这里的问号相当于一个占位符,之后只要向数据库发送数据就能够自动把数据对应的填充进去

  这就是预编译技术的精髓之处,我们通过bind_param,顾名思义,就是绑定参数的意思,那么,它给谁绑定参数呢?看看上面的values (?,?,?,?,?),bind_param里面的参数一一对应

着values的每一个参数。那么bind_param里面的siisd又是什么意思呢?别急,请看下方:

  参数有以下四种类型: 
  i - integer(整型) 
  d - double(双精度浮点型) 
  s - string(字符串) 
  b - BLOB(布尔值) 
  每个参数都需要指定类型。 
  通过告诉数据库参数的数据类型,可以降低 SQL 注入的风险.

   #$my_stmt-##

<span style="color: #000000">  代码如下:<br>  </span>
   #$my_stmt-##這句程式碼就是將資料傳遞給資料庫了。

   使用預處理資料查詢資料庫

d7142f12e3aaf4023d724e093ce2bf68connect_error){    
 die("连接失败".$mysqli->error);
}
$mysqli->query("set names utf8");
$sql="select name,sex,age from student_info where id>?";
$mysqli_stmt=$mysqli->prepare($sql);
$id=1;$mysqli_stmt->bind_param("i",$id);
$mysqli_stmt->execute();//绑定结果集,传递的是引用$mysqli_stmt->bind_result($name,$sex,$age);
while($mysqli_stmt->fetch()){    
    echo "$name--$sex--$age"."0c6dc11e160d3b678d68754cc175188a";
}//关闭资源$mysqli_stmt->free_result();//关闭预编译语句,否则数据库会一直保存$mysqli_stmt->close();//关闭连接$mysqli->close();

#rrreee 可以看出,查詢與插入相比多了

這樣一句程式碼,那麼這句程式碼是什麼意思呢?

可以想像,查詢資料庫的時候,資料庫必然會回傳一個結果集,那麼如果你想取得該結果的一些數據,那麼就必須加上這句話。那麼,這些參數又是什麼意思呢?

看看這句sql語句,你會發現bind_result裡面的參數一一對應於sql語句當中你要查詢的欄位(name,sex,age),當然,bind_result裡面的參數可以不與sql語句的欄位名字相同,但是我們通常會建議這樣做。

多的不說,上圖:

可以這樣理解:$name,$sex,$age是引用傳遞,他們相當於指針,分別指向結果集的第一行的列位址,每執行一次while語句,指標便向下移動

#這樣,便可以列印出每一行的資料了,結果如下:

同時,那三個關閉別忘了,重中之重。 ###

以上是關於mysql預處理技術的小技巧的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn