「PHPの学習でプリペアドステートメントについて知りたい」
「プリペアドステートメントを活用して何ができるの?」
PHPの学習を進めていくと、「プリペアドステートメント」という単語が出てくることはないでしょうか。
実は「PHP」と「プリペアドステートメント」は関係性があり、しっかりと知識を身につけておくことで今後の開発に大きく役立てることができます。
「プリペアドステートメント」についてまだ知識がない方も、この記事で解説していきますのでぜひ参考にしてみてくださいね!
目次
「プリペアドステートメント」と「PHP」の関係性
まずは「プリペアドステートメント」について解説をしていきます。
PHPを学習し始めた方にとっては、あまり馴染みのない単語だと思います。
しかしPHPとプリペアドステートメントは関係性が深いため、今後しっかりとPHPを身につけるのであればぜひ覚えておきたい内容となっています。
プリペアドステートメントとは?
プリペアドステートメントとは、SQL文で値がいつでも変更できるように、変更する箇所のみ命令文を作る仕組みのことです。
SQL文に対して一部分的を変更の可能な場所として定義し、定義したものを自由に変更できるようにするためのデータベース機能のことを指します。
なぜ「PHP」と関係があるのか
先ほど、プリペアドステートメントとは “SQL文に対してのデータベース機能” と述べましたが、PHPとの関係性はしっかりとあります。
PHPはSQLで作成したデータを取り出すことができるため、SQLのデータベース機能である「プリペアドステートメント」と「PHP」は関係性がきちんとある、ということなのです。
SQL文で使用する「プリペアドステートメント」や「クエリー」などの単語については、プログラミング初心者向け「プリペアドステートメントとプレースホルダとクエリー」まとめにてご紹介しています。
プリペアドステートメントの役割とは?
ではもう少し「プリペアドステートメント」について、どのような役割があるのか詳しくみてみましょう。
SQLに次のようなテーブルがあるとして、プリペアドステートメントの役割について解説をしていきますね。
テーブル名:users
データ:
name | |
---|---|
ウェブ太郎 | web@test.com |
カツ太郎 | katsu@test.com |
ウェブカツ太郎 | webkatsu@test.com |
SQLでこのようなデータがある場合、次のような記述でデータの取得を行います。
1 |
select フィールド名 from テーブル名 where 条件; |
この記述に当てはめると、各データの取得方法は次のようになります。
ウェブ太郎の場合
1 |
select * from users where name="ウェブ太郎"; |
カツ太郎の場合
1 |
select * from users where name="カツ太郎"; |
ウェブカツ太郎の場合
1 |
select * from users where name="ウェブカツ太郎"; |
【PHP】プリペアドステートメントを使う方法とは?
それでは、PHPで「プリペアドステートメント」を使いデータを取得する方法についてご紹介していきます。
PHPでプリペアドステートメントを使用する場合は、prepare()関数を使用することで可能となります。
記述方法は以下の通りです。
1 2 3 4 5 6 7 8 |
<?php $userName = 'mysql'; $password = 'mysql'; // PDOオブジェクトの生成(データベース接続) $pdo = new PDO('mysql:dbname=test;host=localhost', $userName, $password); // プリペアドステートメントで SQLをあらかじめ用意しておく $stmt = $pdo->prepare('select * from user where id = ? and name = ?'); |
prepare()関数を使用するためには、PDOオブジェクトを生成しなければいけません。
PODオブジェクトは、データベースを利用するために重要なオブジェクトとなっています。
PDOオブジェクトの生成時にデータベースの接続情報を渡すことで、対象となるデータベースに対してSQLを実行することが可能になります。
prepare()関数の()内が、プリペアドステートメントによるSQLとなっています。
1 |
'select * from user where id = ? and name = ?' |
この部分ですね。
$pdo->prepare()とすることにより、接続したデータベースに対して実行するプリペアドステートメントのSQLをセットします。
ちなみにプリペアドステートメントの 「?」の部分は、プレースホルダーと呼ばれるものです。
プレースホルダーについても、先ほどご紹介したプログラミング初心者向け「プリペアドステートメントとプレースホルダとクエリー」まとめにてまとめています。
PHPでbindvalueを使ってみよう
次に「bindvalue()関数」についてご紹介します。
bindvalue()関数は、プリペアドステートメントで使用するSQL文の中でプレースホルダーに値をバインドするための関数のことで、PHPを習得する上で覚えておきたい内容となっています。
bindvalue()関数を使う場合は、以下のように記述をします。
1 |
bindValue ($パラメータID, $バインドする値 [, $PDOデータ型定数] ) |
第一引数には「パラメータID」を使用しますが、これはプレースホルダーの種類によって指定方法が異なるため注意しましょう。
前回の章でご紹介したコードのように、プレースホルダーに「?」を使用する場合、パラメータIDには1から始める整数値で指定します。
例えば「?」ではなく「:id」など、名前で使用する「名前付きプレースホルダー」の場合には、パラメータIDにプレースホルダーと同じ:idなどの文字列で指定します。
第二引数には、バインドする値を渡しましょう。
第三引数には、オプションでバインドする値に対してはっきりとデータ型を指定することが可能となります。
その際に指定する場合は、「PDO::PARAM_* 定数 」を使用しましょう。
デフォルトでは、「PDO::PARAM_STR」がセットされています。
返却値は、バインドに成功した場合にはbool値のTRUEが、失敗した場合にはbool値のFALSEが返却されることになります。
擬似プレースホルダーの場合
「?」のような疑問符プレースホルダーを使用する場合には、bindvalue()関数を使用してSQL文に値をバインドする場合、以下のように記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php $userName = 'mysql'; $password = 'mysql'; // PDOオブジェクトの生成(データベース接続) $pdo = new PDO('mysql:dbname=test;host=localhost', $userName, $password); // プリペアドステートメントで SQLをあらかじめ用意しておく $stmt = $pdo->prepare('select * from user where id = ? and name = ?'); // 値をバインド $id = 1; $name = 'ウェブカツ太郎'; $stmt->bindValue(1, $id, PDO::PARAM_INT); // ① $stmt->bindValue(2, $name); // ② // executeでクエリを実行 $stmt->execute(); |
名前付きプレースホルダー
「:id」など名前で使用する「名前付きプレースホルダー」の場合は、以下のように記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php $userName = 'mysql'; $password = 'mysql'; // PDOオブジェクトの生成(データベース接続) $pdo = new PDO('mysql:dbname=test;host=localhost', $userName, $password); // プリペアドステートメントで SQLをあらかじめ用意しておく $stmt = $pdo->prepare('select * from user where id = :id and name = :name'); // 値をバインド $id = 1; $name = 'ウェブカツ太郎'; $stmt->bindValue(':id', $id, PDO::PARAM_INT); $stmt->bindValue(':name', $name); // executeでクエリを実行 $stmt->execute(); |
まとめ
いかがでしたか?
この記事では「プリペアドステートメントの基礎知識と活用方法」についてご紹介しました。
PHPとSQLは関係性がとても高いため、きちんと内容を覚えておきましょう。
この記事がPHPの学習を進める上でお役に立てれば幸いです。