ホームページ  >  記事  >  バックエンド開発  >  002 - PDO と MySQLi の違いと選択肢

002 - PDO と MySQLi の違いと選択肢

不言
不言オリジナル
2018-04-08 14:37:451914ブラウズ



PHP を使用してデータベースにアクセスする場合、PHP に付属のデータベース ドライバーに加えて、通常、PDO と MySQLi という 2 つのより良いオプションがあります。実際の開発プロセスでは、どちらを選択するかを決定するには、まず両方について比較的包括的に理解する必要があります。この記事では、それらの違いを分析し、複数のデータベース タイプのサポート、安定性、パフォーマンスなどを比較します。

PDO MySQLi
データベースサポート 12種類のドライバー MySQL のみ
API OOP OOP + プロシージャル
接続 簡単 簡単
名前付きパラメータ はい いいえ
オブジェクトマッピング はい はい
準備完了ステートメント
(クライアント側)
はい いいえ
パフォーマンス 高速 高速
ストアドプロシージャ はい はい

1. 接続


002 - PDO と MySQLi の違いと選択肢

// PDO$pdo = new PDO("mysql:host=localhost;dbname=database", 'username', 'password'); 
// mysqli, procedural way$mysqli = mysqli_connect('localhost','username','password','database'); 
// mysqli, object oriented way$mysqli = new mysqli('localhost','username','password','database');

002 - PDO と MySQLi の違いと選択肢

PDOとMySQLiはどちらもオブジェクト指向形式でAPIを提供しますが、MySQLiも提供されますプロシージャル API の場合, この形式は初心者にとって理解しやすいです。ネイティブ PHP mysql ドライバーに精通している場合は、MySQLi インターフェイスを使用して元のデータ アクセスを置き換えるのが簡単であることがわかります。 PDO を使用する利点は、PDO が複数のデータベースをサポートしているのに対し、MySQLi は MySQL のみをサポートしているため、一度マスターすれば、複数のデータベースを自由に使用および接続できることです。

3. データベースのサポート

MySQLi に対する PDO の最大の利点は、MySQLi が MySQLi のみをサポートしているのに対し、PDO は多くの種類のデータベースをサポートしていることです。 PDO がサポートするデータベースを確認するには、次のコードを使用します:

var_dump(PDO::getAvailableDrivers());

複数のデータベースをサポートする利点は何ですか?将来、プログラムを mysql から SQL サーバーまたは oracle に変更する必要がある場合、データベースの変更はプログラム インターフェイスに対して透過的であり、MySQLi を使用している場合は PDO コードの変更が非常に小さいため、PDO の利点が反映されます。 、その後、すべてのユーザー データベースのすべてを書き換える必要があるため、そのような変更のみを行うことができます。

4. 名前付きパラメータのサポート

PDO 名前付きパラメータとパラメータ バインディング:


