PHP操作資料庫詳細(PDO)
阿新 • • 發佈:2018-12-07
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 }