広告

【MySQL】PHPでprepareを使って安全にデータベースへ登録する方法

2019年9月23日

前回はフォームに入力した値をPHPでデータベースへ登録する方法を紹介しました。

入力フォームからPHPファイル経由でデータ登録成功したGIF

しかし!

入力される値によってはSQLを壊され、最悪の場合はデーターベースの情報を抜き取られてしまうことも。(SQLインジェクション)

そこで今回は「prepare」メソッドを使って、入力フォームからの値をより安全にデータベースへ登録する方法を紹介していきます!

HTMLからPHPへ安全に値を渡すにはprepareを使う

HTMLフォームに入力された値を、PHPからMySQLへ安全に接続するには

  1. prepare
  2. execute

といった2つのメソッドを利用します。

prepare・executeを使ったサンプルコード↓

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

参考:mysqli_stmt::execute

今回はphpMyAdminの中に作成しておいた、データベース「test」のテーブル「部品登録」にprepare / executeメソッドを使ってデータの追加を行っていきます

フォームの値を登録する先のテーブル

補足
入力フォームのhtmlファイルは前回と同じものを利用してます。

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に「適当」と書かれたレコードが登録されたのが確認できました

idの1に「適当」と書かれたレコードが登録された画像

OYAKUN
OYAKUN
「適当」て部品名あるの?ていう疑問はなしで 苦笑

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の値をデータベースへ登録する方法もあるようです。(紹介できたら後ほど...)

なんだかテキスト中心になってしまって、ちょっとくどい感じになってしまったスミマセン...

OYAKUN
OYAKUN
HTML画面へ表示
php-database-shutoku
PHPでデータベースを取得して画面表示する方法

フォームで入力した値をPHPでデータベースから取得・表示する方法を記しています。 補足 PHP・prepareで安全にD ...

続きを見る

関連記事:PHPでMySQLへ入力フォームからデータ登録する方法
関連記事:【MySQL】PHPでqueryを使ってデータベースの値を取得する方法
関連記事:【MAMP】PHPでMySQLに接続する方法。超ハマったポイントも