PHP PDOの基本操作を?qū)W習(xí)するフロントエンド
Dec 05, 2016 pm 01:26 PM前の言葉
PDO (php data object) 拡張クラス ライブラリは、PHP がデータベースにアクセスするための軽量で一貫したインターフェイスを定義し、どのようなデータベースが使用されても、一貫した関數(shù)を通じてクエリを?qū)g行してデータを取得できるようにします。これにより、データベースの操作が大幅に簡素化され、異なるデータベース間の差異を隠すことができます。PDO を使用すると、クロスデータベース プログラムの開発や異なるデータベース間の移植が簡単に実行できます。これは、データベース処理における PDO の主な用途になります。將來的には、mysql、postgresql、oracle、mssql、その他のデータベースをサポートできるようになります
PDOオブジェクトを作成する
PDO を使用してさまざまなデータベース管理システムと対話する場合、PDO オブジェクトのメンバー メソッドはさまざまなデータベースのアクセス インターフェイスを統(tǒng)合するため、PDO を使用してデータベースと対話する前に、まず PDO オブジェクトを作成する必要があります。コンストラクターメソッドを通じてオブジェクトを作成する際、データベースサーバーとの接続を確立し、データベースを選択する必要があります
PDOの構(gòu)築方法のプロトタイプは以下の通りです
構(gòu)築メソッドでは、最初に必須のパラメータはデータ ソース名 (dsn) で、これは特定のデータベースと使用する必要があるドライバーを定義するために使用されます。 DSN の PDO 命名規(guī)則は、PDO ドライバーの名前の後にコロンが続き、その後にホスト名、ポート、データベース名などのオプションのドライバー データベース接続変數(shù)情報(bào)が続きます
構(gòu)築メソッドの第二パラメータusernameと第三パラメータpasswordはそれぞれデータベースへの接続に使用するユーザー名とパスワードを指定します。最後のパラメーター driver_options には、接続に必要なすべての追加オプションを指定するための配列が必要で、追加の調(diào)整パラメーターを PDO または基礎(chǔ)となるドライバーに渡します
PDO オブジェクトを作成するとき、データを形成するために必要なオプションをコンストラクターの 4 番目のパラメーター driver_opts に渡して、追加の調(diào)整パラメーターを PDO または基礎(chǔ)となるドライバーに渡すことができます。
リーリーPDO オブジェクトを使用する
PDO の動作屬性を調(diào)整します
PDO オブジェクトには、PDO の動作を調(diào)整したり、基礎(chǔ)となるドライバーのステータスを取得したりするために使用されるプロパティが多數(shù)あります。 PDO オブジェクトの作成時にコンストラクターの最後のパラメーターとして屬性オプションを渡さない場合は、PDO オブジェクトの作成後に、PDO オブジェクトの setAttribute() メソッドと getAttribute() メソッドを通じてこれらの屬性の値を設(shè)定および取得することもできます。オブジェクトが作成されました
PDO::getAttribute()
PDO::getAttribute() はデータベース接続の屬性を取得するために使用されますリーリー
PDO::setAttribute()
屬性の設(shè)定にはPDO::setAttribute()を使用しますリーリー
エラー処理
PDO は合計(jì) 3 つの異なるエラー処理モードを提供し、さまざまなスタイルのプログラミングに対応できるだけでなく、エラー処理方法を調(diào)整および拡張することもできます
PDO:ERRORMODE_SILENT
これはデフォルトのモードで、エラーが発生してもアクションは実行されず、PDO はエラー コードを設(shè)定するだけです。開発者は、PDO オブジェクトの errorCode() メソッドと errorInfo() メソッドを使用してステートメントとデータベース オブジェクトをチェックできます。ステートメント オブジェクトの呼び出しによってエラーが発生した場合は、そのステートメント オブジェクトに対して errorCode() メソッドまたは errorInfo() メソッドを呼び出すことができます。データベース オブジェクトの呼び出しによってエラーが発生した場合は、そのデータベース オブジェクトに対して上記の 2 つのメソッドを呼び出すことができます
PDO:ERRMODE_WARNING
エラーコードの設(shè)定に加えて、PDO は PHP の従來の E_WARNING メッセージも発行します。これは、通常の PHP エラー ハンドラーを使用して捕捉できます。この設(shè)定は、アプリケーションのフローを誤って中斷せずに、何が問題になったのかを確認(rèn)したいだけの場合、デバッグやテストに役立ちますリーリー
PDO:ERRMODE_EXCEPTION
エラー コードの設(shè)定に加えて、PDO は PDOException をスローし、そのプロパティを設(shè)定してエラー コードとエラー情報(bào)を反映します。この設(shè)定は、スクリプト內(nèi)のエラーが発生している箇所にズームインし、コードの問題の可能性がある領(lǐng)域を迅速に特定できるため、デバッグにも役立ちます。例外パターンのもう 1 つの便利な側(cè)面は、従來の PHP スタイルの警告よりも明確に獨(dú)自のエラー処理を構(gòu)築できることです。各データベース呼び出しの戻り値をサイレントかつ明示的にチェックするのではなく、例外パターンのコードとネストされたコードが少なくなりますリーリー
執(zhí)行SQL語句
在使用PDO執(zhí)行查詢數(shù)據(jù)之前,先提供一組相關(guān)的數(shù)據(jù)。創(chuàng)建PDO對象并通過mysql驅(qū)動連接mysql數(shù)據(jù)庫服務(wù)器,創(chuàng)建一個以'testdb'命名的數(shù)據(jù)庫,并在該數(shù)據(jù)庫中創(chuàng)建一個聯(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','朝陽','15011111234','zs@aaa.com'),('李四','D02','朝陽','15011112345','ls@aaa.com'),('王五','D02','海淀','15011113456','ww@aaa.com'),('趙四','D01','海淀','15011114567','zx@aaa.com');

PDO::exec()
PDO::exec()函數(shù)執(zhí)行一條SQL語句,并返回受影響的行數(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等沒有結(jié)果集的查詢時,使用PDO對象中的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)建對象</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ù)庫連接失?。?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)建對象</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ù)庫連接失?。?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> "錯誤:" .<span style="color: #800080;">$e</span>-><span style="color: #000000;">getMessage(); } </span>?>

