亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
目錄
前面的話
建立PDO物件
使用PDO物件
事務(wù)處理
首頁(yè) php教程 php手冊(cè) 前端學(xué)PHP之PDO基礎(chǔ)操作

前端學(xué)PHP之PDO基礎(chǔ)操作

Dec 05, 2016 pm 01:26 PM

×
目錄
[1]建立PDO [2]使用PDO [3]事務(wù)處理

前面的話

  PDO(php data object)擴(kuò)充類(lèi)別庫(kù)為php存取資料庫(kù)定義了輕量級(jí)的、一致性的接口,它提供了一個(gè)資料庫(kù)存取抽象層,這樣,無(wú)論使用什麼資料庫(kù),都可以透過(guò)一致的函數(shù)執(zhí)行查詢和獲取數(shù)據(jù),大大簡(jiǎn)化了資料庫(kù)的操作,並能夠屏蔽不同資料庫(kù)之間的差異,使用PDO可以很方便地進(jìn)行跨資料庫(kù)程式的開(kāi)發(fā),以及不同資料庫(kù)間的移植,是將來(lái)php在資料庫(kù)處理方面的主要發(fā)展方向,它可以支援mysql、postgresql、oracle、mssql等多種資料庫(kù)

?

建立PDO物件

  使用PDO在與不同資料庫(kù)管理系統(tǒng)之間互動(dòng)時(shí),PDO物件中的成員方法是統(tǒng)一各種資料庫(kù)的存取接口,所以在使用PDO與資料庫(kù)進(jìn)行互動(dòng)之前,首先要建立一個(gè)PDO物件。在透過(guò)建構(gòu)方法建立物件的同時(shí),需要建立一個(gè)與資料庫(kù)伺服器的連接,並選擇一個(gè)資料庫(kù)

  PDO的構(gòu)造方法原型如下

__construct ( <span style="color: #0000ff;">string</span> <span style="color: #800080;">$dsn</span> [,<span style="color: #0000ff;">string</span> <span style="color: #800080;">$username</span> [,<span style="color: #0000ff;">string</span> <span style="color: #800080;">$password</span> [,<span style="color: #0000ff;">array</span> <span style="color: #800080;">$driver_options</span> ]]] )

  在建構(gòu)方法中,第一個(gè)必選的參數(shù)是資料來(lái)源名稱(chēng)(dsn),用來(lái)定義一個(gè)確定的資料庫(kù)和必須用到的驅(qū)動(dòng)程式。 DSN的PDO命名慣例為PDO驅(qū)動(dòng)程式的名稱(chēng),後面為一個(gè)冒號(hào),再後面是可選的驅(qū)動(dòng)程式的資料庫(kù)連接變數(shù)訊息,如主機(jī)名稱(chēng)、連接埠和資料庫(kù)名稱(chēng)

  建構(gòu)方法中的第二個(gè)參數(shù)username和第三個(gè)參數(shù)password分別指定用於連接資料庫(kù)的使用者名稱(chēng)和密碼。最後一個(gè)參數(shù)driver_options需要一個(gè)數(shù)組,用來(lái)指定連接所需的所有額外選項(xiàng),傳遞附加的調(diào)優(yōu)參數(shù)到PDO或底層驅(qū)動(dòng)程式

