PHP操作數據庫詳細(PDO)


    PHP 5.1 發布時將附帶一個全新的數據庫連接層,即 PHP Data Objects (PDO)。雖然 PHP 一直都擁有很好的數據庫連接,但 PDO 讓 PHP的數據庫操作 達到一個新的高度。PDO可支持基本的MySQL、Microsoft SQL Server、Oracle等數據庫,並且提供了統一的操作方法,高度集成了數據庫操作。PDO的使用較好的解決項目開發過程中可能存在的數據庫更換問題。

   PDO對數據庫的操作方法如增刪改查,進行了統一整合,但對原始的數據庫語句存在的差異,並不能完美的解決,比如MySQL的 limit 來查詢第 m 行到第 n 行的記錄使用 (select * from 表名 limit m, n),而Microsoft SQL Server則需要使用top命令的組合等。

   此外,使用PDO的預處理函數prepare(),能很好的解決SQL注入問題。

 

支持的數據庫集合:

 

打開/連接數據庫:

 1 <?php
 2 //error_reporting("E_ALL & ~ E_NOTICE");
 3     echo '<meta charset="utf-8">';//解決亂碼問題
 4     $conn=false;
 5 //地址
 6     $db_server = 'localhost';
 7 //端口
 8     $db_port = '3306';
 9 //數據庫
10     $db_name = 'dbdong';
11 //用戶
12     $db_user = 'root';
13 //密碼
14     $db_password = 'root';
15 //連接的dsn,每個數據庫都存在差異
16     $dsn = "mysql:host=$db_server;port=$db_port;dbname=$db_name";
17     try {
18         //連接數據庫 參數四(持久連接):array(PDO::ATTR_PERSISTENT => true)
19         $conn = new PDO($dsn, $db_user, $db_password);
20         //設置字符集
21         $conn->query("set names utf8");
22         
23         echo "連接數據庫成功";
24 
25     } catch (PDOException $ex) {
26         exit("不能連接數據庫".$ex);
27     }

補充:

1 echo $conn->getAttribute(PDO::ATTR_SERVER_VERSION);//服務器數據庫版本
2 echo $conn->getAttribute(PDO::ATTR_CLIENT_VERSION);//客戶端數據庫版本

 

 

設置數據庫操作時錯誤模式:

 1 /*
 2 PDO::ATTR_ERRMODE:錯誤報告。 
 3 
 4 1. PDO::ERRMODE_SILENT: 僅設置錯誤代碼。
 5 
 6 2. PDO::ERRMODE_WARNING: 引發 E_WARNING(警告) 錯誤
 7 
 8 3. PDO::ERRMODE_EXCEPTION: 拋出 exceptions 異常。catch (PDOException $ex)捕獲
 9 
10 */
11 //獲取到當前設置的錯誤模式 
12 echo $conn->getAttribute(PDO::ATTR_ERRMODE);
13 //設置為警告模式,如果出現數據庫操作問題,會產生警告,推薦
14 $conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
15 //任意測試
16 $conn->exec("delete from xxx");

 

數據庫操作:

1、exec(“標准sql語句“) 用來處理非結果集的

//如insert、update、delete、create,返回為影響行數

2、query(“標准sql語句“,模式取值) 可用來處理所有語句

//返回結果集(select,desc),返回空(insert、updata……)

獲取結果的模式:

1 //查詢並全部輸出小例子
2 $xx=$conn->query("select * from c",PDO::FETCH_ASSOC);
3 //一行一行拿數據
4 while($rowx=$xx->fetch()){
5     //輸出
6     print_r($rowx);
7 }

 

 事物處理:

開始事物->提交事物

 1 //設置錯誤模式為拋出異常
 2 $conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
 3 //開始事務
 4 $conn->beginTransaction();
 5 try{
 6     $con=$conn->exec("update c set CN='222222'");
 7     $con=$conn->exec("update c sext PCNO='222222222222'");
 8     if($con<=0){
 9         //拋出異常
10         throw new PDOException("哇,我自己拋出異常");
11     }
12     //提交事務
13     $conn->commit();
14     
15 }catch(PDOException $ee){
16     echo "-----------------------".$ee;
17     //事務內部異常,操作全部撤銷
18     $conn->rollBack();
19 }

 

 

預處理:

更新實現列子

 1 //設置錯誤模式為拋出異常
 2 $conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
 3 
 4 try{
 5     //預處理SQL語句
 6     //?號占位符,必須從1下標開始
 7     //CNO=:name1 ,綁定參數時bindParam(":name1",$valuex);,名字不可相同
 8     $res=$conn->prepare("update c set CN='dongxiaodong1' where CNO=?");
 9     
10     //執行第一次
11     //綁定參數1,參數是引用,所以需要是變量
12     //參數三,確定類型:PDO::PARAM_INT,PDO::PARAM_STR等
13     $valuex="C1";
14     $res->bindParam(1,$valuex);
15     //執行處理1
16     $res->execute();
17     //若兩次值相同,則影響行數為0
18     echo "影響的行數:".$res->rowCount();
19     
20     //執行第二次
21     $valuex="C3";
22     $res->bindParam(1,$valuex);
23     $res->execute();
24     
25     //執行第三次
26     $res->execute(array("C4"));
27     
28 }catch(PDOException $ee){
29     echo "!!!!!!!!".$ee;
30     
31 }

 

查詢實現列子

 1 //設置錯誤模式為拋出異常
 2 $conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
 3 
 4 try{
 5     
 6     //預處理SQL語句
 7     //?號占位符,必須從1下標開始
 8     //CNO=:name1 ,綁定參數時bindParam(":name1",$valuex);,名字不可相同
 9     $res=$conn->prepare("select *from c where CN=:nam");
10     
11     //設置全局fetch獲取數據模式,模式參考上表,范圍$res以下
12     //$res->setFetchMode(PDO::FETCH_NUM);
13     
14     $res->execute(array("nam"=>"dongxiaodong"));
15     
16     echo "查詢到的總行數為:".$res->rowCount();
17     
18     //獲取單行:fetch(參數1),參數1可以更改返回模式,參考上面的模式表格
19     //獲取全部:fetchall(參數1)
20     print_r($res->fetchall(PDO::FETCH_NUM));
21     
22 }catch(PDOException $ee){
23     echo "!!!!!!!!!".$ee;
24     
25 }

 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM