前端學(xué)PHP之PDO基礎(chǔ)操作
Dec 05, 2016 pm 01:26 PM前面的話
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>?>


熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

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

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

Clothoff.io
AI脫衣器

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

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

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

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

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