前回はフォームに入力した値をPHPでデータベースへ登録する方法を紹介しました。
しかし!
入力される値によってはSQLを壊され、最悪の場合はデーターベースの情報を抜き取られてしまうことも。(SQLインジェクション)
そこで今回は「prepare」メソッドを使って、入力フォームからの値をより安全にデータベースへ登録する方法を紹介していきます!
前回のフォーム入力した値をPHPからデータベースへ登録する方法を理解しておくと、この記事の理解が猛烈に進みます!
-
PHPでMySQLへ入力フォームからデータ登録する方法
入力フォームからPHPを経由してMySQLへデータ登録する方法を紹介します。 補足 「PHPのqueryメソッドでMyS ...
続きを見る
HTMLからPHPへ安全に値を渡すにはprepareを使う
HTMLフォームに入力された値を、PHPからMySQLへ安全に接続するには
- prepare
- execute
といった2つのメソッドを利用します。
「prepare」を翻訳すると「用意する、整える、準備する」という意味で、メソッドとしての役割は「SQL文の実行準備を行い文オブジェクトを返す」といったものです。
ポイントとなるのが、prepareの値を実行する「execute」メソッドの存在です。
prepareの値に疑問符?が存在する場合でも、executeメソッドにより適切なデータに置き換えられ安全にデータベースへ登録することができます。
PHPを安全に実行するprepare / executeメソッドの記述方法
prepareメソッドの構文は以下のとおりです。
PDO::prepare ( string $statement [, array $driver_options = array() ] ) :
参考:PDO::prepare
executeメソッドの構文は以下です。(手続き型)
mysqli_stmt_execute ( mysqli_stmt $stmt ) : bool
今回はphpMyAdminの中に作成しておいた、データベース「test」のテーブル「部品登録」にprepare / executeメソッドを使ってデータの追加を行っていきます。
入力フォームのhtmlファイルは前回と同じものを利用してます。
<h2>入力フォーム</h2>
<!-- 入力フォームを作成 -->
<form action="prepare.php" method="post">
<textarea name="buhin" cols="30" rows="10" placeholder="ここに記入"></textarea><br>
<button type="submit" name="button">登録する</button>
</form>
<!-- 入力フォームここまで -->
PHPでprepareとexecuteを使ったサンプル
最初にPDOでmysqlに接続します。
$db = new PDO('mysql:dbname=test;host=localhost;charset=utf8','root','root');
次にフォームから受け取った値を、MySQLへ安全に登録するためにprepareメソッドを使ってSQL文を準備します。
$sql = $db->prepare('INSERT INTO 部品登録 SET 部品名=?,登録日=NOW()');
最後にexecute()を記述して、prepareの値を実行します。
$sql->execute(array($_POST['buhin']));
全部つなげると以下↓
<?php
try{
$db = new PDO('mysql:dbname=test;host=localhost;charset=utf8','root','root');
$sql = $db->prepare('INSERT INTO 部品登録 SET 部品名=?,登録日=NOW()');
$sql->execute(array($_POST['buhin']));
echo '入力フォームを値をMySQLへ登録しました!';
} catch(PDOException $e){
echo 'DB接続エラー' . $e->getMessage();
}
?>
フォームの値をPHPのprepareを使って安全に登録!
実際に入力フォームに適当な値を入れて「登録」してみます。
phpMyAdminのテーブル「部品登録」を覗いてみると、idの1に「適当」と書かれたレコードが登録されたのが確認できました!
prepare / executeのサンプルコード補足
prepareによって準備したSQL文は、「execute」メソッドにて適切に置換され実行されます。
$sql = $db->prepare('INSERT INTO 部品登録 SET 部品名=?,登録日=NOW()');
$sql->execute(array($_POST['buhin']));
例えば?に「テキスト」が入っていれば、自動的に""(ダブルクオーテーション)で囲まれる、といった置換が行われるわけですね。
PHP側で自動で適切なデータへ変換してくれるから、安全にデータ登録ができるようになるということです。
「部品名=?」の?に「入力された値」が格納され、その値に対してexecuteメソッドが自動的にMySQL登録に適切なデータへ置換してくれます。
まとめ
phpでprepareを使って安全にMySQLデータベースへ登録する方法を紹介しました。
正確には、prepare・executeを使ったデーターベースの登録方法でしたね〜
今更ですがexecuteメソッドの代わりに、「bindParam」でprepareの値をデータベースへ登録する方法もあるようです。(紹介できたら後ほど...)
なんだかテキスト中心になってしまって、ちょっとくどい感じになってしまったスミマセン...
-
PHPでデータベースを取得して画面表示する方法
フォームで入力した値をPHPでデータベースから取得・表示する方法を記しています。 補足 PHP・prepareで安全にD ...
続きを見る
関連記事:PHPでMySQLへ入力フォームからデータ登録する方法
関連記事:【MySQL】PHPでqueryを使ってデータベースの値を取得する方法
関連記事:【MAMP】PHPでMySQLに接続する方法。超ハマったポイントも