Archive for the ‘CODING’ Category

奮闘記01

月曜日, 5 月 18th, 2009

さて私が何と格闘したかと言えば、WordPressMUである。 なんかもう定番の観すらあるね。強敵である。 そもそもデータベース初心者でPHPも大して使ったこと無いヤツが、 WordPressのような巨大なPHPアプリを読み解こうと言うのが オコガマシイのではあるけれども。

今回の課題は、ローカルにWPMUをインストールである。結論から言うと未だ成功していない。 そのものズバリのローカルPCにWordPressMUをインストールなんてページがあったので、 大分参考にした。何でそんなことするの?と言えば、サーバ上ではセキュリティ上の理由から(当然ながら)エラー表示は抑制されてしまう。 しかし初心者の私はエラーログとかエラーメッセージがないと、どこでエラーってるのかよくわからん。 サーバの設定を書き換えるのは(レンタルサーバなので)無理だから、じゃ〜ローカルにインストールしてみますか。 という単純な発想。そこでこんなに詰まるとは…!

私がやった手順を一応書いて置こう。間違いを指摘してくれる人とか現れないかなw 小文字で書いた所は適当に書き換えてます。 因に環境はWinXP、Apache2.2.11、PHP5.2.8、MySQL5.0.77です。細かいVer情報追記。

  1. ソースと日本語化パッチ?をダウンロードして、ドキュメントルート下のサブディレクトリに解凍
  2. MySQLでCREATE DATABASE databasename DEFAULT CHARACTER SET utf8;
  3. MySQLで管理者を追加(GRANT ALL ON *.* TO username@”%” IDENTIFIED BY ‘password’ WITH GRANT OPTION)
  4. もう一丁管理者を追加(上記ページの情報より)GRANT ALL ON *.* TO username@localhost IDENTIFIED BY ‘password’ WITH GRANT OPTION
  5. あーもしかしてFLUSH PRIVILEGESし忘れたかも?
  6. C:\WINDOWS\system32\drivers\etc\hostsを開いて、127.0.0.1にwp.muという別名を設定
  7. DocumentRootに直接インストールしたい訳ではないので、DocumentRootはhtdocsにしておく
  8. Apache再起動
  9. http://wp.mu/dirname/index.phpにアクセス(インストールスクリプトまでは動く)
  10. Submitしても凍りついて先に進まない(ブラウザがフリーズとかではない)

その後の原因究明活動〜。

  1. 取り敢えず複数回同じ動作を行う
  2. ダメなので、MySQLとApacheをつけたり消したり
  3. ダメなので、ProcessExplorerで監視しながらやってみる
  4. どうやらMySQLのモジュールが動いていないとか言う訳ではないらしい(瞬間的にCPU使用量が増加している)
  5. お手上げーなのでフォーラムを覗く
  6. mail関数周りのせい?
  7. しかしデータベースに新しいテーブルが作成されていない!…ということはそれ以前の問題か…。

結論:ワカンネ 家に帰ったらエラーログを洗おう…。PHPのエラーならエラーメッセージが出て実行停止するはずだしなー。 あとはこのへんを参考にして、データベース自体を一回消去してみるべき? でも何も書き込まれてないんだが…。いっそrootユーザでアクセスしてしまうかw そもそもPHPでMySQLが使える様に設定できてないとか?いやいや。

    対処方針
  1. php.iniでMySQLが使える設定になっているかチェック
  2. FLUSH PRIVILEGESしてみる(多分無意味)
  3. rootユーザでアクセスしてみる
  4. mail関数周りの設定を変えてみる
  5. データベースを一度消去(実害はないので)
とりあえず今考えられる対処法はこれくらいかー。エラーログをちゃんと読まないとダメだなー。 では次回朗報を書けることを祈りつつ。

窪田-タイトルは短く本文は長く-史朗

愚痴めいた技術的文書

月曜日, 5 月 4th, 2009

半ば以上覚書である。これをこのBlogに書く意味があるのか気になるが、 もしかしたらWPMUで困っている他のヒトが見つけて喜ぶかもしれないので、敢えて書く。

さて私のWPMU暦は1月程度である。いや、以下か。 とりあえず、みんなのバイブルへリンクを張っておく。

さらに、私が参考にしまくったページを挙げておこう。

  1. CODEXの中のデータベース概要
  2. 関数リファレンス
  3. 英語版の、WPMU_Functions
  4. 同じく、Global_Variables

そもそも私が本格的にWPMU向けコーディングを始めたのは、某サイト管理者から、 「こんな感じの出力をしたい」と相談を受けたためである。 RSSワカンネと思いつつ、参考資料として渡された、コレのソースを解読するのが、私の作業の始まりであった。

SQLシラネと思いつつも、適当に見当をつけて、 自分のブログにテスト記事を投稿して反応を見、 大体把握する。重要だったのは、

$blog_list = $wpdb->get_results( "SELECT blog_id, last_updated FROM " . $wpdb->blogs. " WHERE public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted ='0' " . $order . " " . $limit . "", ARRAY_A );
このへんと、
get_blog_option( $bid, "blogname");
このへんであった。

この時点では理解していなかったが、最初のget_resultsの方では、 先ほどリストで挙げた、グローバル変数のテーブルからデータをひっぱて来ている。

そしてなんだかんだやっていて、投稿のデータをどうやって取得するかが問題になった。 最初はこの関数が使えないかと思ったのだが、どうやらコレは特定のブログにおいてだけ使える(ブログをまたいで記事を取得できない)らしいことが分かった。

んー。どうしたものか…。なにやら検索を繰り返しているうちに、この関数に辿りつく。しかし、最新の投稿のpost_idなんてどうやって取得するんだ?分からん。。。

しばらく眺めていると、get_blog_postの$wpdb->get_row();を、$wpdb->get_results();に変えたらどうなるかなーと思いつく。この頃になると、大分SQL文の構造が分かってきたのである。 そこでとりあえずWHERE句を消して、get_resultsに置き換えたものを走らせて見る。 怖いので、自分のblog_idだけにしておく。

おお!なんか上手くいったみたいだぞ?

こうなりゃこっちのものである。帰ってくる構造体がデータベース概要にあった、wp_postsであることも分かったので、WHERE句で欲しいデータを検索できるようになる。さらに、ORDERで当初はdateの降順にしていたのだが、last_modified降順の方が適切な気がしたので、そうする。

こうして骨組みが出来上がった。 この辺でやっと最終的にどうやって実行するか考える。 うーんやはりプラグインにすべきか…?この段階でようやっと、プラグインの作り方を読み始める。 テンプレートタグとして作るなら、特に何も考えずに関数を書けばいいだけらしい。 そうすることにした。しかし上記ページを読んでいて、コーディング基準に従ってください、とあったのでリンクを飛ぶと、

オレの書き方と全然違う…。しかもデータベースにはなるべく触るなと書いてある…。 「止むを得ない場合を除き」だからまぁ良いか…。と言いつつも、当初は全部データベースから直接データを取得する方法で書いていたのを、できる所は用意された関数を使うように改める。

この辺で、要素技術は大体そろった。しかし、定番であるが、くっつけると何かしらエラーが出るモノである。大体、変数名が食い違ってるとか、書き足した行末にセミコロンがないとか、そんなくだらないことなのだが、WordPress上にPHPを書き込んでも、エラーメッセージは出ない。当然だけど…。しかも、データベースなどWP上じゃないと意味を成さない変数関数が山ほどあるので、ローカルで実行してエラーを洗い出すわけにも行かない。

しょーがないから、上のほうから意味を成すブロックごとに区切り、書いてはプレヴュー、の繰り返しでエラーチェックをしていく。さっきまでエラーが出ておらず、今回の更新でエラーが出たなら、足した部分がおかしいはず、ということで。

意外だったのが、コメントを途中で書き込んでもちゃんと処理される、ということ。 最初はテキストエディタに書き込んだコードをWPに貼り付ける際いちいちコメントを消していたのだが、結論から言うと必要ない作業だった。

それから、これはPHPの仕様かもしれないが、空文字列かどうかの評価が上手く働かなかった。 つまり、ある文字列$strがあったら、if($str=”)とやっても予期した結果が出ない。 PHPManualを見て、空文字列はFALSEに評価されるとあったので、if($str)にして、ifのブロックとelseのブロックを入れ替えたら、大丈夫だった。

あと、どうもヒアドキュメントはWPMUでは上手く動かないらしい。

これもPHPの仕様かもしれないが、文字列の中で(もちろんダブルクォートでクォートした場合の話であるが)変数はきちんと展開されるのだが、関数は中括弧{}で囲んでも、全くパースされない。記憶が正しければ、普通のPHPだったらコレでも大丈夫だった気がするのだが…。

保護中: WPDB-TEST

土曜日, 5 月 2nd, 2009

この投稿はパスワードで保護されています。閲覧するにはパスワードを入力してください: