MySQL PDO物件:如何用php操作不同的資料庫
阿新 • • 發佈:2018-12-09
1. singleton
目的:為了在全域性獲取這個類的物件時總是能獲取到唯一的物件
class DBConnectionSingleton{ private static $con = null; //通過私有+靜態宣告單例物件 //function __construct(){} public static function getcon(){ if(!self::$con){ //通過靜態執行一次的特點保證物件唯一性 //非假=真。當self::$con==null時 self::$con = new self(); } return self::$con; } } $con1 = DBConnectionSingleton::getcon(); $con2 = DBConnectionSingleton::getcon();chang'lian
2. PDO與DB:pdo可以作為工具管理不同的資料庫
PDO即PHP資料物件 (PHP Data Object)
語法:$pdo = new PDO("DB名:host=主機名;dbname=DB名","DB賬號","DB密碼");
固定格式:
try{
$pdo = new PDO("mysql:host=localhost;dbname=frankdb","root","");
}catch(PDOException $e){
echo "錯誤";
echo $e->getMessage();
}
3. singleton獲取PDO
目的:同一時刻,只有唯一一個人通過pdo操作資料庫
class PDOSingleton{ private static $pdo = null; function __construct(){ if(!self::$pdo){ try{ $pdo = new PDO("mysql:host=localhost;dbname=frankdb","root",""); }catch(PDOException $e){ echo $e->getMessage(); } } return self::$pdo; } //提供單例方法以獲得全域性唯一的單例物件 public static function getpdo(){ if(!self::$pdo){ try{ $pdo = new PDO("mysql:host=localhost;dbname=frankdb","root",""); }catch(PDOException $e){ echo $e->getMessage(); } } return self::$pdo; } }
注意:singleton獲取PDO的php檔案可以單獨寫出來,然後用require_once
呼叫
4. PDO實現DB增刪改查
require_once 'singletonPDO.php';
$pdo=singletonPDO::getPdo(); //通過單例方法獲取全域性pdo單例物件
$pdo->exec('set names utf8'); //編碼格式,exec()方法是pdo物件的執行方法,
相當於php中的query()方法.
//pdo增刪改語句
$sql ="insert into userinfolist values ('xiaoming','666')";
$sql="delete from userinfolist where userName='xiaoming'";
$sql="update userinfolist set userName='frank',password='456789' where userName='franky' ";
if ($pdo->exec($sql)){
echo '操作成功';
}else{
echo '操作失敗';
}
5. PDO異常處理Exception:解決bug
echo "<pre>";
//第一類異常,連線異常
//這種異常直接通過try catch捕獲
try{
$pdo=new PDO('mysql:host=localhost;dbname=day2db','root','');
// 第二類異常,第二種處理方法
// 設定當資料庫操作發生異常的時候,彈出警報,但程式執行不會中斷
//$pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
// 第二類異常,第三種處理方法
// 設定當資料庫操作發生異常的時候,進行中斷
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch (PDOException $err){
echo 'db連線失敗,原因是'.$err->getMessage();
}
$pdo->exec('set names utf8');
$sql="update userinfolist set userName='frank',password='11111' where userName='frank'";
if ($pdo->exec($sql)){
echo '操作成功';
}else{
//第二類異常:資料庫操作異常
//第一種處理辦法:直接通過系統提供的errorCode和errorInfo屬性實現
echo '操作失敗';
//echo $pdo->errorCode();
//echo $pdo->errorInfo();
}
6. PDO預處理prepare:讀取資料和習慣上的傳參方法
1.prepare&execute方法
require_once 'singletonPDO.php';
$pdo=singletonPDO::getPdo();
$pdo->exec('set names utf8');
//半成品的sql語句
//只能由prepare的預處理語句執行
$sql="insert into userinfolist value (?,?)";
$halPro=$pdo->prepare($sql);
//將半成品通過execut方法傳入引數,變成成品
$result=$halPro->execute(['xiaoming','666']);
var_dump($result);
2.bindColumn:用於讀取資料
require_once 'singletonPDO.php';
$pdo=singletonPDO::getPdo();
$pdo->exec('set names utf8');
$sql="select * from userinfolist where 1";
$halPro=$pdo->prepare($sql);
$halPro->execute();
//將結果中的內容繫結在指定的變數上
$halPro->bindColumn(1,$uname);
$halPro->bindColumn(1,$upass);
//讀取檢索結果
$info=[];
//$halPro->fetch(PDO::FETCH_COLUMN)
//作用時遍歷結果中的每一條資料,直到最後一條為止
for ($i=0;$halPro->fetch(PDO::FETCH_COLUMN);$i++){
$info[$i]=array('userName'=>$uname,'password'=>$upass);
}
print_r($info);
3.bindValue()方法:一種靈活的傳參方法
echo "<pre>";
require_once 'singletonPDO.php';
$pdo=singletonPDO::getPdo();
$pdo->exec('set names utf8');
$sql="insert into userinfolist value (?,?)";
$halPro=$pdo->prepare($sql);
//在prepare()方法和execute()方法之間,對sql語句中的?傳至
//提供一種更靈活的方式來編輯sql語句
$halPro->bindValue(1,'xiaohong');
$halPro->bindValue(2,'8888');
//習慣上execute()不傳參,僅執行
echo $halPro->execute();
7. PDO事務處理transaction:保護資料庫
事務:多個事件組成的結構。
事件:事件實際上就是預處理語句執行的execute語句。
注意:
(1)整個事務操作必須放到try…catch中,這是因為我們並不能保證執行的事件一定成功。
而對於整個事務而言,任何一個事件的失敗都會導致catch的觸發。
而catch觸發就意味著必須將之前做出的所有的操作都必須還原
回滾操作:$pdo->rollBack()
(2)操作語句必須在事務開啟之後執行,在事務提交之前停止.
開啟事務:$pdo->beginTransaction();
關閉事務:$pdo->commit();
(3)中文處理方案(避免亂碼):
讀取:$pdo ->query("set names utf8");
插入:$pdo ->exec('set names utf8');
<?php
require_once ‘singletonPDO.php’;
$pdo=singletonPDO::getPdo();
$pdo->exec(‘set names utf8’);
try{
//開啟事務處理
$pdo->beginTransaction();
//建立一個修改sql語句
$sql = "update userinfolist set userName=?,password=? where userName=?";
$halfPro = $pdo->prepare($sql);
//執行第一條execute語句(第一個事件)
$halfPro->execute(['frank','333','franky']);
//執行第二條execute語句(第二個事件)
$halfPro->execute(['lileilei','11111']);
//當事件出現問題時,中止操作。向singletonPDO.php新增異常事件的處理語句
//提交事務
$pdo->commit();
}catch(PDOException $e){
$pdo->rollBack(); //回滾操作
echo '事務處理失敗,資料庫回滾到事務開始之前的狀態,沒有受到任何影響';
}
?>