<span style="color: #008000;">/*</span><span style="color: #008000;">連接如果失敗,使用異常處理模式進(jìn)行捕獲 </span><span style="color: #008000;">*/</span>
<span style="color: #800080;">$dsn</span> = 'mysql:dbname=pdotest;host=127.0.0.1'; <span style="color: #008000;">//</span><span style="color: #008000;">連接MySQL數(shù)據(jù)庫(kù)的DSN </span>
<span style="color: #800080;">$user</span> = 'root'; <span style="color: #008000;">//</span><span style="color: #008000;">MySQL數(shù)據(jù)庫(kù)的用戶名</span>
<span style="color: #800080;">$password</span> = '*****'; <span style="color: #008000;">//</span><span style="color: #008000;">MySQL數(shù)據(jù)庫(kù)的密碼</span>
<span style="color: #0000ff;">try</span><span style="color: #000000;"> { 
     </span><span style="color: #800080;">$dbh</span> = <span style="color: #0000ff;">new</span> PDO(<span style="color: #800080;">$dsn</span>, <span style="color: #800080;">$user</span>, <span style="color: #800080;">$password</span><span style="color: #000000;">); 
} </span><span style="color: #0000ff;">catch</span> (PDOException <span style="color: #800080;">$e</span><span style="color: #000000;">) { 
      </span><span style="color: #0000ff;">echo</span> '數(shù)據(jù)庫(kù)連接失敗: ' . <span style="color: #800080;">$e</span>-><span style="color: #000000;">getMessage(); 
}</span>

  在建立PDO物件時(shí),有一些與資料庫(kù)連線相關(guān)的選項(xiàng),可以將必要的幾個(gè)選項(xiàng)組成資料傳遞給建構(gòu)方法的第四個(gè)參數(shù)driver_opts中,用來(lái)傳遞附加的調(diào)優(yōu)參數(shù)到PDO或底層驅(qū)動(dòng)程序

 PDO::ATTR_AUTOCOMMIT):<span style="color: #000000;"> PDO是否關(guān)閉自動(dòng)提交功能
 PDO</span>::ATTR_ERRMODE):<span style="color: #000000;"> 當(dāng)前PDO的錯(cuò)誤處理的模式 
 PDO</span>::ATTR_CASE):<span style="color: #000000;"> 表字段字符的大小寫(xiě)轉(zhuǎn): 
 PDO</span>::ATTR_CONNECTION_STATUS):<span style="color: #000000;"> 與連接狀態(tài)相關(guān)特有信息: 
 PDO</span>::ATTR_ORACLE_NULLS):<span style="color: #000000;"> 空字符串轉(zhuǎn)換為SQL的null 
 PDO</span>::ATTR_PERSISTENT):<span style="color: #000000;"> 應(yīng)用程序提前獲取數(shù)據(jù)大 
 PDO</span>::ATTR_SERVER_INFO):<span style="color: #000000;"> 與數(shù)據(jù)庫(kù)特有的服務(wù)器信 
 PDO</span>::ATTR_SERVER_VERSION):<span style="color: #000000;"> 數(shù)據(jù)庫(kù)服務(wù)器版本號(hào)信息
 PDO</span>::ATTR_CLIENT_VERSION): 數(shù)據(jù)庫(kù)客戶端版本號(hào)信息 
<span style="color: #008000;">//</span><span style="color: #008000;">設(shè)置持久連接的選項(xiàng)數(shù)組作為最后一個(gè)參數(shù),可以一起設(shè)置多個(gè)元素 </span>
<span style="color: #800080;">$opt</span> = <span style="color: #0000ff;">array</span>(PDO::ATTR_PERSISTENT => <span style="color: #0000ff;">true</span><span style="color: #000000;">);   
</span><span style="color: #0000ff;">try</span><span style="color: #000000;"> { 
       </span><span style="color: #800080;">$db</span> = <span style="color: #0000ff;">new</span> PDO('mysql:dbname=pdotest;host=127.0.0.1','root','*****',<span style="color: #800080;">$opt</span><span style="color: #000000;">); 
} </span><span style="color: #0000ff;">catch</span> (PDOException <span style="color: #800080;">$e</span><span style="color: #000000;">) { 
       </span><span style="color: #0000ff;">echo</span> "數(shù)據(jù)庫(kù)連接失?。?" .<span style="color: #800080;">$e</span>-><span style="color: #000000;">getMessage(); 
}</span>

?

使用PDO物件

調(diào)整PDO的行為屬性

  在PDO物件中有很多屬性用來(lái)調(diào)整PDO的行為或取得底層驅(qū)動(dòng)程式狀態(tài)。如果在建立PDO物件時(shí),沒(méi)有在建構(gòu)方法中最後一個(gè)參數(shù)過(guò)屬性選項(xiàng),也可以在物件建立完成之後,透過(guò)PDO物件中的setAttribute()和getAttribute()方法設(shè)定和取得這些屬性的值

PDO::getAttribute()

  PDO::getAttribute()用來(lái)取回一個(gè)資料庫(kù)連線的屬性

