1. 程式人生 > >MySQL PDO物件:如何用php操作不同的資料庫

MySQL PDO物件:如何用php操作不同的資料庫

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 '事務處理失敗,資料庫回滾到事務開始之前的狀態,沒有受到任何影響';
}


?>