L文作成のSQL文について質問です。 『コード』 ...
クエリ実行時のセキュリティを高めるために、一時的にSQL文内に当てはめておくもので、プレースホルダとよばれます。
クエリ実行時には「:email」ではなく正式な値($email変数の中身)がバインド(紐付け)されます。
詳細は下記ウェブカツブログで確認してください。
参考:https://webukatu.com/wordpress/blog/1638
※なお「PHP プレースホルダ」で検索をすると「?」を使ったタイプの方法等も出てくると思いますが、「:xx」のように名前をつけて紐付けを行うことから名前付きプレースホルダとも呼ばれます。
その上で、頂いたご質問への回答になりますが、
>1、ここでのINSERT文内のVALUESの後ろは変数としているため、シングルクォーテーションで囲まないという認識であっていますでしょうか?(囲むと値となるため)
正確には「変数としているため」ではなく、名前付きプレースホルダーのためシングルクォーテーションで囲っていません。囲むと文字列として認識され、「:email」等のようにそのままDBに登録されてしまいます(数字のみ受付けるカラムだとSQL文法エラーになります)。
2、arrayの後ろは変数値なのでしょうか?シングルクォーテーションで囲っているので値なのでしょうか?
arrayの後ろは連想配列の形になっているため、クォーテーションで囲っています。
連想配列のキーが”:email”、値が$emailのようにすることで、ここでプレースホルダ(:email)にクエリ実行時に置き換える正式な値($email変数の中身)をバインドしているのです。
PHP arrayの参考:https://www.php.net/manual/ja/language.types.array.php
1)名前付きプレースホルダーはシングルクォーテーションで囲む必要がないこと、囲むと文字列で登録されること、理解いたしました。
2)連想配列の形になっているため、クォーテーションで囲むということを理解いたしました。
PHP arrayの参考URLから
// キー は 文字列 または
// 整数のどちらかです。
(上記URL内引用)
とあったので、数字以外のものはクォーテーションで囲むという認識をいたしました。
とてもわかりやすく参考URLまでつけていただき助かりました。
ありがとうございました。
部活の学習一覧
Lesson 01
「WEBサービスと必要な機能」
Lesson 02
「画面を設計しよう!」
Lesson 03
「テーブルを設計しよう!part1」
Lesson 04
「テーブルを設計しよう!part2」
Lesson 05
「テーブルを設計しよう!part3」
Lesson 06
「DB作成」
Lesson 07
「画面を作ろう!」
Lesson 08
「画面を作ろう!part2」
Lesson 09
「ユーザー登録機能を作ろう!」
Lesson 10
「ユーザー登録機能を作ろう!part2」
コーヒーブレイク
「投資の小話」
Lesson 11
「ログイン機能を作ろう!」
Lesson 12
「ログアウト機能を作ろう!」
Lesson 13
「退会機能を作ろう!」
Lesson 14
「プロフィール編集機能を作ろう!」
コーヒーブレイク
「書いて書いて書きまくれ!」
Lesson 15
「パスワード変更機能を作ろう!」
Lesson 16
「パスワードリマインダー機能を作ろう!」
Lesson 17
「商品登録機能を作ろう!」
Lesson 18
「商品登録機能を作ろう!part2」
Lesson 19
「商品登録機能を作ろう!part3」
Lesson 20
「商品一覧表示機能を作ろう!」
Lesson 21
「商品詳細画面を作ろう!」
Lesson 22
「商品検索機能を作ろう!」
Lesson 23
「連絡掲示板機能を作ろう!」
Lesson 24
「お気に入り機能を作ろう!」
Lesson 25
「マイページ機能を作ろう!」
コーヒーブレイク
「はたらくプログラミング 第5話」
ご意見箱
『コード』
$sql = 'INSERT INTO users (email,password,login_time,create_date) VALUES(:email,:pass,:login_time,:create_date)';
$data = array(':email' => $email, ':pass' => $pass,
':login_time' => date('Y-m-d H:i:s'),
':create_date' => date('Y-m-d H:i:s'));
『疑問点』
VALUESの後ろでは(:email,省略)
と書き
arrayの後ろでは(':email => $email,省略)
とあります。
同じ変数値(:email)を指しているように思ったのですが、シングルクォーテーションで囲む違いについて疑問に思いました。
『調べたこと』
シングルクォーテーションは「SQL 文中のシングルクォーテーションは定数を意味し、リテラルと呼ぶ」ということがわかりました。
コロンの意味は、「SQLステートメント内の変数値のプレースホルダーを示す一般的な文字。」とありました。
『質問』
1、ここでのINSERT文内のVALUESの後ろは変数としているため、シングルクォーテーションで囲まないという認識であっていますでしょうか?(囲むと値となるため)
2、arrayの後ろは変数値なのでしょうか?シングルクォーテーションで囲っているので値なのでしょうか?
arrayにおいてはPHP言語だと認識しているのですが、ここの(:email 等)を混同するのがおかしな話なのでしょうか?
1日調べてみたのですが、「こういう書き方で決まったものなのだろう」という感じで、解説が見当たりませんでした。
細かくて必要にない箇所かもしれないのですが、分からなかったため質問させていただきます。
よろしくお願いいたします。