<span style="color: #0000ff;">mixed</span> PDO::getAttribute ( int <span style="color: #800080;">$attribute</span> )

PDO::setAttribute()

  PDO::setAttribute()用於設(shè)定屬性

bool PDO::setAttribute ( int <span style="color: #800080;">$attribute</span> , <span style="color: #0000ff;">mixed</span> <span style="color: #800080;">$value</span> )
<span style="color: #800080;">$dbh</span>->setAttribute(PDO::ATTR_ERRMODE, PDO::<span style="color: #000000;">ERRMODE_EXCEPTION);
</span><span style="color: #008000;">//</span><span style="color: #008000;">$dbh->setAttribute(3,2); </span>
<span style="color: #800080;">$dbh</span>->setAttribute(PDO::ATTR_AUTOCOMMIT,0);<span style="color: #008000;">//</span><span style="color: #008000;">$dbh->setAttribute(0,0); </span>
<span style="color: #800080;">$dbh</span>->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::<span style="color: #000000;">FETCH_ASSOC);
</span><span style="color: #008000;">//</span><span style="color: #008000;">$dbh->setAttribute(19,2); </span>

<span style="color: #0000ff;">echo</span> "\nPDO是否關(guān)閉自動(dòng)提交功能:". <span style="color: #800080;">$dbh</span>->getAttribute(PDO::<span style="color: #000000;">ATTR_AUTOCOMMIT);
</span><span style="color: #0000ff;">echo</span> "\n當(dāng)前PDO的錯(cuò)誤處理的模式:". <span style="color: #800080;">$dbh</span>->getAttribute(PDO::<span style="color: #000000;">ATTR_ERRMODE); 
</span><span style="color: #0000ff;">echo</span> "\n表字段字符的大小寫(xiě)轉(zhuǎn)換: ". <span style="color: #800080;">$dbh</span>->getAttribute(PDO::<span style="color: #000000;">ATTR_CASE); 
</span><span style="color: #0000ff;">echo</span> "\n與連接狀態(tài)相關(guān)特有信息: ". <span style="color: #800080;">$dbh</span>->getAttribute(PDO::<span style="color: #000000;">ATTR_CONNECTION_STATUS); 
</span><span style="color: #0000ff;">echo</span> "\n空字符串轉(zhuǎn)換為SQL的null:". <span style="color: #800080;">$dbh</span>->getAttribute(PDO::<span style="color: #000000;">ATTR_ORACLE_NULLS); 
</span><span style="color: #0000ff;">echo</span> "\n應(yīng)用程序提前獲取數(shù)據(jù)大?。?quot;.<span style="color: #800080;">$dbh</span>->getAttribute(PDO::<span style="color: #000000;">ATTR_PERSISTENT); 
</span><span style="color: #0000ff;">echo</span> "\n與數(shù)據(jù)庫(kù)特有的服務(wù)器信息:".<span style="color: #800080;">$dbh</span>->getAttribute(PDO::<span style="color: #000000;">ATTR_SERVER_INFO); 
</span><span style="color: #0000ff;">echo</span> "\n數(shù)據(jù)庫(kù)服務(wù)器版本號(hào)信息:". <span style="color: #800080;">$dbh</span>->getAttribute(PDO::<span style="color: #000000;">ATTR_SERVER_VERSION);
</span><span style="color: #0000ff;">echo</span> "\n數(shù)據(jù)庫(kù)客戶端版本號(hào)信息:". <span style="color: #800080;">$dbh</span>->getAttribute(PDO::ATTR_CLIENT_VERSION); 

錯(cuò)誤處理

  PDO一共提供了三種不同的錯(cuò)誤處理模式,不僅可以滿足不同風(fēng)格的編程,也可以調(diào)整擴(kuò)展處理錯(cuò)誤的方式

