php操作MySQL資料庫的方法和解析
對於許多web應用程式而言,資料庫都是其核心所在。資料庫幾乎可以用來儲存所有你想要檢索和更新的任何資訊
下面介紹兩種資料庫的訪問方式:
①. MySQLi 訪問MySQLi (面向物件)資料庫,其中MYSQLi又分為 面向物件 和 面向過程兩種形式
②. PDO訪問MYSQL資料庫
MySQLi 和 PDO那個更好???
MySQLi 和 PDO 各有優勢
1.MySQLi只針對MySQL資料庫,PDO支援12種資料庫
2.兩者都是面向物件, 但 MySQLi 還提供了 API 介面
3.兩者都支援預處理語句。 預處理語句可以防止 SQL 注入,對於 web 專案的安全性是非常重要的。
下面例項來展示一下它們的不同之處:
先建立資料庫和表
create database regist; use database CREATE TABLE `user` ( `name` varchar(255) NOT NULL, `pass` varchar(255) NOT NULL, PRIMARY KEY (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
定義資料庫連線所需的引數
<meta charset="utf-8"> <?php $dbtype="mysql";//使用的資料庫型別 $servername="localhost";//資料庫伺服器主機名 $user="root";//資料庫連線使用者名稱 $pass="root";//資料庫連線密碼 $dbname="regist";//選用的資料庫名 ?>
1.MySQLi (面向物件) 連線
<?php //連線時指定資料庫名 //$conn=new mysqli($servername,$user,$pass,$dbname); //連線時不指定資料庫名 $conn=new mysqli($servername,$user,$pass); if(!$conn){ die("資料庫連線失敗" . mysqli_connect_error()); }else{ //彈出訊息提示框 echo "<script>alert('資料庫連線成功')</script>"; } //注:執行query()方法返回的是一個Statement物件,表示執行成功或執行失敗 //設定資料庫輸出為utf8編碼 // mysqli_query($conn,"set names 'utf8'"); $conn->query("set names 'utf8'"); //選擇資料庫 $conn->select_db($dbname); //增加 $sql="insert into user(name,pass) values('aa','1234')"; // $stmt=mysqli_query($conn,$sql); $stmt=$conn->query($sql); if($stmt){ echo "插入成功"."<br>"; } //修改 $sql="update user set pass='123456' where name='aa'"; // $stmt=mysqli_query($conn,$sql); $stmt=$conn->query($sql); if($stmt){ echo "修改成功"."<br>"; } //查詢 $sql="select*from user"; // $stmt=mysqli_query($conn,$sql); $result=$conn->query($sql); if($result->num_rows>0){ while($row=$result->fetch_assoc()){ echo "查詢結果:"."name: " . $row["name"]. ", pass: " . $row["pass"]."<br>"; } } echo "結果集行數為:".$result->num_rows."<br>"; //刪除 $sql="delete from user where name='aa'"; // $stmt=mysqli_query($conn,$sql); $stmt=$conn->query($sql); if($stmt){ echo "刪除成功"."<br>"; } //關閉資料庫 // mysqli_close($conn); $conn->close(); echo "已關閉!!"; ?> 瀏覽器顯示結果: 插入成功 修改成功 查詢結果:name: aa, pass: 123456 結果集行數為:1 刪除成功 已關閉!!
2.MySQLi (面向過程) 連線
<?php //連線時指定資料庫名 //$conn=mysqli_connect($servername,$user,$pass,$dbname); //連線時不指定資料庫名 $conn=mysqli_connect($servername,$user,$pass); if(!$conn){ die("資料庫連線失敗" . mysqli_connect_error()); }else{ //彈出訊息提示框 echo "<script>alert('資料庫連線成功')</script>"; } //執行query()方法返回的是一個Statement物件,表示執行成功或執行失敗 //設定資料庫輸出為utf8編碼 mysqli_query($conn,"set names 'utf8'"); // $conn->query("set names 'utf8'"); //選擇資料庫 $conn->select_db($dbname); //增加 $sql="insert into user(name,pass) values('aa','1234')"; $stmt=mysqli_query($conn,$sql); // $stmt=$conn->query($sql); if($stmt){ echo "插入成功"."<br>"; } //修改 $sql="update user set pass='123456' where name='aa'"; $stmt=mysqli_query($conn,$sql); // $stmt=$conn->query($sql); if($stmt){ echo "修改成功"."<br>"; } //查詢 $sql="select*from user"; $result=mysqli_query($conn,$sql); // $result=$conn->query($sql); //判斷結果集行數是否大於0 if($result->num_rows>0){ //檢索結果集的下一行,將檢索的結果放到關聯陣列中,並通過while()迴圈輸出結果集 while($row=$result->fetch_assoc()){ echo "查詢結果:"."name: " . $row["name"]. ", pass: " . $row["pass"]."<br>"; } } echo "結果集行數為:".$result->num_rows."<br>"; //刪除 $sql="delete from user where name='aa'"; $stmt=mysqli_query($conn,$sql); // $stmt=$conn->query($sql); if($stmt){ echo "刪除成功"."<br>"; } //關閉資料庫 mysqli_close($conn); // $conn->close(); echo "已關閉!!"; ?> 瀏覽器顯示結果: 插入成功 修改成功 查詢結果:name: aa, pass: 123456 結果集行數為:1 刪除成功 已關閉!!
3.PDO連線
<?php try{ //這裡注意: 等號兩邊不能存在空格,不然會報錯,如:dbname = $dbname這樣寫就會報錯 $conn=new PDO("$dbtype:host=$servername;dbname=$dbname",$user,$pass); //彈出訊息提示框 echo "<script>alert('資料庫連線成功')</script>"; //注:執行exec()方法PDOStatement物件,表示執行成功或執行失敗 //設定資料庫輸出為utf8編碼 $conn->exec("set names 'utf8'"); //增加 $sql="insert into user(name,pass) values('aa','1234')"; $stmt=$conn->exec($sql); if($stmt){ echo "插入成功!"."<br>"; } //修改 $sql="update user set pass='123456' where name='aa'"; $stmt=$conn->exec($sql); if($stmt){ echo "修改成功!"."<br>"; } //查詢 $sql="select*from user"; $result=$conn->query($sql); if($result->rowCount()>0){ while($row=$result->fetch()){ echo "查詢結果:"."name: " . $row["name"]. ", pass: " . $row["pass"]."<br>"; } } echo "結果集行數為:".$result->rowCount()."<br>"; //刪除 $sql="delete from user where name='aa'"; $stmt=$conn->exec($sql); if($stmt){ echo "刪除成功!"."<br>"; } //關閉資料庫 $stmt=$conn = null; if($stmt){ echo "已關閉!"."<br>"; } }catch(PDOException $e){ print "error!".$e->getMeddage(); } ?> 瀏覽器顯示結果: 插入成功 修改成功 查詢結果:name: aa, pass: 123456 結果集行數為:1 刪除成功 已關閉!
MySQLi和PDO在連線資料庫上的不同
一.
①.MySQLi僅針對MYSQL資料庫,所以在連線資料庫時無需指定資料庫型別(就一種資料庫,哪還有什麼型別可選,直接就預設為MySQL啦!)
②.PDO支援多種資料庫的訪問,所以在連線資料庫時必須指定資料庫型別,不然會報錯(PDO可以訪問那麼多種資料庫,你不指定鬼知道你要訪問哪種型別的資料庫呀!)
二.
①.MySQLi連線資料庫時,可以指定資料庫名,也可以不指定資料庫名
②.PDO連線資料庫時,必須指定資料庫名,不然會報錯
MySQLi面向物件和麵向過程方式的異同
一.
MySQLi面向物件:$conn=new mysqli($servername,$user,$pass); MySQLi面向過程:$conn=mysqli_connect($servername,$user,$pass);
我也剛開始學PHP訪問資料庫,所以我除了它們的連線上有明顯區別之外,還沒發現MySQLi面向物件 和 MySQLi面向過程的其他不同之處!!!
剛開始的時候,我發現別人在 使用MySQLi面向物件方式連線資料庫時,都是使用$conn->query($sql)來執行sql語句的; 使用$conn->close()來關閉資料庫。 使用MySQLi面向過程方式連線資料庫時,都是用mysqli_query($conn,$sql)來執行sql語句的; 使用mysqli_close($conn)來關閉資料庫。 但是在嘗試上面的例項時,我發現 不管是MySQLi面向物件還是MySQLi面向過程都可以使用$conn->query($sql)或mysqli_query($conn,$sql)來執行sql語句; 使用$conn->close()或mysqli_close($conn)來關閉資料庫
一直以來都以為$conn->query($sql)
是MySQLi面向物件專用的,mysqli_close($conn)
是MySQLi面向過程專用的,沒想到不是!
我想了解這其中的區別?希望有那位瞭解的大佬能告訴我,謝謝!
PDO執行sql語句所用方法解析
一.
①.當執行insert,update,delete等沒有返回結果集的查詢時,用PDO物件中的exec()方法來執行,執行成功後會返回受影響的行數
注意:exec()方法不能用於執行select查詢,因為執行select查詢會返回結果集
如: $sql="update user set pass='123456' where name='aa'"; $stmt=$conn->exec($sql); print_r($stmt); 瀏覽器顯示: PDOStatement Object ( [queryString] => update user set pass='123456' where name='aa' )
二.
①. 當執行返回結果集的select查詢,則使用PDO物件中的query()方法來執行;
該方法成功執行後,會返回一個結果集,並且可以通過PDOStatement物件中的rowCount()方法來獲取返回結果集的行數
如: $sql="select*from user"; $result=$conn->query($sql); if($result->rowCount()>0){ while($row=$result->fetch()){ echo "查詢結果:"."name: " . $row["name"]. ", pass: " . $row["pass"]."<br>"; } } echo "結果集行數為:".$result->rowCount()."<br>"; 瀏覽器顯示: 查詢結果:name: aa, pass: 123456 結果集行數為:1
②. MYSQLi訪問資料庫時,可以通過num_rows來獲取返回結果集的行數
如: $sql="select*from user"; $result=$conn->query($sql); //判斷結果集行數是否大於0 if($result->num_rows>0){ //檢索結果集的下一行,將檢索的結果放到關聯陣列中,並通過while()迴圈輸出結果集 while($row=$result->fetch_assoc()){ echo "查詢結果:"."name: " . $row["name"]. ", pass: " . $row["pass"]."<br>"; } } echo "結果集行數為:".$result->num_rows."<br>";
三.
①. execute()用於執行prepare預處理語句。
在執行prepare預處理語句時,可以使用bindParam()方法來繫結引數,並對引數進行編碼,然後給execute()執行。
也可以在執行execute()方法繫結引數
②.1.MySQLi 執行prepare()預處理語句時,使用bind_param()方法來繫結引數
如: //預處理sql語句 $stmt=$conn->prepare("insert into user(username,password) values(?,?)"); //使用bind_param()方法繫結引數 $stmt->bind_param("ss",$username,$password); //(編輯引數)為繫結的引數賦值 $username='馬雲'; $password='123456'; //執行 $stmt->execute();
2.PDO執行prepare()預處理語句時,使用bindParam()方法來繫結資料庫
//預處理sql語句 $stmt=$conn->prepare("insert into user(name,pass) values(:name,:pass)"); //使用bind_param()函式繫結引數 $stmt->bindParam(':name',$name); $stmt->bindParam(':pass',$pass); //(編輯引數)為繫結的引數賦值 $name='王健林'; $pass='1234ab'; //執行 $result=$stmt->execute();
3.直接在執行execute()方法時繫結引數
如: //預處理sql語句 $stmt=$dbh->prepare("select * from user where name=?"); ////執行execute()方法返回的是一個Statement物件,表示執行成功或執行失敗 if($stmt->execute(['馬雲'])){ //使用fetch()獲取結果集並放到關聯陣列中 while($row=$stmt->fetch()){ echo $row['name']."<br>"; } echo "行數為:".$count=$stmt->rowcount()."<br>"; }
PDO獲取結果集的方法
①. 獲取結果集的的方法。fetch() ,fetchAll() , . . .
1.fetch()
fetch()用於獲取結果集的下一行,一次檢索一行,然後將獲取的資料放到關聯的陣列中。
2.fetchAll()
fetchAll()方法用於獲取結果集中的所有行,其返回值是一個包含結果集中所有資料的二進位制陣列。
②.結果集的返回方式
眾所周知,我們平時獲取陣列的值時,一般都是通過數字索引或者是其字串鍵來獲取的
fetch()方法返回結果集的方式是由其引數控制,
引數為為PDO::FETCH_ASSOC,即通過列名作為陣列索引來獲取
引數為PDO::FETCH_NUM時,通過列號作為索引來獲取
引數為PDO::FETCH_BOTH時,即可通過列名來獲取也可通過列號來獲取,不寫引數時,預設為PDO::FETCH_BOTH
引數為PDO::FETCH_BOTH時
如: //預處理sql語句 $stmt=$conn->prepare("select*from user"); //執行execute()函式返回的是一個PDOStatement物件,表示執行成功或失敗 $result=$stmt->execute(); if($result){ //fetch()方法用於獲取結果集的下一行,並放入到關聯陣列,通過while()迴圈輸出結果集 while($row=$stmt->fetch()){ // echo $row['name'].", " .$row['pass']."<br>"; echo $row['0'].", " .$row['1']."<br>"; } //輸出結果集中的行數 echo "行數為:".$count=$stmt->rowcount()."<br>"; 不寫引數時預設為PDO::FETCH_BOTH, 此時可通過列名$row['name']來獲取結果集, 也可通過列號$row['0']來獲取結果集
引數為PDO::FETCH_ASSOC
如: //預處理sql語句 $stmt=$conn->prepare("select*from user"); //執行execute()函式返回的是一個PDOStatement物件,表示執行成功或失敗 $result=$stmt->execute(); if($result){ //fetch()方法用於獲取結果集的下一行,並放入到關聯陣列,通過while()迴圈輸出結果集 while($row=$stmt->fetch(PDO::FETCH_ASSOC)){ echo $row['name'].", " .$row['pass']."<br>"; } //輸出結果集中的行數 echo "行數為:".$count=$stmt->rowcount()."<br>"; 引數為PDO::FETCH_ASSOC時,僅可以通過列名$row['name']來獲取結果集, 不可以通過列號$row['0']來獲取結果集
引數為PDO::FETCH_NUM
如: //預處理sql語句 $stmt=$conn->prepare("select*from user"); //執行execute()函式返回的是一個PDOStatement物件,表示執行成功或失敗 $result=$stmt->execute(); if($result){ //fetch()方法用於獲取結果集的下一行,並放入到關聯陣列,通過while()迴圈輸出結果集 while($row=$stmt->fetch(PDO::FETCH_NUM)){ echo $row['0'].", " .$row['1']."<br>"; } //輸出結果集中的行數 echo "行數為:".$count=$stmt->rowcount()."<br>"; 引數為PDO::FETCH_NUM時,僅可以通過列號$row['0']來獲取結果集, 不可以通過列名$row['name']來獲取結果集
參考資料
http://www.runoob.com/php/php-mysql-connect.html
http://blog.okbase.net/phpchina/archive/731.html
https://blog.csdn.net/sck0088/article/details/45674193
https://www.cnblogs.com/dee0912/p/4093014.html
https://www.jb51.net/article/105797.htm