どうも!「とも(@_tomo_engineer)」です!
PHPからデータベースにアクセスし、CRUD処理を行う場合
PDO(PHP Data Object)を利用し、MySQLに接続、SQL文の実行を行うと思います。
その際、クエリの実行には2種類の流れが存在します。
- query()を利用する場合
- prepare()を利用する場合
この両者の違いを説明します。
この違いは端的に言えばこうです、
- query()の場合、ユーザからの入力を利用しない
- prepare()の場合、ユーザからの入力を利用する
この記事ではPHPのqueryを利用する場合と、prepareを利用する場合についての違いをまとめます。
あわせて読みたい
query
queryメソッドを利用して、SQL文を実行する場合はユーザからの入力をSQL文に含めることが出来ません。
つまり、
select * from DB名
のようなユーザからの入力情報を含まないSQL文を実行する場合はquery()を利用します。
とても単純なクエリの実行方法です。
prepare
prepareメソッドを利用して、SQL文を実行する場合はユーザからの入力をSQL文に含める事が出来ます。
つまり、
INSERT INTO テーブル名(カラム名) VALUES(ユーザからの入力情報);
と言ったユーザからの入力情報を含むSQL文を実行する場合はprepare()を利用します。
prepareメソッドを利用した場合の例とフローはこちらです。

// ユーザからの入力情報を含むSQL文の作成
$sql = 'Insert into テーブル名(カラム名) values(:変数)' ;
// ユーザの入力情報をSQL文に含める準備
$statement = $database->prepare($sql);
// SQL文にユーザからの入力情報を代入
$statement->bindParam(':変数', $_POST['hoge']);
// ユーザからの入力情報を含んだSQLを実行
$statement->execute();
別の書き方
下記のようにSQL文にユーザからの入力情報を直接入力する事も可能です。
insert into テーブル名(カラム名) values($_POST['hoge']);
これは、ユーザから悪意のある情報がある場合、SQL文に含めてしまう事は危険です。
よって

この手順を踏む事で、SQL文の実行に注意を払うのです。
まとめ
PHPでSQL文を実行する際の2種類の方法
- queryメソッド⇨ユーザからの入力を含まないSQLを実行
- prepareメソッド⇨ユーザからの入力を含むSQLを実行
についてまとめました。
ボクは色々なメソッドがあって混乱しましたが、まとめると頭がスッキリしました!
違いを明確にして使って行こう!
あわせて読みたい