PDO:ERRORMODE_SILENT

  這是預(yù)設(shè)模式,在錯(cuò)誤發(fā)生時(shí)不進(jìn)行任何操作,PDO將只設(shè)定錯(cuò)誤代碼。開(kāi)發(fā)人員可以透過(guò)PDO物件中的errorCode()和errorInfo()方法對(duì)語(yǔ)句和資料庫(kù)物件進(jìn)行檢查。如果錯(cuò)誤是由於對(duì)語(yǔ)句物件的呼叫而產(chǎn)生的,那麼可以在那個(gè)語(yǔ)句物件上呼叫errorCode()或errorInfo()方法。如果錯(cuò)誤是由於呼叫資料庫(kù)物件而產(chǎn)生的,那麼可以在那個(gè)資料庫(kù)物件上呼叫上述兩個(gè)方法

PDO:ERRMODE_WARNING

  除了設(shè)定錯(cuò)誤代碼以外,PDO還將發(fā)出一條PHP傳統(tǒng)的E_WARNING訊息,可以使用常規(guī)的PHP錯(cuò)誤處理程序來(lái)捕獲該警告。如果只是想看看發(fā)生了什麼問(wèn)題,而無(wú)意中中斷應(yīng)用程式的流程,那麼在偵錯(cuò)或測(cè)試中這種設(shè)定很有用

<span style="color: #800080;">$dbh</span>->setAttrbute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);<span style="color: #008000;">//</span><span style="color: #008000;">設(shè)置警告模式處理錯(cuò)誤</span>

PDO:ERRMODE_EXCEPTION

  除了設(shè)定錯(cuò)誤代碼以外,PDO還將拋出一個(gè)PDOException,並設(shè)定其屬性,以反映錯(cuò)誤代碼和錯(cuò)誤訊息。這種設(shè)定在偵錯(cuò)中也很有用,因?yàn)樗鼤?huì)放大腳本中產(chǎn)生錯(cuò)誤的地方,從而可以非??焖俚刂赋龀淌酱a中有問(wèn)題的潛在區(qū)域。異常模式另一個(gè)有用的地方是,與傳統(tǒng)的PHP風(fēng)格的警告相比,可以更清晰地構(gòu)造自己的錯(cuò)誤處理,而且,比起以寂靜方式及顯式檢查每個(gè)數(shù)據(jù)庫(kù)調(diào)用的返回值,異常模式程式碼及巢狀程式碼也更少

<span style="color: #800080;">$dbh</span>->setAttrbute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);<span style="color: #008000;">//</span><span style="color: #008000;">設(shè)置異常模式處理錯(cuò)誤</span>

執(zhí)行SQL語(yǔ)句

  在使用PDO執(zhí)行查詢數(shù)據(jù)之前,先提供一組相關(guān)的數(shù)據(jù)。創(chuàng)建PDO對(duì)象并通過(guò)mysql驅(qū)動(dòng)連接mysql數(shù)據(jù)庫(kù)服務(wù)器,創(chuàng)建一個(gè)以'testdb'命名的數(shù)據(jù)庫(kù),并在該數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)聯(lián)系人信息表contactInfo

<span style="color: #000000;">CREATE TABLE contactInfo(
    uid MEDIUMINT(</span>8) UNSIGNED NOT <span style="color: #0000ff;">NULL</span> AUTO_INCREMENT,<span style="color: #000000;">
    name VARCHAR(</span>50) NOT <span style="color: #0000ff;">NULL</span>,<span style="color: #000000;">
    departmentID CHAR(</span>3) NOT <span style="color: #0000ff;">NULL</span>,<span style="color: #000000;">
    address VARCHAR(</span>80) NOT <span style="color: #0000ff;">NULL</span>,<span style="color: #000000;">
    phone VARCHAR(</span>20),<span style="color: #000000;">
    email VARCHAR(</span>20),<span style="color: #000000;">
    PRIMARY </span><span style="color: #008080;">KEY</span><span style="color: #000000;">(uid)
);</span>

  數(shù)據(jù)表contactInfo建立之后,向表中插入多行記錄

INSERT INTO contactInfo(name,departmentID,address,phone,email) VALUES ('張三','D01','朝陽(yáng)','15011111234','zs@aaa.com'),('李四','D02','朝陽(yáng)','15011112345','ls@aaa.com'),('王五','D02','海淀','15011113456','ww@aaa.com'),('趙四','D01','海淀','15011114567','zx@aaa.com');

