PDO を使用してデータベースを操作する利点: 1. PDO は、下部に実装された統合インターフェイスでデータベースを実際に操作します。 2. PDO は、より高度な DB 機能の操作をサポートします。 PHP は MySQL 拡張機能よりも高い互換性と安定性を備えています。4. PDO は SQL インジェクションを防止し、データベースの安全性を確保します。
PDO は PHP Data Object の略です。
PDO 拡張機能自体を使用してデータベース操作を実行することはできません。データベース サーバーにアクセスするには、データベース固有の PDO ドライバー (特定のデータベース用の PDO ドライバー) を使用する必要があります。
PDO はデータベースの抽象化を提供しません。SQL を書き換えたり、データベース自体に欠けている関数を提供したりすることはありません。この機能が必要な場合は、より成熟した抽象化レイヤーを使用する必要があります。
PDO は PHP5 コア OO 機能のサポートを必要とするため、以前の PHP バージョンでは実行できません。
PDO には、MySQL 拡張ライブラリでは利用できない多くの操作があります。
1. PDO は、最下層に実装された真に統合されたインターフェイスのデータベース操作インターフェイスです。バックエンドで使用されるデータベースの種類に関係なく、コードがカプセル化されている場合、バックエンド データベースを置き換える場合、アプリケーション層のコードは基本的に変更する必要はありません。
2. PDO のサポート ストアド プロシージャのスケジューリングなどのより高度な DB 機能の操作は、mysql ネイティブ ライブラリではサポートされていません。3. PDO は PHP の公式 PECL ライブラリであり、その互換性と安定性は MySQL Extension よりも高い必要があります。pecl upgrade pdo コマンドを直接使用してアップグレードできます。4. PDO は SQL インジェクションを防止し、データベースの安全性を確保します。準備されたステートメントを使用すると、SQL インジェクション攻撃を回避できます。 準備されたステートメントは、複数回使用できるプリコンパイルされた SQL ステートメントであり、毎回単にデータをサーバーに送信します。さらに、プレースホルダーを使用したデータを安全に処理して SQL インジェクション攻撃を防止できるという利点もあります。インストール、構成、テスト
Windows で PDO をテストする場合、php.ini の extension_dir の値に pdo*.dll のパスを入力する必要があります。そうしないと、pdo 関連のプログラムを実行できません。; ロード可能な拡張機能 (モジュール) が存在するディレクトリ。extension_dir = "E:wwwphp5ext"
<?php $host = 'localhost'; $user = 'root'; $password = 'develop'; $dbname = '99game'; $dbh = new PDO("mysql:host=$host;dbname=$dbname", $user, $password); //======================================================= //例子 1. Execute a prepared statement with named placeholders /* Execute a prepared statement by binding PHP variables */ $user_id = 1; $email = 'caihf_73940@qq.com'; $sth = $dbh->prepare('SELECT user_id,email,token FROM 99game_user WHERE user_id = :user_id AND email = :email'); $sth->bindParam(':user_id', $user_id, PDO::PARAM_INT); $sth->bindParam(':email', $email, PDO::PARAM_STR, 30); $sth->execute(); $result = $sth->fetch(PDO::FETCH_ASSOC); print_r($result); print("<br />\n"); //例子 2. Execute a prepared statement with question mark placeholders /* Execute a prepared statement by binding PHP variables */ $user_id = 2; $email = 'caihuafeng1@gmail.com'; $sth = $dbh->prepare('SELECT user_id,email,token FROM 99game_user WHERE user_id = ? AND email = ?'); $sth->bindParam(1, $user_id, PDO::PARAM_INT); $sth->bindParam(2, $email, PDO::PARAM_STR, 30); $sth->execute(); $result = $sth->fetch(PDO::FETCH_ASSOC); print_r($result); print("<br />\n"); print "<hr />\n"; //======================================================= //======================================================= $sth = $dbh->prepare("SELECT user_id,email,token FROM 99game_user limit 10"); $sth->execute(); /* 运用 PDOStatement::fetch 风格 */ print("PDO::FETCH_ASSOC: "); print("Return next row as an array indexed by column name<br />\n"); $result = $sth->fetch(PDO::FETCH_ASSOC); print_r($result); print("<br />\n"); print("\n"); print("PDO::FETCH_BOTH: "); print("Return next row as an array indexed by both column name and number<br />\n"); $result = $sth->fetch(PDO::FETCH_BOTH); print_r($result); print("<br />\n"); print("\n"); print("PDO::FETCH_LAZY: "); print("Return next row as an anonymous object with column names as properties<br />\n"); $result = $sth->fetch(PDO::FETCH_LAZY); print_r($result); print("<br />\n"); print("\n"); print("PDO::FETCH_OBJ: "); print("Return next row as an anonymous object with column names as properties<br />\n"); $result = $sth->fetch(PDO::FETCH_OBJ); print_r($result); print 'user_id:' . $result->user_id; print("<br />\n"); print("\n"); print "<hr />\n"; //======================================================= //======================================================= function readDataForwards($dbh) { $sql = 'SELECT user_id,email,token FROM 99game_user limit 10'; try { $stmt = $dbh->prepare($sql, array(PDO::ATTR_CURSOR, PDO::CURSOR_SCROLL)); $stmt->execute(); while ($row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT)) { $data = $row[0] . "\t" . $row[1] . "\t" . $row[2] . "<br />\n"; print $data; } $stmt = null; } catch (PDOException $e) { print $e->getMessage(); } } function readDataBackwards($dbh) { $sql = 'SELECT user_id,email,token FROM 99game_user limit 10'; try { $stmt = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)); $stmt->execute(); $row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_LAST); do { $data = $row[0] . "\t" . $row[1] . "\t" . $row[2] . "<br />\n"; print $data; } while ($row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_PRIOR)); $stmt = null; } catch (PDOException $e) { print $e->getMessage(); } } print "Reading forwards:<br />\n"; readDataForwards($dbh); print "<hr />\n"; print "Reading backwards:<br />\n"; //下面的数据没有按照想像中的倒排输出,暂时不知道什么原因,php.net官方手册中的例子也是这么写的 readDataBackwards($dbh); //======================================================= ?>上記のテスト プログラムの出力
Array ( [user_id] => 1 [email] => caihf_73940@qq.com [token] => 123token456_73940 ) Array ( [user_id] => 2 [email] => caihuafeng1@gmail.com [token] => 33fadfasdfadsf ) PDO::FETCH_ASSOC: Return next row as an array indexed by column name Array ( [user_id] => 1 [email] => caihf_73940@qq.com [token] => 123token456_73940 ) PDO::FETCH_BOTH: Return next row as an array indexed by both column name and number Array ( [user_id] => 2 [0] => 2 [email] => caihuafeng1@gmail.com [1] => caihuafeng1@gmail.com [token] => 33fadfasdfadsf [2] => 33fadfasdfadsf ) PDO::FETCH_LAZY: Return next row as an anonymous object with column names as properties PDORow Object ( [queryString] => SELECT user_id,email,token FROM 99game_user limit 10 [user_id] => 3 [email] => caihf_61039@qq.com [token] => 123token456_61039 ) PDO::FETCH_OBJ: Return next row as an anonymous object with column names as properties stdClass Object ( [user_id] => 6 [email] => aa1@aa.com [token] => cU8ady73epcmf54o7W0q1F0f8R3b2y4d ) user_id:6関連知識の詳細については、
PHP 中国語 Web サイト をご覧ください。 !