ホームページ  >  記事  >  バックエンド開発  >  PDO を使用してデータベースを操作する利点は何ですか?

PDO を使用してデータベースを操作する利点は何ですか?

PHPz
PHPzオリジナル
2016-06-13 12:05:591991ブラウズ

PDO を使用してデータベースを操作する利点: 1. PDO は、下部に実装された統合インターフェイスでデータベースを実際に操作します。 2. PDO は、より高度な DB 機能の操作をサポートします。 PHP は MySQL 拡張機能よりも高い互換性と安定性を備えています。4. PDO は SQL インジェクションを防止し、データベースの安全性を確保します。

PDO を使用してデータベースを操作する利点は何ですか?

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 = &#39;localhost&#39;;
$user = &#39;root&#39;;
$password = &#39;develop&#39;;
$dbname = &#39;99game&#39;;

$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 = &#39;caihf_73940@qq.com&#39;;
$sth = $dbh->prepare(&#39;SELECT user_id,email,token FROM 99game_user
    WHERE user_id = :user_id AND email = :email&#39;);
$sth->bindParam(&#39;:user_id&#39;, $user_id, PDO::PARAM_INT);
$sth->bindParam(&#39;:email&#39;, $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 = &#39;caihuafeng1@gmail.com&#39;;
$sth = $dbh->prepare(&#39;SELECT user_id,email,token FROM 99game_user
    WHERE user_id = ? AND email = ?&#39;);
$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 &#39;user_id:&#39; . $result->user_id;
print("<br />\n");
print("\n");

print "<hr />\n";
//=======================================================

//=======================================================
function readDataForwards($dbh) {
  $sql = &#39;SELECT user_id,email,token FROM 99game_user limit 10&#39;;
  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 = &#39;SELECT user_id,email,token FROM 99game_user limit 10&#39;;
  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 サイト をご覧ください。 !

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。