PDO::exec()

  PDO::exec()函數(shù)執(zhí)行一條SQL語(yǔ)句,并返回受影響的行數(shù)

int PDO::<span style="color: #008080;">exec</span> ( <span style="color: #0000ff;">string</span> <span style="color: #800080;">$statement</span> )

  當(dāng)執(zhí)行INSERT、UPDATE、DELETET等沒(méi)有結(jié)果集的查詢時(shí),使用PDO對(duì)象中的exec()方法去執(zhí)行。該方法成功執(zhí)行后,將返回受影響的行數(shù)

<?<span style="color: #000000;">php
</span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
    </span><span style="color: #008000;">//</span><span style="color: #008000;">創(chuàng)建對(duì)象</span>
    <span style="color: #800080;">$dbh</span> = <span style="color: #0000ff;">new</span> PDO("mysql:host=localhost;dbname=testdb", "root", "zhiaihebe0123"<span style="color: #000000;">);
}</span><span style="color: #0000ff;">catch</span>(PDOException <span style="color: #800080;">$e</span><span style="color: #000000;">) {
    </span><span style="color: #0000ff;">echo</span> "數(shù)據(jù)庫(kù)連接失?。?quot;.<span style="color: #800080;">$e</span>-><span style="color: #000000;">getMessage();
    </span><span style="color: #0000ff;">exit</span><span style="color: #000000;">;
}

</span><span style="color: #800080;">$query</span> = "UPDATE contactInfo SET phone='12345678900' WHERE name='張三'"<span style="color: #000000;">;
</span><span style="color: #800080;">$affected</span> = <span style="color: #800080;">$dbh</span>-><span style="color: #008080;">exec</span>(<span style="color: #800080;">$query</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$affected</span><span style="color: #000000;">){
    </span><span style="color: #008000;">//</span><span style="color: #008000;">數(shù)據(jù)表contactInfo中受影響的行數(shù)為:1</span>
    <span style="color: #0000ff;">echo</span> '數(shù)據(jù)表contactInfo中受影響的行數(shù)為:' .<span style="color: #800080;">$affected</span><span style="color: #000000;">;
}</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{
    </span><span style="color: #008080;">print_r</span>(<span style="color: #800080;">$dbh</span>-><span style="color: #000000;">errorInfo());
}
</span><span style="color: #800080;">$query</span> = "UPDATE contactInfo SET phone='123456789' WHERE (uid%2 = 0)"<span style="color: #000000;">;
</span><span style="color: #800080;">$affected</span> = <span style="color: #800080;">$dbh</span>-><span style="color: #008080;">exec</span>(<span style="color: #800080;">$query</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$affected</span><span style="color: #000000;">){
    </span><span style="color: #008000;">//</span><span style="color: #008000;">數(shù)據(jù)表contactInfo中受影響的行數(shù)為:2</span>
    <span style="color: #0000ff;">echo</span> '數(shù)據(jù)表contactInfo中受影響的行數(shù)為:' .<span style="color: #800080;">$affected</span><span style="color: #000000;">;
}</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{
    </span><span style="color: #008080;">print_r</span>(<span style="color: #800080;">$dbh</span>-><span style="color: #000000;">errorInfo());
}
</span>?>

PDO::lastInsertId()

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

<span style="color: #0000ff;">string</span> PDO::lastInsertId ([ <span style="color: #0000ff;">string</span> <span style="color: #800080;">$name</span> = <span style="color: #0000ff;">NULL</span> ] )
<?<span style="color: #000000;">php
</span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
    </span><span style="color: #008000;">//</span><span style="color: #008000;">創(chuàng)建對(duì)象</span>
    <span style="color: #800080;">$dbh</span> = <span style="color: #0000ff;">new</span> PDO("mysql:host=localhost;dbname=testdb", "root", "zhiaihebe0123"<span style="color: #000000;">);
}</span><span style="color: #0000ff;">catch</span>(PDOException <span style="color: #800080;">$e</span><span style="color: #000000;">) {
    </span><span style="color: #0000ff;">echo</span> "數(shù)據(jù)庫(kù)連接失?。?quot;.<span style="color: #800080;">$e</span>-><span style="color: #000000;">getMessage();
    </span><span style="color: #0000ff;">exit</span><span style="color: #000000;">;
}

