MySQL

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

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

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

 

しかし!

 

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

 

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

補足
前回のフォーム入力した値をPHPからデータベースへ登録する方法を理解しておくと、この記事の理解が猛烈に進みます!

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
「適当」て部品名あるの?ていう疑問はなしで 苦笑

 

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でMySQLへ入力フォームからデータ登録する方法

>【MySQL】PHPでqueryを使ってデータベースの値を取得する方法

>【MAMP】PHPでMySQLに接続する方法。超ハマったポイントも



  • この記事を書いた人
  • 最新記事
oyakun

oyakun

30代半ば♂妻・子3人の5人で日々激戦中。Google app script&VBA初心者が自分の備忘録を兼ねて「スプレッドシート、Excel、WordPress、plugin」の設定等、主にブログやアフィリエイト周辺のtipsを背伸びしながらご紹介しています。

Copyright© OYAKUDACHI.XYZ , 2019 All Rights Reserved.