PHP

【PHP】queryとprepareの違い

どうも!「とも(@_tomo_engineer)」です!

PHPからデータベースにアクセスし、CRUD処理を行う場合

PDO(PHP Data Object)を利用し、MySQLに接続、SQL文の実行を行うと思います。

その際、クエリの実行には2種類の流れが存在します。

  • query()を利用する場合
  • prepare()を利用する場合

この両者の違いを説明します。

この違いは端的に言えばこうです、

  • 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を実行

についてまとめました。

ボクは色々なメソッドがあって混乱しましたが、まとめると頭がスッキリしました!

違いを明確にして使って行こう!