麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > PHP > 正文

前端學PHP之PDO基礎操作

2020-03-22 20:10:40
字體:
來源:轉載
供稿:網友

  • 前面的話

      PDO(php data object)擴展類庫為php訪問數據庫定義了輕量級的、一致性的接口,它提供了一個數據庫訪問抽象層,這樣,無論使用什么數據庫,都可以通過一致的函數執行查詢和獲取數據,大大簡化了數據庫的操作,并能夠屏蔽不同數據庫之間的差異,使用PDO可以很方便地進行跨數據庫程序的開發,以及不同數據庫間的移植,是將來php在數據庫處理方面的主要發展方向,它可以支持mysql、postgresql、oracle、mssql等多種數據庫

    創建PDO對象

      使用PDO在與不同數據庫管理系統之間交互時,PDO對象中的成員方法是統一各種數據庫的訪問接口,所以在使用PDO與數據庫進行交互之前,首先要創建一個PDO對象。在通過構造方法創建對象的同時,需要建立一個與數據庫服務器的連接,并選擇一個數據庫

      PDO的構造方法原型如下

    __construct ( string $dsn [,string $username [,string $password [,array $driver_options ]]] )

      在構造方法中,第一個必選的參數是數據源名(dsn),用來定義一個確定的數據庫和必須用到的驅動程序。DSN的PDO命名慣例為PDO驅動程序的名稱,后面為一個冒號,再后面是可選的驅動程序的數據庫連接變量信息,如主機名、端口和數據庫名

      構造方法中的第二個參數username和第三個參數password分別指定用于連接數據庫的用戶名和密碼。最后一個參數driver_options需要一個數組,用來指定連接所需的所有額外選項,傳遞附加的調優參數到PDO或底層驅動程序

    /*連接如果失敗,使用異常處理模式進行捕獲 */$dsn = 'mysql:dbname=pdotest;host=127.0.0.1'; //連接html' target='_blank'>MySQL數據庫的DSN $user = 'root'; //MySQL數據庫的用戶名$password = '*****'; //MySQL數據庫的密碼try {      $dbh = new PDO($dsn, $user, $password); } catch (PDOException $e) {       echo '數據庫連接失敗: ' . $e->getMessage(); }

      在創建PDO對象時,有一些與數據庫連接相關的選項,可以將必要的幾個選項組成數據傳遞給構造方法的第四個參數driver_opts中,用來傳遞附加的調優參數到PDO或底層驅動程序

     PDO::ATTR_AUTOCOMMIT): PDO是否關閉自動提交功能 PDO::ATTR_ERRMODE): 當前PDO的錯誤處理的模式  PDO::ATTR_CASE): 表字段字符的大小寫轉:  PDO::ATTR_CONNECTION_STATUS): 與連接狀態相關特有信息:  PDO::ATTR_ORACLE_NULLS): 空字符串轉換為SQL的null  PDO::ATTR_PERSISTENT): 應用程序提前獲取數據大  PDO::ATTR_SERVER_INFO): 與數據庫特有的服務器信  PDO::ATTR_SERVER_VERSION): 數據庫服務器版本號信息 PDO::ATTR_CLIENT_VERSION): 數據庫客戶端版本號信息 
    //設置持久連接的選項數組作為最后一個參數,可以一起設置多個元素 $opt = array(PDO::ATTR_PERSISTENT => true);   try {        $db = new PDO('mysql:dbname=pdotest;host=127.0.0.1','root','*****',$opt); } catch (PDOException $e) {        echo '數據庫連接失敗: ' .$e->getMessage(); }

    使用PDO對象

    調整PDO的行為屬性

      在PDO對象中有很多屬性用來調整PDO的行為或獲取底層驅動程序狀態。如果在創建PDO對象時,沒有在構造方法中最后一個參數過屬性選項,也可以在對象創建完成之后,通過PDO對象中的setAttribute()和getAttribute()方法設置和獲取這些屬性的值

    PDO::getAttribute()

      PDO::getAttribute()用于取回一個數據庫連接的屬性

    mixed PDO::getAttribute ( int $attribute )

    PDO::setAttribute()

      PDO::setAttribute()用于設置屬性

    bool PDO::setAttribute ( int $attribute , mixed $value )
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//$dbh->setAttribute(3,2); $dbh->setAttribute(PDO::ATTR_AUTOCOMMIT,0);//$dbh->setAttribute(0,0); $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);//$dbh->setAttribute(19,2); echo 'PDO是否關閉自動提交功能:'. $dbh->getAttribute(PDO::ATTR_AUTOCOMMIT);echo '當前PDO的錯誤處理的模式:'. $dbh->getAttribute(PDO::ATTR_ERRMODE); echo '表字段字符的大小寫轉換: '. $dbh->getAttribute(PDO::ATTR_CASE); echo '與連接狀態相關特有信息: '. $dbh->getAttribute(PDO::ATTR_CONNECTION_STATUS); echo '空字符串轉換為SQL的null:'. $dbh->getAttribute(PDO::ATTR_ORACLE_NULLS); echo '應用程序提前獲取數據大小:'.$dbh->getAttribute(PDO::ATTR_PERSISTENT); echo '與數據庫特有的服務器信息:'.$dbh->getAttribute(PDO::ATTR_SERVER_INFO); echo '數據庫服務器版本號信息:'. $dbh->getAttribute(PDO::ATTR_SERVER_VERSION);echo '數據庫客戶端版本號信息:'. $dbh->getAttribute(PDO::ATTR_CLIENT_VERSION); 

    錯誤處理

      PDO一共提供了三種不同的錯誤處理模式,不僅可以滿足不同風格的編程,也可以調整擴展處理錯誤的方式

    PDO:ERRORMODE_SILENT

      這是默認模式,在錯誤發生時不進行任何操作,PDO將只設置錯誤代碼。開發人員可以通過PDO對象中的errorCode()和errorInfo()方法對語句和數據庫對象進行檢查。如果錯誤是由于對語句對象的調用而產生的,那么可以在那個語句對象上調用errorCode()或errorInfo()方法。如果錯誤是由于調用數據庫對象而產生的,那么可以在那個數據庫對象上調用上述兩個方法

    PDO:ERRMODE_WARNING

      除了設置錯誤代碼以外,PDO還將發出一條PHP傳統的E_WARNING消息,可以使用常規的PHP錯誤處理程序捕獲該警告。如果只是想看看發生了什么問題,而無意中斷應用程序的流程,那么在調試或測試中這種設置很有用

    $dbh->setAttrbute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);//設置警告模式處理錯誤

    PDO:ERRMODE_EXCEPTION

      除了設置錯誤代碼以外,PDO還將拋出一個PDOException,并設置其屬性,以反映錯誤代碼和錯誤信息。這種設置在調試中也很有用,因為它會放大腳本中產生錯誤的地方,從而可以非常快速地指出代碼中有問題的潛在區域。異常模式另一個有用的地方是,與傳統的PHP風格的警告相比,可以更清晰地構造自己的錯誤處理,而且,比起以寂靜方式及顯式檢查每個數據庫調用的返回值,異常模式代碼及嵌套代碼也更少

    $dbh->setAttrbute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);//設置異常模式處理錯誤

    執行SQL語句

      在使用PDO執行查詢數據之前,先提供一組相關的數據。創建PDO對象并通過mysql驅動連接mysql數據庫服務器,創建一個以'testdb'命名的數據庫,并在該數據庫中創建一個聯系人信息表contactInfo

    CREATE TABLE contactInfo(    uid MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,    name VARCHAR(50) NOT NULL,    departmentID CHAR(3) NOT NULL,    address VARCHAR(80) NOT NULL,    phone VARCHAR(20),    email VARCHAR(20),    PRIMARY KEY(uid));

      數據表contactInfo建立之后,向表中插入多行記錄

    INSERT INTO contactInfo(name,departmentID,address,phone,email) VALUES ('張三','D01','朝陽','15011111234','[email protected]'),('李四','D02','朝陽','15011112345','[email protected]'),('王五','D02','海淀','15011113456','[email protected]'),('趙四','D01','海淀','15011114567','[email protected]');

    PDO::exec()

      PDO::exec()函數執行一條SQL語句,并返回受影響的行數

    int PDO::exec ( string $statement )

      當執行INSERT、UPDATE、DELETET等沒有結果集的查詢時,使用PDO對象中的exec()方法去執行。該方法成功執行后,將返回受影響的行數

    <?phptry {    //創建對象    $dbh = new PDO('mysql:host=localhost;dbname=testdb', 'root', 'zhiaihebe0123');}catch(PDOException $e) {    echo '數據庫連接失敗:'.$e->getMessage();    exit;}$query = 'UPDATE contactInfo SET phone='12345678900' WHERE name='張三'';$affected = $dbh->exec($query);if($affected){    //數據表contactInfo中受影響的行數為:1    echo '數據表contactInfo中受影響的行數為:' .$affected;}else{    print_r($dbh->errorInfo());}$query = 'UPDATE contactInfo SET phone='123456789' WHERE (uid%2 = 0)';$affected = $dbh->exec($query);if($affected){    //數據表contactInfo中受影響的行數為:2    echo '數據表contactInfo中受影響的行數為:' .$affected;}else{    print_r($dbh->errorInfo());}?>

    PDO::lastInsertId()

      PDO::lastInsertId()函數用于返回最后插入行的ID或序列值

    string PDO::lastInsertId ([ string $name = NULL ] )
    <?phptry {    //創建對象    $dbh = new PDO('mysql:host=localhost;dbname=testdb', 'root', 'zhiaihebe0123');}catch(PDOException $e) {    echo '數據庫連接失敗:'.$e->getMessage();    exit;}try{    $query = 'INSERT INTO contactInfo(name,departmentID,phone,email) VALUES ('諸葛','D03','120120120','[email protected]')';    $affected = $dbh->exec($query);        echo $affected.'<br>';//1    echo $dbh->lastInsertId();//5}catch(PDOException $e){    echo '錯誤:' .$e->getMessage();}?>

    PDO::query()

      當執行返回結果集的SELECT查詢時,或者所影響的行數無關緊要時,應當使用PDO對象中的query()方法。如果該方法成功執行指定的查詢,則返回一個PDOStatement對象。如果使用了query()方法,并想了解獲取的數據行總數,可以使用PDOStatement對象中的rowCount()方法獲取

    PDOStatement::rowCount()

      PDOStatement::rowCount()函數返回受上一個 SQL 語句影響的行數

    int PDOStatement::rowCount ( void )
    <?phptry {    //創建對象    $dbh = new PDO('mysql:host=localhost;dbname=testdb', 'root', 'zhiaihebe0123');}catch(PDOException $e) {    echo '數據庫連接失敗:'.$e->getMessage();    exit;}$query = 'SELECT name,phone,email FROM contactInfo WHERE departmentId='D01'';try{    $pdostatement = $dbh->query($query);        echo '一共從表中獲取到'.$pdostatement->rowCount().'條記錄:<br>';    foreach($pdostatement as $row){        echo $row['name'] .'	';        echo $row['phone'] .'	';        echo $row['email'] .'<br>';    }}catch (PDOException $e){    echo $e->getMessage();}?>

    事務處理

      事務是確保數據庫一致的機制,是一個或一系列的查詢,作為一個單元的一組有序的數據庫操作。如果組中的所有SQL語句都操作成功,則認為事務成功,事務則被提交,其修改將作用于所有其他數據庫進程。即使在事務的組中只有一個環節操作失敗,事務也不成功,則整個事務將被回滾,該事務中所有操作都被取消。事務功能是企業級數據庫的一個重要部分,因為很多業務過程都包括多個步驟。如果任何一個步驟失敗,則所有步驟都不應發生。事務處理有4個特征:原子性(Atomicity)、一致性(Consistency)、獨立性(Isolation)和持久性(Durability),即ACID。對于在一個事務中執行的任何工作,即使它是分階段進行的,也一定可以保證該工作會安全地應用于數據庫,并且在工作被提交時,不會受到其他連接的影響

      MySQL目前只有InnoDB和BDB兩個數據庫表類型才支持事務,兩個表類型具有相同的特性,InnoDB表類型具有比BDB還豐富的特性,速度更快,因此建議使用InnoDB表類型。創建InnoDB類型的表實際上與創建任何其他類型表的過程沒有區別,如果數據庫沒有設置為默認的表類型,只要在創建時顯式指定要將表創建為InnoDB類型

      要實現事務處理,首先要使用InnoDB引擎

    ALTER TABLE contactInfo engine=innodb;

      在默認的情況下,MySQL是以自動提交(autocommit)模式運行的,這就意味著所執行的每一個語句都將立即寫入數據庫中。但如果使用事務安全的表格類型,是不希望有自動 提交的行為的,所以要在當前的會話中關閉自動提交

    SET AUTOCOMMIT = 0;//在當前的會話中關閉自動提交

      如果提交被打開了,必須開啟一個事務;如果自動提交是關閉的,則不需要使用這條命令,因為輸入一個SQL命令時,一個事務將自動啟動

    START TRANSACTION;//開啟一個事務

      在完成了一組事務的語句輸入后,需要提交一個事務,該事務才能在其他會話中被其他用戶所見

    COMMIT;//提交一個事務給數據庫

      如果改變注意,可以回滾到以前的狀態

    ROOLBACK;//事務被回滾,所有操作都被取消

      事務處理完成后,再次開啟自動提交

    SET AUTOCOMMIT = 1;

      下面在PHP中進行事務處理操作,對張三和李四進行部門交換來輪崗培養

    <?phptry {    //創建對象    $dbh = new PDO('mysql:host=localhost;dbname=testdb', 'root', 'zhiaihebe0123');    //設置錯誤使用異常的模式    $dbh -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);    //關閉自動提交    $dbh-> setAttribute(PDO::ATTR_AUTOCOMMIT, 0);}catch(PDOException $e) {    echo '數據庫連接失敗:'.$e->getMessage();    exit;}try {    //開啟一個事務    $dbh -> beginTransaction();    $affected_rows = $dbh->exec('UPDATE contactInfo set departmentID = 'D02' where uid=1');    if($affected_rows > 0) {        echo '張三轉崗成功!<br>';    } else {        throw new PDOException('張三轉崗失敗!<br>');    }    $affected_rows = $dbh-> exec('UPDATE contactInfo set departmentID = 'D01' where uid=2');    if($affected_rows) {        echo '李四轉崗成功!<br>';    }else {        throw new PDOException('李四轉崗失敗!<br>');    }    echo '輪崗成功!<br>';    //提交以上的操作    $dbh->commit();    }catch(PDOException $e) {    echo '錯誤:'.$e->getMessage();    echo '轉崗失敗!<br>';    //撤銷所有操作    $dbh -> rollback();}//運行完成以后, 最后開啟自動提交$dbh-> setAttribute(PDO::ATTR_AUTOCOMMIT, 1);?>
    PHP編程

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 成人在线观看免费爱爱 | 污片视频网站 | chinese 军人 gay xx 呻吟 | 欧美视频一级 | 九九精品久久 | 国产精品久久久久久影院8一贰佰 | 免费国产自久久久久三四区久久 | 久久国产不卡 | 双性精h调教灌尿打屁股的文案 | 久久国产一二三 | 国产一区二区三区网站 | 久久久久久久久久久久久久av | 久久久久亚洲精品 | 久久久久久久久久久久久久国产 | 亚洲成人免费网站 | 一级美女大片 | 国产精品自拍av | 免费a级片在线观看 | 依依成人精品视频 | 久久精品女人天堂av | 视频在线中文字幕 | 一区二区三区在线观看国产 | 欧美成人亚洲 | 草久视频在线观看 | 国产在线午夜 | 日韩欧美精品电影 | 欧美女优一区 | 国产精品成人一区二区三区电影毛片 | 毛片免费视频观看 | 中午日产幕无线码1区 | 国产精品jk白丝蜜臀av软件 | 国产精品成人久久久久a级 欧美特黄一级高清免费的香蕉 | 久草欧美 | 久久精品9 | 久久久久久久久淑女av国产精品 | 欧美国产一区二区三区 | 中文字幕在线视频日本 | 免费黄色欧美视频 | av在线视| 91成人免费视频 | 国产精品久久久久久久四虎电影 |