ホームページ >バックエンド開発 >PHPチュートリアル >002 - PDO と MySQLi の違いと選択肢
PHP を使用してデータベースにアクセスする場合、PHP に付属のデータベース ドライバーに加えて、通常、PDO と MySQLi という 2 つのより良いオプションがあります。実際の開発プロセスでは、どちらを選択するかを決定するには、まず両方について比較的包括的に理解する必要があります。この記事では、それらの違いを分析し、複数のデータベース タイプのサポート、安定性、パフォーマンスなどを比較します。
PDO | MySQLi | |
データベースサポート | 12種類のドライバー | MySQL のみ |
API | OOP | OOP + プロシージャル |
接続 | 簡単 | 簡単 |
名前付きパラメータ | はい | いいえ |
オブジェクトマッピング | はい | はい |
準備完了ステートメント (クライアント側) |
はい | いいえ |
パフォーマンス | 高速 | 高速 |
ストアドプロシージャ | はい | はい |
// 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');
3. データベースのサポート
MySQLi に対する PDO の最大の利点は、MySQLi が MySQLi のみをサポートしているのに対し、PDO は多くの種類のデータベースをサポートしていることです。 PDO がサポートするデータベースを確認するには、次のコードを使用します:
var_dump(PDO::getAvailableDrivers());
複数のデータベースをサポートする利点は何ですか?将来、プログラムを mysql から SQL サーバーまたは oracle に変更する必要がある場合、データベースの変更はプログラム インターフェイスに対して透過的であり、MySQLi を使用している場合は PDO コードの変更が非常に小さいため、PDO の利点が反映されます。 、その後、すべてのユーザー データベースのすべてを書き換える必要があるため、そのような変更のみを行うことができます。
4. 名前付きパラメータのサポート
どちらも 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. 手動エスケープ
// 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'");
PDO は他の MySQL 以外のデータベースをサポートでき、MySQLi は MySQL 用に特別に設計されているため、MySQLi のパフォーマンスは PDO よりわずかに優れています。ただし、PDO と MySQLi は、PHP のネイティブ MySQL 拡張ほど高速ではありません。ただし、プログラムのパフォーマンス要件が特に厳しくない場合、これら 3 つはすべて非常に高速であるため、この種のパフォーマンスの比較は実際にはあまり意味がありません。どちらを選択するかについては、実際の状況に基づいて検討する必要があります。
PDO は 12 種類のデータベース ドライバーとその最大の利点である名前付きパラメーター バインディングをサポートしています。これにより、自分のプロジェクトでデータベースに接続するためにどれを使用するかがわかると思います。
関連する推奨事項:
以上が002 - PDO と MySQLi の違いと選択肢の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。