</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{
    </span><span style="color: #800080;">$query</span> = "INSERT INTO contactInfo(name,departmentID,phone,email) VALUES ('諸葛','D03','120120120','zg@aaa.com')"<span style="color: #000000;">;
    </span><span style="color: #800080;">$affected</span> = <span style="color: #800080;">$dbh</span>-><span style="color: #008080;">exec</span>(<span style="color: #800080;">$query</span><span style="color: #000000;">);    
    </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$affected</span>."<br>";<span style="color: #008000;">//</span><span style="color: #008000;">1</span>
    <span style="color: #0000ff;">echo</span> <span style="color: #800080;">$dbh</span>->lastInsertId();<span style="color: #008000;">//</span><span style="color: #008000;">5</span>
}<span style="color: #0000ff;">catch</span>(PDOException <span style="color: #800080;">$e</span><span style="color: #000000;">){
    </span><span style="color: #0000ff;">echo</span> "錯(cuò)誤:" .<span style="color: #800080;">$e</span>-><span style="color: #000000;">getMessage();
}
</span>?>

PDO::query()

  當(dāng)執(zhí)行返回結(jié)果集的SELECT查詢時(shí),或者所影響的行數(shù)無(wú)關(guān)緊要時(shí),應(yīng)當(dāng)使用PDO對(duì)象中的query()方法。如果該方法成功執(zhí)行指定的查詢,則返回一個(gè)PDOStatement對(duì)象。如果使用了query()方法,并想了解獲取的數(shù)據(jù)行總數(shù),可以使用PDOStatement對(duì)象中的rowCount()方法獲取

PDOStatement::rowCount()

  PDOStatement::rowCount()函數(shù)返回受上一個(gè) SQL 語(yǔ)句影響的行數(shù)

int PDOStatement::rowCount ( void )
<?<span style="color: #000000;">php
</span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
    </span><span style="color: #008000;">//</span><span style="color: #008000;">創(chuàng)建對(duì)象</span>
    <span style="color: #800080;">$dbh</span> = <span style="color: #0000ff;">new</span> PDO("mysql:host=localhost;dbname=testdb", "root", "zhiaihebe0123"<span style="color: #000000;">);
}</span><span style="color: #0000ff;">catch</span>(PDOException <span style="color: #800080;">$e</span><span style="color: #000000;">) {
    </span><span style="color: #0000ff;">echo</span> "數(shù)據(jù)庫(kù)連接失?。?quot;.<span style="color: #800080;">$e</span>-><span style="color: #000000;">getMessage();
    </span><span style="color: #0000ff;">exit</span><span style="color: #000000;">;
}
</span><span style="color: #800080;">$query</span> = "SELECT name,phone,email FROM contactInfo WHERE departmentId='D01'"<span style="color: #000000;">;
</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{
    </span><span style="color: #800080;">$pdostatement</span> = <span style="color: #800080;">$dbh</span>->query(<span style="color: #800080;">$query</span><span style="color: #000000;">);    
    </span><span style="color: #0000ff;">echo</span> "一共從表中獲取到".<span style="color: #800080;">$pdostatement</span>->rowCount()."條記錄:<br>"<span style="color: #000000;">;
    </span><span style="color: #0000ff;">foreach</span>(<span style="color: #800080;">$pdostatement</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$row</span><span style="color: #000000;">){
        </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$row</span>['name'] ."\t"<span style="color: #000000;">;
        </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$row</span>['phone'] ."\t"<span style="color: #000000;">;
        </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$row</span>['email'] ."<br>"<span style="color: #000000;">;
    }
}</span><span style="color: #0000ff;">catch</span> (PDOException <span style="color: #800080;">$e</span><span style="color: #000000;">){
    </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$e</span>-><span style="color: #000000;">getMessage();
}
</span>?>

?