PDO::query()
當(dāng)執(zhí)行返回結(jié)果集的SELECT查詢時,或者所影響的行數(shù)無關(guān)緊要時,應(yīng)當(dāng)使用PDO對象中的query()方法。如果該方法成功執(zhí)行指定的查詢,則返回一個PDOStatement對象。如果使用了query()方法,并想了解獲取的數(shù)據(jù)行總數(shù),可以使用PDOStatement對象中的rowCount()方法獲取
PDOStatement::rowCount()
PDOStatement::rowCount()函數(shù)返回受上一個 SQL 語句影響的行數(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)建對象</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ù)庫連接失?。?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ù)庫一致的機(jī)制,是一個或一系列的查詢,作為一個單元的一組有序的數(shù)據(jù)庫操作。如果組中的所有SQL語句都操作成功,則認(rèn)為事務(wù)成功,事務(wù)則被提交,其修改將作用于所有其他數(shù)據(jù)庫進(jìn)程。即使在事務(wù)的組中只有一個環(huán)節(jié)操作失敗,事務(wù)也不成功,則整個事務(wù)將被回滾,該事務(wù)中所有操作都被取消。事務(wù)功能是企業(yè)級數(shù)據(jù)庫的一個重要部分,因?yàn)楹芏鄻I(yè)務(wù)過程都包括多個步驟。如果任何一個步驟失敗,則所有步驟都不應(yīng)發(fā)生。事務(wù)處理有4個特征:原子性(Atomicity)、一致性(Consistency)、獨(dú)立性(Isolation)和持久性(Durability),即ACID。對于在一個事務(wù)中執(zhí)行的任何工作,即使它是分階段進(jìn)行的,也一定可以保證該工作會安全地應(yīng)用于數(shù)據(jù)庫,并且在工作被提交時,不會受到其他連接的影響
MySQL目前只有InnoDB和BDB兩個數(shù)據(jù)庫表類型才支持事務(wù),兩個表類型具有相同的特性,InnoDB表類型具有比BDB還豐富的特性,速度更快,因此建議使用InnoDB表類型。創(chuàng)建InnoDB類型的表實(shí)際上與創(chuàng)建任何其他類型表的過程沒有區(qū)別,如果數(shù)據(jù)庫沒有設(shè)置為默認(rèn)的表類型,只要在創(chuàng)建時顯式指定要將表創(chuàng)建為InnoDB類型
要實(shí)現(xiàn)事務(wù)處理,首先要使用InnoDB引擎
ALTER TABLE contactInfo engine=innodb;

在默認(rèn)的情況下,MySQL是以自動提交(autocommit)模式運(yùn)行的,這就意味著所執(zhí)行的每一個語句都將立即寫入數(shù)據(jù)庫中。但如果使用事務(wù)安全的表格類型,是不希望有自動 提交的行為的,所以要在當(dāng)前的會話中關(guān)閉自動提交
SET AUTOCOMMIT = 0;<span style="color: #008000;">//</span><span style="color: #008000;">在當(dāng)前的會話中關(guān)閉自動提交</span>
如果提交被打開了,必須開啟一個事務(wù);如果自動提交是關(guān)閉的,則不需要使用這條命令,因?yàn)檩斎胍粋€SQL命令時,一個事務(wù)將自動啟動
START TRANSACTION;<span style="color: #008000;">//</span><span style="color: #008000;">開啟一個事務(wù)</span>
在完成了一組事務(wù)的語句輸入后,需要提交一個事務(wù),該事務(wù)才能在其他會話中被其他用戶所見
COMMIT;<span style="color: #008000;">//</span><span style="color: #008000;">提交一個事務(wù)給數(shù)據(jù)庫</span>
如果改變注意,可以回滾到以前的狀態(tài)
ROOLBACK;<span style="color: #008000;">//</span><span style="color: #008000;">事務(wù)被回滾,所有操作都被取消</span>
事務(wù)處理完成后,再次開啟自動提交
SET AUTOCOMMIT = 1;

下面在PHP中進(jìn)行事務(wù)處理操作,對張三和李四進(jìn)行部門交換來輪崗培養(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)建對象</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è)置錯誤使用異常的模式</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)閉自動提交</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ù)庫連接失?。?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: #008000;">//</span><span style="color: #008000;">開啟一個事務(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)崗失敗!<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> "錯誤:".<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;">撤銷所有操作</span> <span style="color: #800080;">$dbh</span> -><span style="color: #000000;"> rollback(); } </span><span style="color: #008000;">//</span><span style="color: #008000;">運(yùn)行完成以后, 最后開啟自動提交</span> <span style="color: #800080;">$dbh</span>-> setAttribute(PDO::ATTR_AUTOCOMMIT, 1<span style="color: #000000;">); </span>?>


ホットAIツール

Undress AI Tool
脫衣畫像を無料で

Undresser.AI Undress
リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover
寫真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中國語版
中國語版、とても使いやすい

ゼンドスタジオ 13.0.1
強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)