PHP系列(十二)資料庫抽象層pdo
1、資料庫抽象層pdo
(1)、PDO(php data object)擴充套件類庫為php訪問資料庫定義了輕量級的、一致性的介面它可以支援mysql,postgresql,oracle,mssql等多種資料庫
(2). PDO的安裝
編輯php.ini檔案:
– extension=php_pdo.dll
– extension=php_pdo_mysql.dll
重啟apache服務:
– httpd –k restart
開啟phpinfo.php檢視是否有pdo
2、建立pdo物件
Oracle庫
/*連線如果失敗,使用異常處理模式進行捕獲 */
try{
$dbh = newPDO(“OCI:dbname=accounts;charset=UTF-8”, “scott”,”tiger”);
}catch(PDOException$e) {
echo “資料庫連線失敗: ” .$e->getMessage();
}
Mysql庫
$dsn =`mysql:dbname=testdb;host=127.0.0.1`; //連線MySQL資料庫的DSN
$user = `dbuser`;//MySQL資料庫的使用者名稱
$password =`dbpass`; //MySQL資料庫的密碼
try {
$dbh = newPDO($dsn, $user, $password);
} catch(PDOException $e) {
echo `資料庫連線失敗: ` . $e->getMessage();
}
Php.ini配置檔案中[pdo]下在加入下面文字
Pdo.dsn.ssw=”mysql:host=localhosot;dbname=malldb”;
try {
$dbh = new PDO(ssw,root, sswqzx);
} catch(PDOException $e) {
echo `資料庫連線失敗: ` . $e->getMessage();
}
//設定持久連線的選項陣列作為最後一個引數,可以一起設定多個元素
$opt =array(PDO::ATTR_PERSISTENT => true);
try {
$db = newPDO(`mysql:host=localhost;dbname=test`,`dbuser`,`passwrod`,$opt);
} catch(PDOException $e) {
echo “資料庫連線失敗: ” .$e->getMessage();
}
3、PDO與連線有關的選項
try {
$pdo=new PDO(“mysql:host=localhost;dbname=malldb”,”root”,”123456″,array(PDO::ATTR_AUTOCOMMIT=>false,PDO::ATTR_PERSISTENT=>1 ));
}catch(PDOException $e) {
echo “資料庫連線失敗:“.$e->getMessage();
exit;
}
//var_dump($pdo);
// $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,false);
echo “<br>PDO是否關閉自動提交功能:“.$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
echo “<br>當前PDO的錯誤處理的模式:“. $pdo->getAttribute(PDO::ATTR_ERRMODE);
echo “<br>表欄位字元的大小寫轉換: “.$pdo->getAttribute(PDO::ATTR_CASE);
echo “<br>與連線狀態相關特有資訊: “.$pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS);
echo “<br>空字串轉換為SQL的null:“. $pdo->getAttribute(PDO::ATTR_ORACLE_NULLS);
echo “<br>應用程式提前獲取資料大小:“.$pdo->getAttribute(PDO::ATTR_PERSISTENT);
echo “<br>與資料庫特有的伺服器資訊:“.$pdo->getAttribute(PDO::ATTR_SERVER_INFO);
echo “<br>資料庫伺服器版本號資訊:“.$pdo->getAttribute(PDO::ATTR_SERVER_VERSION);
echo “<br>資料庫客戶端版本號資訊:“.$pdo->getAttribute(PDO::ATTR_CLIENT_VERSION);
4、PDO的錯誤處理模式
/*
setAttribute();
PDO::ATTR_ERRMODE;
1、預設的錯誤模式(不提示、我們看到問題、被忽視)
2、警告模式:PDO::ERRMODE_WARNING
3、異常的模式:PDO::ERRMODE_EXCEPTION
*/
try(
//建立物件
$pdo = newPDO(“mysql:host=localhost;dbname=malldb”,”root”,”sswqzx”);
//設定錯誤使用異常的模式
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
)catch(PDOException $e){
echo”資料庫連結失敗“.$e->getMessage();
exit;
}
try(
//使用PDO中的方法執行語句
$affected_rows = $pdo ->exec(“delete from hello”);
)catch(PDOException $e){
echo “錯誤“.$e->getMessage();
}
5、使用PDO執行SQL語句
程式碼1:
/*
PDO中執行SQL語句的方法有二個主要的:
1、exec() 用來處理非結果集的: insert updatedelete create ….
返回影響的函式
2、query() 用來處理有結果集的語句: select descshow
set naees utf8;
$pdo -> query(“set namesutf8”);
$pdo -> exec(“set namesutf8”);
*/
try{
//建立物件
$pdo = new PDO(“mysql:host=localhost;dbname=malldb”,”root”,”sswqzx”);
//設定錯誤使用異常的模式
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
echo”資料庫連結失敗“.$e->getMessage();
exit;
}
try{
//使用PDO中的方法執行語句
$affected_rows = $pdo ->exec(“insert into user(name,pass,sex,age,email)values(`aa`,`bb`,`cc`,`20`,`ee@qq.com`)”);
echo $affected_rows.”<br>”;
echo $pdo->lastinsertid();
}catch(PDOException $e){
echo “錯誤“.$e->getMessage();
}
程式碼2:
<?php
try{
$dbh = newPDO(`mysql:dbname=testdb;host=localhost`, `mysql_user`, `mysql_pwd`);
}catch(PDOException$e){
exit(`資料庫連線失敗:`.$e->getMessage());
}
$query = “UPDATE contactInfo SET phone=‘15801680168’ where name=‘高某某’”;
//使用exec()方法可以執行INSERT、UPDATE和DELETE等
$affected =$dbh->exec($query);
if($affected){
echo `資料表contactInfo中受影響的行數為:`.$affected;
}else{
print_r($dbh->errorInfo());
}
程式碼3:
<?php
$dbh = newPDO(`mysql:dbname=testdb;host=localhost`, `mysql_user`, `mysql_pwd`);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$query =
“SELECT name,phone, email FROM contactInfo WHERE departmentId=`D01`”;
try {
//執行SELECT查詢,並返回PDOstatement物件
$pdostatement =$dbh->query($query);
echo “一共從表中獲取到“.$pdostatement->rowCount().”條記錄:
“;
foreach($pdostatement as $row) {//從PDOstatement物件中遍歷結果
echo $row[`name`] .” “; //輸出從表中獲取到的聯絡人的名字
echo $row[`phone`]. ” “; //輸出從表中獲取到的聯絡人的電話
echo $row[`email`]. ”
“;//輸出從表中獲取到的聯絡人的電子郵件
}
} catch(PDOException $e) {
echo$e->getMessage();
}
6、PDO事務處理
MySQL的事務處理
事務:將多條sql操作(增刪改)作為一個操作單元,要
麼都成功,要麼都失敗。
MySQL對事務的支援:
–被操作的表必須是innoDB型別的表(支援事務)
– MySQL常用的表型別:MyISAM(非事務)增刪改速度快、
InnodB(事務型)安全性高
–更改表的型別為innoDB型別
mysql> altertable stu engine=innodb;
Query OK, 29 rowsaffected (0.34 sec)
Records: 29Duplicates: 0 Warnings: 0
mysql> showcreate table stuG; //檢視錶結構
事務處理
Mysql> set autocommit = 0;
mysql>start transaction;
Mysql>commit;
Mysql>roolback;
7、構建事務處理的應用程式
開啟一次事務:
– $pdo->beginTransaction();
提交一次事務:
– $pdo->commit();
回滾一次事務:
– $pdo->rollback();
注意如下設定:
1.$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
2.$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,1);
程式碼:
<?php
/*
* PDO中執行SQL語句的方法有兩個主要的:
*
* 1. exec() 用來處理非結果集的 insert update deletecreate ….
*
* 返回影響的函式
*
* 如果是插入語句可以使用lastinsertid()方法獲取最後自動插入id
*
*
* 2. query() 用來處理有結果集的語句 select desc show
*
* 返回來的是 PDOStatement類的物件,再通過這個類的方法,獲取結果。也可以直接foreach遍歷獲取結果(但不常用)
*
* setnames utf8;
*
* $pdo -> query(“set names utf8”);
* $pdo -> exec(“set names utf8”);
*/
try{
//建立物件
$pdo= new PDO(“mysql:host=localhost;dbname=malldb”, “root”,”123456″);
//設定錯誤使用異常的模式
$pdo-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//關閉自動提交
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);
}catch(PDOException$e) {
echo”資料庫連線失敗:“.$e->getMessage();
exit;
}
try{
//開啟一個事務
$pdo-> beginTransaction();
$price= 50;
//妹子轉出50元
$affected_rows= $pdo-> exec(“update demo set ye=ye-{$price} where id=1”);
if($affected_rows> 0) {
echo”妹子轉出{$price}元成功!<br>”;
}else {
thrownew PDOException(“妹子轉出失敗!<br>”);
}
//張三會收到50元
$affected_rows= $pdo-> exec(“update demo set ye=ye+{$price} where id=3”);
if($affected_rows){
echo”張三收到{$price}元成功!”;
}else{
thrownew PDOException(“張三收入失敗!<br>”);
}
echo”交易成功!<br>”;
//提交以上的操作
$pdo->commit();
}catch(PDOException$e) {
echo”錯誤:“.$e->getMessage();
echo”交易失敗!<br>”;
//撤銷所有操作
$pdo-> rollback();
}
//執行完成以後, 最後開啟自動提交
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);
8、使用PDO準備語句並執行語句
得到pdo預處理物件的方法:
$sql=“select * from user order by id”;
$sth=$pdo->prepare($sql);
以上程式碼中的$sth即為預處理物件
在PDO中引數式的SQL語句有兩種(預處理sql):
1.insert intostu(id,name) value(?,?); //?號式(適合引數少的)
2.insert intostu(id,name) value(:id,:name);//別名式(適合引數多的)
程式碼1:
try{
//建立物件
$pdo= new PDO(“mysql:host=localhost;dbname=malldb”, “root”,”123456″);
//設定錯誤使用異常的模式
$pdo-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo-> query(“set names utf8”);
}catch(PDOException$e) {
echo”資料庫連線失敗:“.$e->getMessage();
exit;
}
try{
//給資料庫管理系統並直接執行
//$pdo-> query(“select * from users”);
//只是將這個語句放到伺服器上(資料庫管理系統)上, 編寫後等待,沒有執行
$stmt= $pdo -> prepare(“insert into users(name, pass, age, sex, email)values(?, ?, ?, ?, ?)”);
//繫結引數(?),將問號和一個變數關聯起來
$stmt-> bindParam(1, $name);
$stmt-> bindParam(2, $pass);
$stmt-> bindParam(3, $age);
$stmt-> bindParam(4, $sex);
$stmt-> bindParam(5, $email);
//給變數一個值, 就會給準好的語句中的對應?一個值
$name= “admin”;
$pass= “hello”;
$age= 100;
$sex= “nnn”;
$email= “aaa@bbb.com”;
//執行上面在資料庫系統中準備好的語句
$stmt-> execute();
}catch(PDOException$e) {
echo”錯誤:“.$e->getMessage();
}
程式碼2:
try {
//建立物件
$pdo= new PDO(“mysql:host=localhost;dbname=malldb”, “root”,”123456″);
//設定錯誤使用異常的模式
$pdo-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo-> query(“set names utf8”);
}catch(PDOException$e) {
echo”資料庫連線失敗:“.$e->getMessage();
exit;
}
try{
//給資料庫管理系統並直接執行
//$pdo-> query(“select * from users”);
//只是將這個語句放到伺服器上(資料庫管理系統)上, 編寫後等待,沒有執行
$stmt= $pdo -> prepare(“insert into users(name, pass, age, sex, email)values(:name, :pass, :age, :sex, :email)”);
//繫結引數(?),將問號和一個變數關聯起來
$stmt-> bindParam(“name”, $name, PDO::PARAM_STR);
$stmt-> bindParam(“pass”, $pass, PDO::PARAM_STR);
$stmt-> bindParam(“age”, $age, PDO::PARAM_INT);
$stmt-> bindParam(“sex”, $sex, PDO::PARAM_STR);
$stmt-> bindParam(“email”, $email, PDO::PARAM_STR);
//給變數一個值, 就會給準好的語句中的對應?一個值
$name= “admin1”;
$pass= “hello1”;
$age= 1001;
$sex= “nnn1”;
$email= “aaa@bbb.com1”;
//執行上面在資料庫系統中準備好的語句
$stmt-> execute();
//給變數一個值, 就會給準好的語句中的對應?一個值
$name= “admin2”;
$pass= “hello2”;
$age= 1002;
$sex= “nnn2”;
$email= “aaa@bbb.com2”;
//執行上面在資料庫系統中準備好的語句
$stmt-> execute();
}catch(PDOException$e) {
echo”錯誤:“.$e->getMessage();
}
程式碼3:
try{
//建立物件
$pdo= new PDO(“mysql:host=localhost;dbname=malldb”, “root”,”123456″);
//設定錯誤使用異常的模式
$pdo-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo-> query(“set names utf8”);
}catch(PDOException$e) {
echo”資料庫連線失敗:“.$e->getMessage();
exit;
}
try{
//給資料庫管理系統並直接執行
//$pdo-> query(“select * from users”);
//只是將這個語句放到伺服器上(資料庫管理系統)上, 編寫後等待,沒有執行
// $stmt = $pdo -> prepare(“insert into users(name, pass, age, sex,email) values(:name, :pass, :age, :sex, :email)”);
$stmt = $pdo -> prepare(“insertinto users(name, pass, age, sex, email) values(?, ? ,?, ?, ?)”);
$stmt -> execute(array(“jone”,`123456`, 18, `nv`, `aa@bb.com`));
$stmt -> execute(array(“jone2”,`123456`, 18, `nv`, `aa@bb.com`));
$stmt -> execute(array(“jone22”,`123456`, 18, `nv`, `aa@bb.com`));
}catch(PDOException$e) {
echo”錯誤:“.$e->getMessage();
}
程式碼4:
try{
//建立物件
$pdo= new PDO(“mysql:host=localhost;dbname=malldb”, “root”,”123456″);
//設定錯誤使用異常的模式
$pdo-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo-> query(“set names utf8”);
}catch(PDOException$e) {
echo”資料庫連線失敗:“.$e->getMessage();
exit;
}
try{
//給資料庫管理系統並直接執行
//$pdo-> query(“select * from users”);
//只是將這個語句放到伺服器上(資料庫管理系統)上, 編寫後等待,沒有執行
$stmt = $pdo -> prepare(“insertinto users(name, pass, age, sex, email) values(:name, :pass, :age, :sex,:email)”);
// $stmt = $pdo -> prepare(“insertinto users(name, pass, age, sex, email) values(?, ? ,?, ?, ?)”);
$stmt ->execute(array(“name”=>”feng”,”pass”=>”abc123#”, “age”=>28,”sex”=>”nan”,”email”=>”aaa@bbb.com”));
}catch(PDOException$e) {
echo”錯誤:“.$e->getMessage();
}
程式碼5:
try{
//建立物件
$pdo= new PDO(“mysql:host=localhost;dbname=malldb”, “root”,”123456″);
//設定錯誤使用異常的模式
$pdo-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo-> query(“set names utf8”);
}catch(PDOException$e) {
echo”資料庫連線失敗:“.$e->getMessage();
exit;
}
try{
//給資料庫管理系統並直接執行
//$pdo-> query(“select * from users”);
//只是將這個語句放到伺服器上(資料庫管理系統)上, 編寫後等待,沒有執行
$stmt = $pdo -> prepare(“insertinto users(name, pass, age, sex, email) values(:name, :pass, :age, :sex,:email)”);
// $stmt = $pdo ->prepare(“insert into users(name, pass, age, sex, email) values(?, ? ,?, ?,?)”);
$stmt -> execute($_GET);
}catch(PDOException$e) {
echo”錯誤:“.$e->getMessage();
}
9、PDO的預處理查詢
程式碼1:
try{
//建立物件
$pdo= new PDO(“mysql:host=localhost;dbname=malldb”, “root”,”123456″);
//設定錯誤使用異常的模式
$pdo-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo-> query(“set names utf8”);
}catch(PDOException$e) {
echo”資料庫連線失敗:“.$e->getMessage();
exit;
}
try{
$stmt= $pdo -> prepare(“select id, name, age, sex, email from users where id> ? and id < ?”);
$stmt-> execute(array(500, 800));
foreach($stmtas $row) {
print_r($row);
echo`<br>`;
}
//mysql_fetch_array() mysql_fetch_rows mysql_fetch_array()
/*
echo`<table border=”1″ width=800>`;
while(list($id,$name, $age, $sex, $email) = $stmt -> fetch(PDO::FETCH_NUM)) {
echo`<tr>`;
echo`<td>`.$id.`</td>`;
echo`<td>`.$name.`</td>`;
echo`<td>`.$age.`</td>`;
echo`<td>`.$sex.`</td>`;
echo`<td>`.$email.`</td>`;
echo`</tr>`;
}
echo`</table>`;
*/
}catch(PDOException$e) {
echo”錯誤:“.$e->getMessage();
}
程式碼2:
try {
//建立物件
$pdo = newPDO(“mysql:host=localhost;dbname=malldb”, “root”,”123456″);
//設定錯誤使用異常的模式
$pdo-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo-> query(“set names utf8”);
}catch(PDOException$e) {
echo”資料庫連線失敗:“.$e->getMessage();
exit;
}
try{
$stmt= $pdo -> prepare(“select id, name, age, sex, email from users where id> ? and id < ?”);
$stmt-> execute(array(500, 800));
//可以設定結果的模式, 以下的程式碼使用fetch()或fetchAll()都是使用這個方面設定的陣列的格式
$stmt-> setFetchMode(PDO::FETCH_NUM);
echo`<pre>`;
print_r($stmt->fetchAll());
echo`</pre>`;
//mysql_fetch_array() mysql_fetch_rows mysql_fetch_array()
/*
echo`<table border=”1″ width=800>`;
while(list($id,$name, $age, $sex, $email) = $stmt -> fetch(PDO::FETCH_NUM)) {
echo`<tr>`;
echo`<td>`.$id.`</td>`;
echo`<td>`.$name.`</td>`;
echo`<td>`.$age.`</td>`;
echo`<td>`.$sex.`</td>`;
echo`<td>`.$email.`</td>`;
echo`</tr>`;
}
echo`</table>`;
*/
}catch(PDOException$e) {
echo”錯誤:“.$e->getMessage();
}
程式碼:
try{
//建立物件
$pdo= new PDO(“mysql:host=localhost;dbname=malldb”, “root”,”123456″);
//設定錯誤使用異常的模式
$pdo-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo-> query(“set names utf8”);
}catch(PDOException$e) {
echo”資料庫連線失敗:“.$e->getMessage();
exit;
}
try{
$stmt= $pdo -> prepare(“insert into users(name, pass, age, sex,email)values(?, ? ,? ,? ,?)”);
$stmt-> execute(array(`111`, `222`, 333, `444`, `555`));
//獲取資料結果中的行數, 或如果是影響函式的語句執行則獲取的是影響行數
echo$stmt->rowCount();
echo`<br>`;
//如何獲取最後一個自動增漲的ID呢?
echo$pdo -> lastInsertId();
}catch(PDOException$e) {
echo”錯誤:“.$e->getMessage();
}
相關文章
- No-PDO-Models-MySQL資料庫層抽象類 – 實現MySql資料庫抽象
- PHP 資料庫擴充之 PDOPHP資料庫
- 教你如何用php pdo連線資料庫PHP資料庫
- PHP 遠端使用 PDO 連線 access 資料庫PHP資料庫
- PHP系列(十一)PHP操作mysql(i)資料庫PHPMySql資料庫
- 使用Chatgpt編寫的PHP資料庫pdo操作類(增刪改查)ChatGPTPHP資料庫
- mysql資料庫查詢pdo的用法MySql資料庫
- PHP的PDOPHP
- Spring系列之不同資料庫異常如何抽象的?Spring資料庫抽象
- pdo_mysql 資料庫亂碼問題MySql資料庫
- PHP PDO 簡單教程PHP
- PDO--PHP Data ObjectsPHPObject
- Spring系列之JDBC對不同資料庫異常如何抽象的?SpringJDBC資料庫抽象
- PDO操作大資料物件大資料物件
- php5模組pdo、pdo_mysql、mysqli的新增PHPMySql
- 資料庫索引層級資料庫索引
- PHP物件導向07_PDOPHP物件
- PHP PDO獲取結果集PHP
- PHP PDO 簡單登陸操作PHP
- 抽象層書單抽象
- 面試資料系列(2): 資料庫面試資料庫
- FastAPI 學習之路(三十二)建立資料庫ASTAPI資料庫
- PHP資料寫入MySql資料庫PHPMySql資料庫
- 資料庫訪問抽象類實現專案資料庫靈活切換資料庫抽象
- php連結資料庫PHP資料庫
- PHP操作MySQL資料庫PHPMySql資料庫
- 硬體抽象層:HAL抽象
- 新版本一定要用PDO才能連線資料庫了嗎?資料庫
- PHP系列(十)GD庫PHP
- (轉)PHP連線資料庫之PHP連線MYSQL資料庫程式碼PHP資料庫MySql
- Django筆記二十二之多資料庫操作Django筆記資料庫
- PHP Oracle 資料庫函式庫(轉)PHPOracle資料庫函式
- 自寫的使用PDO對mysql資料庫的增刪改查操作類MySql資料庫
- PHP中CakePHP新增資料庫PHP資料庫
- PHP 連線access資料庫PHP資料庫
- PHP--資料庫基本操作PHP資料庫
- PHP連線MySql資料庫PHPMySql資料庫
- PHP筆記--資料庫操作PHP筆記資料庫