MySQLのテーブル「○○_users」と「○○_shipping」。その名の通り会員情報と出荷情報のテーブルなんだけど、両方でカラム名に「state」ってのがある。
ここまでで想像がつくように値の操作で失敗。shippingテーブルにusersテーブルをLEFT JOINしてSELECT *。
その結果のstateの値はどちらのものでしょうか。
今日失敗する前の僕なら、先に呼んでるし、左外部結合だし、迷わずshippingって答えるんだけど、正解はusersだった。
解決は「select *,○○_shipping.state」でいけた。けど上書き気持ち悪いね。
今後、カラム名は必ず「テーブル名_カラム名」って付けよう。それとももっと良い方法があるのかな?
10年11月26日(金)‡14時28分09秒 ‡
未分類
なんちゃってEC制作メモ。
著者検索部分完了して、やっぱりエラー。
『Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2) ~』
うーん。良く意味がわからない。で、まずはsql文を吐き出させて、見てみると、エスケープしてる検索用文字が” “。値が渡ってない。
そうか!mysql_real_escape_stringが悪いんだ!と思い、お馴染みの『htmlspecialchars』に変更。ちゃんとENT_QUOTESにして。
OK!治った!俺すごい!
と思ったんだけど、そもそもmysql_real_escape_string と htmlspecialchars ってどう違うんだ?と思い調べる。
わかったのは、簡単に言うとブラウザ出力のためのサニタイジングに『htmlspecialchars』を使い、sql(格納するデータ以外でデータベースに渡す文字)向けのサニタイジングには『mysql_real_escape_string』を使う。逆や併用は意味がないか、誤動作する場合がある。
俺ダメじゃん!
で、もう一度真剣にググってたら、同じエラー解説があった。俺のバカ。
つまり、PHPのsql関連命令(この場合はmysql_~)は「データベースに接続していないと動かない」。
「mysql_~」が呼び出されると、データベース接続を確認?して、なければその場(行)で接続しようとする。当然裸(パスワードなど持たずに)で接続しようとするので、接続できない。ついでに値の受け渡しもできない。
エラーにならない場合もあるそうだけど、明示的に命令して継続的な接続をしているなら良いんだけど、大多数は「デフォルト接続がオン(パスがなくても接続できる)」状態になっているから接続できてるだけ。セキュリティ注意!
そういうわけで、エラーが出たってことは接続設定が一応(この場合だけは)大丈夫だったってこと。
結局解決策は「データベース接続命令部分を前に移動する」だけ。いつもどおり、ハマり具合と関係なく解決策はカンターン!
参考書の通り打ちこんだんだけどなー。評判通りこの本は「本の通りやっても動かない」。でも文句は全くない。俺の気のせいかもしれないけど、著者さんの意図があるんじゃないかと思っている。「それぐらい書いてなくてもわかるだろ」ってとこと、普通にやってれば苦労するはずのところは、「親切で書いてない」んじゃないかと思ってる。実際今回も貴重な知識が手に入ったし。問題なし。
10年11月17日(水)‡13時12分37秒 ‡
未分類