事務(wù)處理

  事務(wù)是確保數(shù)據(jù)庫(kù)一致的機(jī)制,是一個(gè)或一系列的查詢,作為一個(gè)單元的一組有序的數(shù)據(jù)庫(kù)操作。如果組中的所有SQL語(yǔ)句都操作成功,則認(rèn)為事務(wù)成功,事務(wù)則被提交,其修改將作用于所有其他數(shù)據(jù)庫(kù)進(jìn)程。即使在事務(wù)的組中只有一個(gè)環(huán)節(jié)操作失敗,事務(wù)也不成功,則整個(gè)事務(wù)將被回滾,該事務(wù)中所有操作都被取消。事務(wù)功能是企業(yè)級(jí)數(shù)據(jù)庫(kù)的一個(gè)重要部分,因?yàn)楹芏鄻I(yè)務(wù)過(guò)程都包括多個(gè)步驟。如果任何一個(gè)步驟失敗,則所有步驟都不應(yīng)發(fā)生。事務(wù)處理有4個(gè)特征:原子性(Atomicity)、一致性(Consistency)、獨(dú)立性(Isolation)和持久性(Durability),即ACID。對(duì)于在一個(gè)事務(wù)中執(zhí)行的任何工作,即使它是分階段進(jìn)行的,也一定可以保證該工作會(huì)安全地應(yīng)用于數(shù)據(jù)庫(kù),并且在工作被提交時(shí),不會(huì)受到其他連接的影響

  MySQL目前只有InnoDB和BDB兩個(gè)數(shù)據(jù)庫(kù)表類(lèi)型才支持事務(wù),兩個(gè)表類(lèi)型具有相同的特性,InnoDB表類(lèi)型具有比BDB還豐富的特性,速度更快,因此建議使用InnoDB表類(lèi)型。創(chuàng)建InnoDB類(lèi)型的表實(shí)際上與創(chuàng)建任何其他類(lèi)型表的過(guò)程沒(méi)有區(qū)別,如果數(shù)據(jù)庫(kù)沒(méi)有設(shè)置為默認(rèn)的表類(lèi)型,只要在創(chuàng)建時(shí)顯式指定要將表創(chuàng)建為InnoDB類(lèi)型

  要實(shí)現(xiàn)事務(wù)處理,首先要使用InnoDB引擎

ALTER TABLE contactInfo engine=innodb;

  在默認(rèn)的情況下,MySQL是以自動(dòng)提交(autocommit)模式運(yùn)行的,這就意味著所執(zhí)行的每一個(gè)語(yǔ)句都將立即寫(xiě)入數(shù)據(jù)庫(kù)中。但如果使用事務(wù)安全的表格類(lèi)型,是不希望有自動(dòng) 提交的行為的,所以要在當(dāng)前的會(huì)話中關(guān)閉自動(dòng)提交

SET AUTOCOMMIT = 0;<span style="color: #008000;">//</span><span style="color: #008000;">在當(dāng)前的會(huì)話中關(guān)閉自動(dòng)提交</span>

  如果提交被打開(kāi)了,必須開(kāi)啟一個(gè)事務(wù);如果自動(dòng)提交是關(guān)閉的,則不需要使用這條命令,因?yàn)檩斎胍粋€(gè)SQL命令時(shí),一個(gè)事務(wù)將自動(dòng)啟動(dòng)

START TRANSACTION;<span style="color: #008000;">//</span><span style="color: #008000;">開(kāi)啟一個(gè)事務(wù)</span>

  在完成了一組事務(wù)的語(yǔ)句輸入后,需要提交一個(gè)事務(wù),該事務(wù)才能在其他會(huì)話中被其他用戶所見(jiàn)

COMMIT;<span style="color: #008000;">//</span><span style="color: #008000;">提交一個(gè)事務(wù)給數(shù)據(jù)庫(kù)</span>

  如果改變注意,可以回滾到以前的狀態(tài)

ROOLBACK;<span style="color: #008000;">//</span><span style="color: #008000;">事務(wù)被回滾,所有操作都被取消</span>

  事務(wù)處理完成后,再次開(kāi)啟自動(dòng)提交

SET AUTOCOMMIT = 1;

  下面在PHP中進(jìn)行事務(wù)處理操作,對(duì)張三和李四進(jìn)行部門(mén)交換來(lái)輪崗培養(yǎng)

