今回は、この間業務でPHPをいじっている時に少しハマった件について書いていこうと思います。
すごく初歩的な部分で恥ずかしいのですが、自分への戒めも兼ねて記事にします。
クエリに変数が入らない!
問題が発生したコードは以下のような感じです。
$userId = $app['db']->fetchAll("select user.id from userStatus inner join user on user.originalUserId = userStatus.id where userStatus.username = '?' ",array($testUserId));
データベースからユーザーのIDを取得するためのクエリを発行しているのですが、その際に変数の値を代入することを想定しています。$testUserId
に入っている値が?
に代入されるイメージです。
しかし、これを実行しても望む結果は帰ってきませんでした。
最初はテーブルのjoinの仕方が間違っていたのかとも思ったのですが、どうやらそうではないらしく、30分程度オロオロしてしまいました。
クォーテーションマークはいらなかったんや!
結論から言いますと、原因はここのクォーテーションマークでした。
where userStatus.username = ‘?’
これを外して以下のようにしたら普通に動いたのです..。
$userId = $app['db']->fetchAll("select user.id from userStatus inner join user on user.originalUserId = userStatus.id where userStatus.username = ? ",array($testUserId));
なーぜー??
こちらのサイト様によりますと、シングルクォーテーションで囲った場合は変数の中身が展開されないとのことです。
文字列はダブルクォーテーション「”」かシングルクォーテーション「’」で扱いますが、どちらを使うかによって変数の扱い方が違います。
ダブルクォーテーション「”」で扱った場合には変数が展開されますが、シングルクォーテーション「’」で扱った場合には展開されません。変数の展開とは変数の中身を取り出すかどうかだと思ってください。
そふぃのPHP入門
いや〜、まさかシングルクォーテーションとダブルクォーテーションとで、文字列内での変数の展開の仕方が異なるとは思いませんでした(汗)
確かにクエリの部分も文字列ですもんね。
今までPHPに関しては業務の中でその都度覚えていく感じだったのですが、やはり基礎的な内容については一度しっかりと学習したほうが良さそうですね。
終わりに
今回はPHPでクエリに変数の値を代入する方法(文字列内で展開する方法)を確認しました。
基礎的なことって大事ですね。勉強し直します。
それでは、本日はここまで。
お読みいただきありがとうございました!