PHP MySQLはステートメントを準備しました
MySQLの注入を防止するために準備されたステートメントは非常に便利です。
プリペアドステートメントおよびバインドされたパラメータ
同じSQL文の複数を実行するための準備された文、およびより効率的に実行します。
プリペアドステートメントの作品次のように:
前処理:データベースに送信されたテンプレートSQL文を作成します。 予約パラメータの値「?」マーク。 例えば:
INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
データベースの分析、SQL文のテンプレートクエリの最適化を実行し、コンパイルし、結果が出力されません格納されます。
実行:最後に、(「?」マーク)を結合アプリケーションに渡されたパラメータの値は、データベースが文を実行します。 パラメータ値が同じでない場合のアプリケーションは、何度も実行することができます。
SQL文を直接実行と比較して、準備された文は、2つの主な利点があります。
(文が実行されているが)準備された文は劇的にだけクエリ、分析時間を短縮します。
サーバーの帯域幅を削減するためのパラメータを結合した、あなただけの代わりに、文全体のパラメータクエリを送信する必要があります。
後のデータの正当性を保証するために、パラメータ値を送信するために、異なるプロトコルを使用しているため、SQLインジェクションに対するプリペアドステートメントは、非常に便利です。
MySQLiをステートメントを準備しました
次の例では、準備されたステートメントでMySQLiのを使用し、対応するパラメータをバインドします。
例(プリペアドステートメントを使用して、MySQLiを)
$サーバー名= "localhost"を。
$ユーザ名= "ユーザ名";
$パスワード= "パスワード";
$ DBNAME = "MYDB」。
//接続を作成します。
$コン=新しいmysqliの($のサーバー名、$ユーザ名、$パスワード、$ dbnameは);
//接続のテスト
場合($ conn-> connect_error){
死ぬ( "接続に失敗しました:"。$ conn-> connect_errorを)。
}
//前処理および結合
$のstmt = $ conn->( "?(MyGuests(ファーストネーム、姓、電子メール)VALUES。INSERT INTO ,,)??")を調製。
$ Stmt-> bind_param( "SSS"、$のFIRSTNAME、$の姓、$メール)。
//パラメータを設定し、実行します
$ファーストネーム= "ジョン"。
$姓= "ドウ";
$メール= "[email protected]";
$ Stmt->実行();
$ファーストネーム= "メアリー"。
$姓= "萌え";
$メール= "[email protected]";
$ Stmt->実行();
$ファーストネーム= "ジュリー";
$姓=「ドゥーリー」。
$メール= "[email protected]";
$ Stmt->実行();
「新しいレコードが正常に挿入されている "エコー;
$ Stmt->クローズ();
$ Conn->クローズ();
?>
次の例のコードの各行を解析します:
SQL文では、我々は疑問符(?)を使用し、ここでは、疑問符の整数、文字列、倍精度浮動小数点、およびブール値を置き換えることができます。
次に、私たちはbind_paramで()関数を見てみましょう:
機能バインドSQLパラメーター、およびデータベース・パラメータの値を教えてください。 残りのパラメータは、「Sssを「カラム処理パラメータのデータ型。 sの文字は、データベースパラメータ文字列を指示します。
パラメータの4つのタイプがあります。
- 私 - 整数(整数)
- D - ダブル(倍精度浮動小数点)
- S - 文字列(文字列)
- B - BLOB(バイナリラージオブジェクト:バイナリラージオブジェクト)
各パラメータは、タイプを指定する必要があります。
データ型のパラメータを使用すると、SQLインジェクションのリスクを減らすことができ、データベースに指示します。
注:追加データ(ユーザー入力)を挿入したい場合は、データの検証が非常に重要です。 |
PDOは、内のステートメントを準備しました
次の例では、我々はPDOと結合パラメータでプリペアドステートメントを使用します。
例(PDO準備されたステートメントを使用して)
$サーバー名= "localhost"を。
$ユーザ名= "ユーザ名";
$パスワード= "パスワード";
$ DBNAME = "myDBPDO";
{しよう
$コン=新しいPDO( "mysqlの:ホスト= $サーバー名; dbnameに= $ dbnameに"、$ユーザ名、$パスワード);
// PDOエラーモードの例外を設定します
$ Conn->のsetAttribute(PDO :: ATTR_ERRMODE、PDO :: ERRMODE_EXCEPTION)。
//前処理およびSQLバインドパラメータ
$のstmt = $ conn->準備( "(MyGuests。INSERT INTOファーストネーム、姓、電子メール)
VALUES(:FIRSTNAME ,:姓,:メール) ");
$ Stmt-> bindParam( ':FIRSTNAME'、$のFIRSTNAME)。
$ Stmt-> bindParam( ':LASTNAME'、$の姓);
$ Stmt-> bindParam( ':メール'、$メール)。
//行の挿入
$ファーストネーム= "ジョン"。
$姓= "ドウ";
$メール= "[email protected]";
$ Stmt->実行();
//別の行を挿入します
$ファーストネーム= "メアリー"。
$姓= "萌え";
$メール= "[email protected]";
$ Stmt->実行();
//別の行を挿入します
$ファーストネーム= "ジュリー";
$姓=「ドゥーリー」。
$メール= "[email protected]";
$ Stmt->実行();
「新しいレコードが正常に挿入されている "エコー;
}
キャッチ(PDOExceptionます$ e)の
{
..エコー$ sqlを「<BR> "は$ e-> getMessage()の;
}
$コン= nullを。
?>