<?<span style="color: #000000;">php
</span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
    </span><span style="color: #008000;">//</span><span style="color: #008000;">創(chuàng)建對(duì)象</span>
    <span style="color: #800080;">$dbh</span> = <span style="color: #0000ff;">new</span> PDO("mysql:host=localhost;dbname=testdb", "root", "zhiaihebe0123"<span style="color: #000000;">);
    </span><span style="color: #008000;">//</span><span style="color: #008000;">設(shè)置錯(cuò)誤使用異常的模式</span>
    <span style="color: #800080;">$dbh</span> -> setAttribute(PDO::ATTR_ERRMODE, PDO::<span style="color: #000000;">ERRMODE_EXCEPTION);
    </span><span style="color: #008000;">//</span><span style="color: #008000;">關(guān)閉自動(dòng)提交</span>
    <span style="color: #800080;">$dbh</span>-> setAttribute(PDO::ATTR_AUTOCOMMIT, 0<span style="color: #000000;">);
}</span><span style="color: #0000ff;">catch</span>(PDOException <span style="color: #800080;">$e</span><span style="color: #000000;">) {
    </span><span style="color: #0000ff;">echo</span> "數(shù)據(jù)庫(kù)連接失敗:".<span style="color: #800080;">$e</span>-><span style="color: #000000;">getMessage();
    </span><span style="color: #0000ff;">exit</span><span style="color: #000000;">;
}
</span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
    </span><span style="color: #008000;">//</span><span style="color: #008000;">開(kāi)啟一個(gè)事務(wù)</span>
    <span style="color: #800080;">$dbh</span> -><span style="color: #000000;"> beginTransaction();
    </span><span style="color: #800080;">$affected_rows</span> = <span style="color: #800080;">$dbh</span>-><span style="color: #008080;">exec</span>("UPDATE contactInfo set departmentID = 'D02' where uid=1"<span style="color: #000000;">);
    </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$affected_rows</span> > 0<span style="color: #000000;">) {
        </span><span style="color: #0000ff;">echo</span> "張三轉(zhuǎn)崗成功!<br>"<span style="color: #000000;">;
    } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
        </span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> PDOException("張三轉(zhuǎn)崗失?。?lt;br>"<span style="color: #000000;">);
    }
    </span><span style="color: #800080;">$affected_rows</span> = <span style="color: #800080;">$dbh</span>-> <span style="color: #008080;">exec</span>("UPDATE contactInfo set departmentID = 'D01' where uid=2"<span style="color: #000000;">);
    </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$affected_rows</span><span style="color: #000000;">) {
        </span><span style="color: #0000ff;">echo</span> "李四轉(zhuǎn)崗成功!<br>"<span style="color: #000000;">;
    }</span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
        </span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> PDOException("李四轉(zhuǎn)崗失??!<br>"<span style="color: #000000;">);
    }
    </span><span style="color: #0000ff;">echo</span> "輪崗成功!<br>"<span style="color: #000000;">;
    </span><span style="color: #008000;">//</span><span style="color: #008000;">提交以上的操作</span>
    <span style="color: #800080;">$dbh</span>-><span style="color: #000000;">commit();    
}</span><span style="color: #0000ff;">catch</span>(PDOException <span style="color: #800080;">$e</span><span style="color: #000000;">) {
    </span><span style="color: #0000ff;">echo</span> "錯(cuò)誤:".<span style="color: #800080;">$e</span>-><span style="color: #000000;">getMessage();
    </span><span style="color: #0000ff;">echo</span> "轉(zhuǎn)崗失敗!<br>"<span style="color: #000000;">;
    </span><span style="color: #008000;">//</span><span style="color: #008000;">撤銷(xiāo)所有操作</span>
    <span style="color: #800080;">$dbh</span> -><span style="color: #000000;"> rollback();
}
</span><span style="color: #008000;">//</span><span style="color: #008000;">運(yùn)行完成以后, 最后開(kāi)啟自動(dòng)提交</span>
<span style="color: #800080;">$dbh</span>-> setAttribute(PDO::ATTR_AUTOCOMMIT, 1<span style="color: #000000;">);
</span>?>
本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話題

Laravel 教程
1597
29
PHP教程
1488
72