【初心者向け】php・MySQLでプレースホルダを使う方法

こんにちは、

運動後のタンパク質摂取に夢中なサトウです。
さて、本題に入りたいと思います。

phpやMySQLの学習を進めると「プレースホルダ」という言葉を聞いたことがある方も多いのではないでしょうか。
「プレースホルダ」はセキュリティ上非常に重要な考え方ですが、具体的な処理の方法について理解できない方も少なくないのでは、、、。と思い、今回は「プレースホルダ」について分かりやすく説明していきます。

phpやMySQLを学び始めた方や、「プレースホルダ」について分からない方は、是非読んでみてくださいね。

プレースホルダとは

SQLインジェクションとは

プレースホルダを解説する前に前提知識として必要になる「SQLインジェクション」について解説していきます。SQLインジェクションとは、開発者の想定をしていないSQLを組み立てて、データベースに対して実行させようとする攻撃方法です。

例えば以下のようなSQLを実行するphpプログラムあったとします。
「users」というテーブルにある「username」カラムとフォームの入力情報($username)が一致しているか検索するという内容です。

サンプルコード

例:入力フォーム

入力フォームに「ウェブカツ太郎」と入力した場合のSQLはこうなります。

サンプルコード

これが開発者の想定している通常のSQL文です。

次にこの入力フォームに以下のように入力するとどうなるでしょうか。
(※このプログラムは絶対に実行しないようにしてください。)

サンプルコード


このSQLは「;」によってSQL文を終了させて、usersテーブルから全テーブルを削除する(DELETE FROM users)といった内容になります。
入力フォームにこのようなSQL文を入力されてしまうと、開発者の全く想定しないデータベース操作が実行できてしまいます。

これがSQLインジェクション(不正なSQLを「injection:注入」すること)です。ユーザー入力が伴う箇所は、SQL文の中に直接phpの変数を書かずにデータベースに登録する仕組みが必要となります。

プレースホルダの概要

そこで利用するのがプレースホルダという仕組みです。

プレースホルダは「変数のように値が変動する箇所」と「データベースへ登録する処理」の間に挟むことで変動する箇所を「値」として処理するしくみです。入力フォームに万が一不正な値(SQL文)が入力されても、SQL命令に関わるような殊文字」は無効化されるため、SQL文として実行されることはありません。

値が変動する箇所(変数)→プレースホルダ→データベースに登録

プレースホルダはSQL文の変数部分を「:」で始まる文字列で指定して書くことができます。

サンプルコード

変数部分($username)がプレースホルダ(:username)になっていますね。

プレースフォルダでを使ってフォームからデータ登録してみよう!

ここからは実際にプレースホルダを使ってフォームから入力した情報を登録してみましょう。
入力フォームから情報を入力してデーベースに登録してみます。

入力フォーム

サンプルコード

処理の流れ

(1)formタグからpost送信
(2)post送信されているかemptyでチェック
(3)post情報を変数に入れる
(4)DBへ接続の準備
(5)PDOオブジェクトを生成してDBへ接続
(6)SQL文の作成:usersテーブルに名前情報を登録する
(7)prepareメソッドを使ってSQLの実行準備
(8)SQLの実行:executeメソッドでプレースホルダに値をセット
※プレースホルダを使用してSQLを実行しているのが(6)(8)になります。

formタグからpost送信

まずformタグの中からusernameをキーにしてpost送信します。

サンプルコード(該当部分)

post送信されているかemptyでチェック

post送信しているかどうかは!emptyで判定しています。

サンプルコード(該当部分)

post情報を変数に入れる

postされていれば、その情報を$usernameという変数に入れます。

サンプルコード(該当部分)

DBへ接続の準備

例外処理(try-catch)を書いて、データベースへの接続準備を開始します。

サンプルコード(該当部分)

PDOオブジェクトを生成してDBへ接続

この例ではPDOオブジェクトでDB接続します。ここでは(4)で設定した情報を引数に使用します。

サンプルコード(該当部分)

SQL文の作成:usersテーブルに名前情報を登録する

ここでプレースホルダを使用します。入力フォーム情報を入れた$usernameをそのまま使用せず、プレースホルダで「:user_name」と記載しています。テーブルに情報登録する際はINSERT INTOというSQL文を使用します。

サンプルコード(該当部分)

 

prepareメソッドを使ってSQLの実行接続準備

SQL実行前の準備処理でprepareメソッドを使用します。

サンプルコード (該当部分)

 

SQLの実行:executeメソッドでプレースホルダに値をセット

(6)で設定したプレースホルダ使ってデータベースに登録処理をexecuteメソッドを使って実施しています。
プレースホルダで入力情報を値に無害化したことで、安全にデータベースに登録することが可能になります。

サンプルコード(該当部分)

まとめ

いかがでしたか?今回は、「プレースホルダ」について説明しました。

phpやMySQLを学び始めた頃は、「プレースホルダ」について難しく感じることあると思います。ですがまずは簡単な処理(データベースに情報を登録する処理等)からコードを書くようにしていけば、「プレースホルダ」について体系的に理解できる日が来ると思います。焦らずにゆっくりと理解を深めていってくださいね。

この記事が、phpの学習に役立つと嬉しいです。

BLOGコンテンツをパーソナライズします

あなたは現在「プログラミング学習者」ですか?