• DB接続後ののSQ
    L文作成のSQL文について質問です。 『コード』 ...
  • guest 
    DB接続後ののSQL文作成のSQL文について質問です。

    『コード』
    $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日調べてみたのですが、「こういう書き方で決まったものなのだろう」という感じで、解説が見当たりませんでした。

    細かくて必要にない箇所かもしれないのですが、分からなかったため質問させていただきます。
    よろしくお願いいたします。
    回答 1

    ウェブカツコーチ 
    講師からの回答
    まず、「:email」のように、PHPのSQL文内で「:xx」と書かれているものは変数ではありません。
    クエリ実行時のセキュリティを高めるために、一時的に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

    guest 
    回答と参考URL拝読いたしました。

    1)名前付きプレースホルダーはシングルクォーテーションで囲む必要がないこと、囲むと文字列で登録されること、理解いたしました。


    2)連想配列の形になっているため、クォーテーションで囲むということを理解いたしました。
    PHP arrayの参考URLから


    // キー は 文字列 または
    // 整数のどちらかです。
    (上記URL内引用)

    とあったので、数字以外のものはクォーテーションで囲むという認識をいたしました。

    とてもわかりやすく参考URLまでつけていただき助かりました。
    ありがとうございました。