$params = array(':username' => 'test', ':email' => $mail, ':last_login' => time() - 3600);     
$pdo->prepare('
    SELECT * FROM users
    WHERE username = :username
    AND email = :email
    AND last_login > :last_login');     
$pdo->execute($params);
002 - PDO と MySQLi の違いと選択肢

002 - PDO と MySQLi の違いと選択肢 および MySQLi パラメータ バインディング:


りー002 - PDO と MySQLi の違いと選択肢

002 - PDO と MySQLi の違いと選択肢上記の比較から、PDO は名前付きパラメータを通じて値をバインドするのに対し、MySQLi のパラメータ バインドはドット マーク「?」を使用し、値を疑問符の順序で厳密にバインドすることがわかります。このように、コードは PDO の対応する名前ほど長くはありませんが、パラメータの数が比較的少ない場合は可読性と保守性が低下するという欠点があります。 10 1 つ以上の場合は、疑問符の順序で 1 つずつ値を代入する必要があります。そのうちの 1 つが間違っていると、次の値も間違ってしまいます。

残念ながら、MySQLi は PDO のような名前付きパラメータのバインディングをサポートしていません。

5. オブジェクト マッピング

データベースベースの開発では、通常、データベースからデータを読み取り、オブジェクトを使用してデータを運びます。 PDO と MySQLi はどちらもオブジェクト マッピングをサポートしており、データベースに対応するいくつかのプロパティを持つ User クラスがあるとします。


$query = $mysqli->prepare('
    SELECT * FROM users
    WHERE username = ?
    AND email = ?
    AND last_login > ?');     
$query->bind_param('sss', 'test', $mail, time() - 3600);$query->execute();
002 - PDO と MySQLi の違いと選択肢

002 - PDO と MySQLi の違いと選択肢オブジェクトマッピングがない場合、データを読み取って値を1つずつ割り当てる必要があり、非常に面倒です。

以下の 2 つで使用されるオブジェクトのコードを参照してください:


class User {    public $id;    public $first_name;    public $last_name;     
    public function info()
    {        return '#'.$this->id.': '.$this->first_name.' '.$this->last_name;
    }
}
002 - PDO と MySQLi の違いと選択肢

002 - PDO と MySQLi の違いと選択肢 6. セキュリティ

どちらも SQL インジェクションを防ぐことができます。まず例を見てみましょう。

$query = "SELECT id, first_name, last_name FROM users";     
// PDO$result = $pdo->query($query);$result->setFetchMode(PDO::FETCH_CLASS, 'User'); 
while ($user = $result->fetch()) {    echo $user->info()."\n";
}// MySQLI, procedural wayif ($result = mysqli_query($mysqli, $query)) {    while ($user = mysqli_fetch_object($result, 'User')) {        echo $user->info()."\n";
    }
}// MySQLi, object oriented wayif ($result = $mysqli->query($query)) {    while ($user = $result->fetch_object('User')) {        echo $user->info()."\n";
    }
}

ユーザーが入力したユーザー名パラメーターの値が上記の値 ("'; DELETE FROM users; /*") の場合、この値に対して何も処理を行わなければ、ユーザーは正常にインジェクトします。 delete ステートメントを実行すると、ユーザー テーブル内のすべてのレコードが削除されます。

6.1. 手動エスケープ


$_GET['username'] = "'; DELETE FROM users; /*"
002 - PDO と MySQLi の違いと選択肢

002 - PDO と MySQLi の違いと選択肢 上記は、取得したパラメータの値をエスケープするためにPDOとMySQLi APIに付属する関数を使用しています。

6.2. プリペアドステートメントパラメータのバインド

以下はプリペアドステートメントパラメータをバインドするより効率的で安全な方法です:


// PDO, "manual" escaping$username = PDO::quote($_GET['username']); 
$pdo->query("SELECT * FROM users WHERE username = $username");         
// mysqli, "manual" escaping$username = mysqli_real_escape_string($_GET['username']); 
$mysqli->query("SELECT * FROM users WHERE username = '$username'");

002 - PDO と MySQLi の違いと選択肢

7. パフォーマンス

PDO は他の MySQL 以外のデータベースをサポートでき、MySQLi は MySQL 用に特別に設計されているため、MySQLi のパフォーマンスは PDO よりわずかに優れています。ただし、PDO と MySQLi は、PHP のネイティブ MySQL 拡張ほど高速ではありません。ただし、プログラムのパフォーマンス要件が特に厳しくない場合、これら 3 つはすべて非常に高速であるため、この種のパフォーマンスの比較は実際にはあまり意味がありません。どちらを選択するかについては、実際の状況に基づいて検討する必要があります。

8. 概要

PDO は 12 種類のデータベース ドライバーとその最大の利点である名前付きパラメーター バインディングをサポートしています。これにより、自分のプロジェクトでデータベースに接続するためにどれを使用するかがわかると思います。

関連する推奨事項:

001 - PDO の使用状況の詳細な分析

以上が002 - PDO と MySQLi の違いと選択肢の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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