ここでは、SQL言語を扱う際に登場する「クエリー」「プリペアドステートメント」と「プレースホルダ(プレースホルダー)」について、プログラミング初心者の方向けに解説します。
クエリーとは?
SQL文のことを「クエリー」と呼びます。
SQL文というのはちょうどこんなものですね。
1 |
SELECT * FROM users WHERE name = 'ウェブカツ太郎'; |
DB(データベース)が理解して処理する命令文のことです。
これをIT業界では「クエリ(クエリー)」とも呼びます。実務では
「クエリ投げるじゃん?(=「DBへSQL文を送信する・通信する」という意味)」
「クエリ何回投げてんの?(=「DBへ何回通信してるの?」という意味」
なんて言葉の使い方をしています。
クエリとは「問い合わせの質問」という英語の意味で、SQL文というものが「このユーザーの情報あります?」と通信するための「命令文」で「DBへ通信を行う時の質問文」なので
SQL=クエリ
と呼ばれるんですね。
そして、
SQL(SQL文)=クエリ=DBへの通信
といった具合に同じ意味になるんですね。
ややこしいですが、「フォルダ」のことを「ディレクトリ」と呼ぶのと一緒なんです。
プリペアドステートメントとは?
プリペアドステートメントとは簡単に言えばSQLを使ってDBへ通信をする際に使われる値を「サニタイズする仕組み」のことです。
プリペアドステートメントはどんなプログラミング言語でも共通する言葉です。
サニタイズに関しては、詳しくはこちらをご覧ください。
プレースホルダ(プレースホルダー)とは?
プリペアド・ステートメントのことを「静的プレースホルダ」と呼びます。(動的プレースホルダというものも存在しますが知っておく必要もないので省略します)
「プレースホルダ」に関連する機能は呼び名がさまざまで、「バインド機構」といったりもします。
要は
プリペアド・ステートメント = プレースホルダ = バインド機構
ってことです。名前は違えど言っていることは同じ。
こんな専門用語がITにはたくさん存在します。(さっきの「クエリー」もそうですが。。)
ちなみに「ライブラリ」「モジュール」「プラグイン」というのも初心者がごちゃごちゃになりやすい用語です。
(厳密には違うんですが、実際の現役エンジニアでもちゃんと違いがわかっている人はわずかで、結構ごっちゃにしています。)
話を戻しますが、プレースホルダというのは、要は「値をバインドさせる仕組み」ということなんですね。
「バインド」というのは「挟み込む」という意味です。
実際には下記のようなコードになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php $pdo = new PDO('mysql:dbname=test;host=localhost;charset=utf8', $user, $pass, [ PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, ]); $stmt = $pdo->prepare('SELECT * FROM users WHERE name = :name'); $stmt->bindValue(':name', 'ウェブカツ太郎', PDO::PARAM_STR); $stmt->execute(); $data = $stmt->fetchAll(); ?> |
9行目でprepareというメソッド(メソッドというものがわからない人は「関数の仲間」だと思ってください)を使ってSQL文を作成しています。
この時、「:name」という形式で書く事で、その箇所に後から値を突っ込むことができます。
そして10行目ではbindValueメソッドを使ってSQL文の「:name」の箇所に値を挿入しているわけですね。
最終的に下記のようなSQL文になり、executeメソッドを使って実行されます。
実行されるとそのSQL文をDB(データベース)くんへ通信を行って渡し、受け取ったDBくんが処理を行なって結果を返してくれます。
ちなみに$stmtとう変数名は習わし的な名前でついているだけで$aaaとかでもなんでも可能です。(ただの変数の箱を用意しているだけなので)さらに細かく言うと$stmtという変数の箱の中に9行目のprepareメソッドを実行することで「文オブジェクト」というものが返ってくるので、それを箱に詰めています。そのオブジェクトはbindValueやexecuteメソッドがついているため、$stmt->bidValue()などとやることでそのオブジェクトが持っているメソッドを実行することができます。$stmtの箱に文オブジェクトが入った時点で$stmt=文オブジェクトで、文オブジェクトがもつbidValue()などメソッドを実行できる。ということですね。
(ここらへんの細かい部分はPHPオブジェクト志向部を履修してから理解が出来てくるとこなので今はさらっと流してください)
話を戻して、以下のようなSQL文が最終的に作られます。
1 |
SELECT * FROM users WHERE name = 'ウェブカツ太郎' |
こういったようにSQL文にいくつか後で値を挿入できる箇所をつくって、後から値を挿入して最終的なSQL文を作り上げる仕組みのことを
プリペアードステートメントといい、プレースホルダともいうわけです。(部活の練習動画では後で挿入できる箇所を「虫食い穴」と例えています。SQL文に穴型をつくっておいて、そこに後から値を流し込むイメージです。ちょうど金属の金型に金属を流し込んでいるようなイメージですね。)
また、
後から値を挿入する=値をSQL文に挟み込む
というイメージなので「バインド(挟む)」という意味の「バインド機構」と呼ばれてもいるわけですね。