wordpressのif文がわからない

(表題の件の解答は載ってません。あくまで備忘録です。)

職業訓練も卒業制作の期間に入って、毎日自習状態。
これなら家でやってたほうが環境(現実のとPCスペックと)は良いんだけど、出席足らずで訓練終了認定もらえなかったら元も子もないので、教室に来てしょぼいPCでコード書いてます。Eclipseが使えないのでPHPコードをごりごり書くのは敬遠して、前から気になってたこのブログがW3C先生に怒られてたのを直すことにする。
細かいの(id指定をclass指定に変えるとかね)を全部つぶして、最後に残ったのがページ遷移部分。wordpressのテンプレート通りだと、例えば先頭ページの場合、当然、もっと「最近の投稿」は存在しないのだけれども、<span>タグだけは出力されるので、「中身がないですよー」って怒られる。以下試してみた対処法。

  • if文でくくる。「if(『最近の投稿』を出力する関数』){echo”<span>”. 『最近の投稿』を出力する関数』.”<span>”}」
  • 同じく。「if(『最近の投稿』を出力する関数』){echo”<span>”;(改行)『最近の投稿』を出力する関数』;(改行)echo”<span>”;(改行)}」
  • 同じく。ぐぐってwordpress(というか別の書き方)のif構文に書き換える。「if(): ~ endif;」

以上全部駄目。なぜか<span>タグだけ出力されない。『最近の投稿』は出力される。試しに実行部分の『最近の投稿』を出力する関数』を削って「echo”<span>”」だけにしても『最近の投稿』だけ出力される。幽霊みたいでちょっと怖くなった。
まぁ、良く考えたら、分岐判定部分に記述している関数が実行されて処理を抜けちゃってることがわかったんだけど、今度はそれの直し方がわからない。つまり「if文で判定にある関数の実行結果を参照したい。けど実行はさせたくない」という問題。
if(()==”TRUE”)って明示してみたりしたんだけど全然駄目。

以上、午前中いっぱい使って駄目だったのであきらめる。宿題として覚えておく。まだif構文の理解が甘い。
え、でも治ってるって?<span>タグには&nbsp;突っ込んでW3C先生を騙してます…

<a> escaping malformed URI reference

引き続き模擬ECサイト制作中。ホントに進みが遅い。これでは仕事なら給料もらえないよな。
でも、職業訓練受講中(=職探し中)の今だけできることってことで、じっくりコードを一つ一つ咀嚼しながら打ち込んでます。

で、またエラー覚え書き。今回のはエラーというかW3C先生に怒られた。↓こういうselectボックス書いたら↑の警告が出た。

<select name=”sort”>
<option value=”item_name asc”>商品名・昇順</option>
<option value=”item_name desc”>商品名・降順</option>
<option value=”sale_price asc”>価格の安い順</option>
<option value=”sale_price desc”>価格の高い順</option>
<option value=”release_date asc”>発売日の古い順</option>
<option value=”release_date desc”>発売日の新しい順</option>
</select> 

例によってW3C先生の言ってることが全く分からない。なのでこれもいつも通りグーグル先生に質問する。
日本語ではヒットなし。うーん。結構深刻なやつか?

で、W3C先生(いや、ほんとはFireFoxのVALIDATORのことです)をいじってたら「警告」の三角びっくりマークをダブルクリックしちゃって、ヘルプ画面が出てきた。
知らなかったー。親切ー!英語なんだけど、例まで出して丁寧に説明してくれてるので僕にもわかる。
結局、空白(スペース)をURI(URL)に入れちゃいけないんですって。IETFも言ってるんだって!RFC番号までわざわざ書いてくれなくてもいいですよ!

再度グーグル先生に対処法を質問。今度はいくつか出てきた。
「URIには空白は入れるな。どうしても入れる場合は空白を『%20』に置き換えろ」とのお告げ。
言われる通りselectボックスのコードを書きかえる。

今度はPHP先生に怒られる。MySQL君はそんな単語(例:item_name%20asc)は知らん!ですと。
ですよねー!ってまたまたグーグル先生に泣きつくと、魔法の呪文「rawurldecode()」を教えてくれる。
で、呪文を唱えるとMySQL君OK!そいでまたW3C先生がご立腹。もー!
PHPマニュアルの「rawurlencode()」のページ見たら下のほうに「rawurlencode()」ってある。これだな!
で、片っぱしから唱えて回って解決。

以上、僕が今毎日やっていることを実況中継風にお送りしました。こんな馬鹿なことばかりやってるから時間がかかりますということで。

ちょっと不思議なのは、SQLにデコードして渡しただけで、$_GET変数はいじってないのにW3C先生に怒られたこと。参照渡ししてるってことかな。
PHPは変数の「参照渡し/値渡し」の取り違えで結構間違えることが多い。JSとちょっと感触が違うような。例えばmysql_fetch_array()をwhileでくくる定番の使い方あるけど、
「変数の値を引っこ抜いていって、空になるまで」ってことでしょ。やっぱりPHPは面白いなー。

mysql_real_escape_stringでハマる。

なんちゃって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_~」が呼び出されると、データベース接続を確認?して、なければその場(行)で接続しようとする。当然裸(パスワードなど持たずに)で接続しようとするので、接続できない。ついでに値の受け渡しもできない。
 エラーにならない場合もあるそうだけど、明示的に命令して継続的な接続をしているなら良いんだけど、大多数は「デフォルト接続がオン(パスがなくても接続できる)」状態になっているから接続できてるだけ。セキュリティ注意!
そういうわけで、エラーが出たってことは接続設定が一応(この場合だけは)大丈夫だったってこと。
結局解決策は「データベース接続命令部分を前に移動する」だけ。いつもどおり、ハマり具合と関係なく解決策はカンターン!
参考書の通り打ちこんだんだけどなー。評判通りこの本は「本の通りやっても動かない」。でも文句は全くない。俺の気のせいかもしれないけど、著者さんの意図があるんじゃないかと思っている。「それぐらい書いてなくてもわかるだろ」ってとこと、普通にやってれば苦労するはずのところは、「親切で書いてない」んじゃないかと思ってる。実際今回も貴重な知識が手に入ったし。問題なし。