MYSQLIリファレンス:http://php.net/manual/en/mysqli.query。 php
PDOリファレンス:http://php.net/manual/en/book.pdo。 php
ほとんどのPHPプログラマーは、MySQLiおよびMySQL拡張機能の使用方法を発見しました。ただし、PHPデータオブジェクト(PDO)は、オブジェクトを操作し、プリペアドステートメントを取得する方法を提供します。これにより作業がはるかに簡単になります。
PDOは、複数のデータベース間で均一なアクセスを可能にするPHPのデータベースアクセスツールです。データベースに固有の構文はサポートしていませんが、接続文字列を変更するだけで簡単に実行できる、さまざまなプラットフォームやデータベース間の比較的シームレスな切り替えが可能です。
以下は、主にMySQLおよびMySQLi拡張機能を使用しているプログラマーを対象とした、PDOに関する小さな情報であり、前者の優位性を概説しています。次の数段落でさまざまな側面を検討します。
- データベースのサポート
PDO拡張機能には、PDOドライバーが作成された任意のデータベースにアクセスする機能があります。利用可能なPDOドライバーは多数あり、そのうちのいくつかには、Free TDS、Sybase、Microsoft SQL Server、IBM DB2、Firebird / Interbase 6、Oracle Call Interface、PostgreSQLデータベースなどにアクセスするためのPDOドライバーが含まれます。
ドライバーはすべてのシステムで自動的に使用できるわけではないため、使用可能なドライバーを見つけて、必要なドライバーを追加する必要があります。
- データベース接続
特定のデータベースに依存するデータベース接続を確立するためのさまざまな構文があります。 PDOを使用するときは、操作がtry / catchブロックにラップされていること、および例外手法を利用していることを確認する必要があります。
通常、接続は1つだけで済み、データベースハンドルをnullとしてプログラミングすることで接続が閉じられます。さまざまなリソースサイトで、より具体的なオプションと構文を調べることができます。
- エラー処理
PDOでは、エラー処理の例外を使用できます。そのため、PDOをtry/catchブロックでラップすることをお勧めします。このようにして、例外を生成するために、PDOを関連するエラーモード属性に強制することができます。
サイレント(デフォルト)、警告、例外の3つのモードがあります。後者の2つは、DRYプログラミングでより役立ちます。 「警告」エラーモードはデバッグに役立ち、「例外」モードでは、人がシステムを悪用するために使用する可能性のあるデータを非表示にしながら、適切なエラー処理を行うことができます。
- 挿入と更新
PDOは、一般的なデータベースの挿入と更新の操作を、Prepare >> [Bind] >> Execute
という単純な2段階のプロセスに凝縮します。 。この方法を使用すると、SQLインジェクションによる悪意のある攻撃からの保護を提供するPDOのプリペアドステートメントを最大限に活用できます。
プリペアドステートメントは事前にコンパイルされたSQLステートメントであり、このデータをサーバーに送信することで複数回実行できます。プレースホルダー内で使用されるデータがSQLインジェクション攻撃から自動的に保護されるという点で有利です。
ユーザー名とパスワードのフィールドがDBに存在するかどうかを確認するためのPDOコード:
<?php
//Connections
try {
$handler = new PDO('mysql:host=localhost;dbname=s','root', '*');
$handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e){
exit($e->getMessage());
}
$name = $_POST['name'];
$username = $_POST['username'];
$email = $_POST['email'];
$password = $_POST['password'];
$password1 = $_POST['passwordconf'];
$ip = $_SERVER['REMOTE_ADDR'];
//Verifcation
if (empty($name) || empty($username) || empty($email) || empty($password) || empty($password1)){
$error = "Complete all fields";
}
// Password match
if ($password != $password1){
$error = "Passwords do not match";
}
// Email validation
if (!filter_var($email, FILTER_VALIDATE_EMAIL)){
$error = "Enter a Valid email";
}
// Password length
if (strlen($password) <= 6){
$error = "Choose a password longer then 6 character";
}
if(!isset($error)){
//no error
$sthandler = $handler->prepare("SELECT username FROM users WHERE username = :name");
$sthandler->bindParam(':name', $username);
$sthandler->execute();
if($sthandler->rowCount() > 0){
echo "User Already Exists.";
} else {
//Securly insert into database
$sql = 'INSERT INTO users (name ,username, email, password, ip) VALUES (:name,:username,:email,:password,:ip)';
$query = $handler->prepare($sql);
$query->execute(array(
':name' => $name,
':username' => $username,
':email' => $email,
':password' => $password,
':ip' => $ip
));
}
}else{
echo "error occured: ".$error;
exit();
}
このリファレンスが、将来のプロジェクトで自分でコードを開発するのに役立つことを願っています。