‘PHP’ カテゴリーのアーカイブ

yumでphpMyAdminを入れる

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

yumでphpMyAdminをインストールすることができる。
方法は、rpmforgeのリポジトリを使えばよい。

x86の場合、以下を実行する。

rpm -Uhv http://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS//rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm

その後は/etc/yum.repos.d/rpmforge.repoでenable=1に変更した上で

yum install phpMyAdmin

を実行すればよいはず。

これをすると、/usr/share/phpmyadminにインストールされるうえに、/etc/httpd/conf.dの中にphpmyadmin.confが自動的にできるので、非常に楽。


PHPList:CoreServerでのWordPressとの連携設定メモ

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

WordPressのPHPList-Form-Integrationプラグインで、メールマガジン購読の際にメアド確認せずに一気に登録させるように設定していたのだが、テスト環境(社内サーバ)ではうまくいっていたのに、CoreServerではうまくいかなかった。

PHPList-Form-Integration内のpholist.phpを書き換えたり、デバッグモードでcURLの内容を出力したりしたら、セッションが引き継げてないのが原因だとわかった。そのセッションが引き継げてない理由自体は全然わかってなかったのだが、他の案件が忙しくなってこの件を一旦放置していた。CakePHPの案件にも一旦目処がついたので、この件の調査を再開しようと思った矢先、閃いた。もしかしたら、モード(版)が違うのではないか?と。

モード?それはすなわち、CoreServerだとPHPはモジュール版とCGI版がある。PHPListはセーフモードだと警告メッセージが出続けるのでCGI版で動かす必要がある。そのときに、CGI版で動かす設定を/lists/admin/以下の.htaccessとphp.iniに記述していた。ところが、/lists/以下には設定してなかったので、/lists/以下はモジュール版で動いていた。

PHPList-Form-Integrationの購読フォームの動作は、

  1. cURLで管理者としてログイン
  2. メールアドレス確認をしない場合、管理者としてメールアドレスを登録処理する

である。
管理者ログインがCGI版でログイン、メールアドレス登録がモジュール版で処理をしようとしていたため、モジュール版とCGI版ではセッション管理が異なるためメールアドレス登録が管理者扱いではなくなり、処理できてなかったわけである。ということは、/lists/以下もCGI版にしてしまえばよい。

PHPList全体をCGI版で動かすように.htaccessとphp.ini(CoreServerの場合のやつ)を修正したら、メールアドレス確認なしで動いてくれるようになった。気付けばなんともあっけないのだが、原因がわからずに深夜まで残業してしまったりしていたので何気に悔しかった。まあでも閃いてよかったわ〜。

ちなみにメールアドレス確認なしにした理由は、ケータイから登録された場合にPHPListのメアド確認用画面がケータイからは確認できないからです(テーブルレイアウトででかい!)。


CakePHP:【解決】AU携帯でSecurityComponent

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

SecurityComponentを使うとAUケータイでブラックホールに吸い込まれるという話を昨日書いたわけですが、解決方法が見つかったので、それを書きます。
ちなみにCakePHPユーザ会のほうにも投稿しておいた。

$form->create で出力されるfieldsetを消す方法

昨日の投稿にも書きましたが、SecurityComponentを使うとAUケータイではdisplay:noneになってるfieldsetタグ内のトークンがPOSTされません。よって、fieldsetタグのみを削除すれば動くに違いないということで、fieldsetタグを削除する方法です。

参考にしたサイトは以下です(英語)。
http://cakeqs.org/eng/questions/view/disable_fieldset_around_an_hidden_form_element

CakePHPユーザ会のほうに書いた方法でもいけると思いますが、何度も使いたいので自分はKtai LibraryのKtaiヘルパーにメソッドを追加しました。

/app/views/helpers/ktai.php

/**
 * Ktai helper class for CakePHP1.2
 */
class KtaiHelper extends Helper {

	var $helpers = array('Html', 'Form'); // 'Form'を追加した

	var $_lib3gk = null;

// ... 最後に以下の2つのメソッドを追加
	function form_create($model = null, $options = array()){
		$out = $this->Form->create($model, $options);
		return strip_tags($out, '<form><input>');
	}

	function form_end($options = null){
		$out = $this->Form->end($options);
		return strip_tags($out, '<form><input>');
	}
}

View側では、以下のように使います。

<?php echo $ktai->form_create($model, $options); ?>

AUケータイで試してみましたが、結果は上々でした。


CakePHP:AU携帯とSecurityコンポーネント

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

現在、とあるアイドルグループの携帯用アンケートサイトを5営業日以内で作れという至上命令が下っており、そのために久々にCakePHP復活!Ktai Libraryを使ってどのケータイでも対応しちゃうぜ!ちなみにKtai Libraryを使うのは初。本は買ってた。

データベース設計は同僚がやってくれたので(彼はDBのスペシャリスト)、俺はBakeでソースを生成し、デザイナが作ったデザインをViewに組み込み、Modelの設定を行い、Captchaコンポーネントを使った画像認証を組み込み、コントローラーに処理をゴリゴリと書き(Fat Modelになるような仕様ではないため。まぁ汎用的なメソッドはModelに作ったけど)、FireMobileSimulatorで確認しながら開発。

一通り実装が完了したので、実機(俺のAU携帯と後輩のSoftbank携帯)とDoCoMoのシミュレータで試すとやっぱり動かなかったりした。まぁそういうことを試すためだからいいんだけど。ソースを修正しては試す。これによりDoCoMoはOK。SoftbankもOK。しかし、AUだけPOSTしたら404と言われる。なぜだ!

Ktai Libraryを使ってたら、redirectのところでURLの組み立てで変になった箇所があったので(Controller::redirect()の引数に配列形式で値を渡すと壊れる。引数をis_arrayでチェックすると直った)、また似たようなことが起こってるのかなぁ~とApacheのアクセスログを見てみると、ちゃんとPOST先のURLにアクセスしている。しかし、Content-lengthが0。0とはおかしいじゃないか!

まさかと思ってCSRF対策用に使っていたSecurityコンポーネントのBlackHoleCallback関数を設定してログを出すようにしてみたら、ビンゴ。BlackHoleに吸い込まれているじゃないか。しかも、俺はここのPOSTはデータベース更新に関係していないのでCSRF対策してない($this->Security->requireAuthに追加していない)。にもかかわらず、トークンが発行されてるのにも納得がいかない。

何がなんだかわけがわからないので、CakePHPユーザ会で検索してみたら、有力な情報を得た。

携帯のblackhole 対策

Securityコンポーネントのトークンはfieldsetタグ中に囲まれているのだが、このfieldsetタグにはdisplay:none;が設定されている。AU携帯はPOSTするときにdisplay:none;が設定されている領域の値をPOSTしないらしい。サーバ上にはトークンが設定されているにも関わらずトークンがPOSTされないから、トークン不一致でブラックホール行きという仕組みだったのか。

今思いついてる解決策は、

  • Formヘルパー自体を修正する(ライブラリ自体の修正はやりたくない)
  • $form->create(), $form->end()で取得したソースからfieldsetタグを正規表現で取り除く処理を実装する(若干難しそうだが一番意味がありそう)
  • Securityコンポーネントを使わずに独自のCSRF対策を施す(一番現実的か?)

である。まぁ時間があれば2番目で行きたいが、3番目かな。原因が突き詰められたので、Securityコンポーネントを外してAUで試したところ、普通に動いてくれた。あ~、よかったぁ~。ひとまず安堵。

まぁセキュリティ系の課題はあるものの、処理自体は2人日で実装完了。やはりCakePHPの開発効率はかなりいいなぁと思う。簡単かつ早いかつ安心。ただ、時々超ハマる…。

【解決しました!】
次の投稿でこの問題は解決したのでリンクはっておきます。
CakePHP:【解決】AU携帯でSecurityComponent


PHPList: 空メールのアドオンがあるらしい

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

PHPListでケータイ対応する方法を調査中。
空メールで購読、解除ができるアドオンがあることを発見!

Blank_Mail公開します。PHPListで空メール

これすごいんじゃないの!?と思って試してみようとしたのだけれど、やっぱりというか、共用サーバでは無理みたいである。エイリアスを使って特定ユーザ宛に届いたメールをプログラムに渡して処理するんだけれど、CoreServerは受信メールを自動ではプログラムに渡せない。ここらへんがCoreServerの限界なんじゃないのかなと思うんだけれど…。

ソースを改造してPOP3で受信して処理するようにすればできるんだろうけど、それって即時返信じゃないからなぁ…。CRONでやるにしてもタイムラグがあるし。。。それでもいいんなら、できそうだけどなぁ。。。


WordPress:Ktai StyleとPHPList Form Integration

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

ちょっとメモ代わりに。
WordPressで、Ktai Styleプラグインを使ってPHPList Form Integrationプラグインのフォームを出そうとしたら、出なかった。理由は、PHPList Form Integrationでフォームを出すときのコードがショートコードとかじゃなくてHTMLのコメントを使っているので(<!–phplist form–>というもの)Ktai Styleのどこかで消されているようだ。

ちなみに試した各プラグインのバージョンは以下の通り。

  • Ktai Style: 1.74
  • PHPList Form Integration: 1.7

根本的な解決方法かどうかはわからないけれど、
最も簡単だと思われる解決策は、以下の通りかなと。

# /plugins/phplist-form-integration/phplist.phpの最後のほう
# phplist_callbackの呼び出し優先順位を99にしない
//add_filter('the_content', 'phplist_callback', 99);
add_filter('the_content', 'phplist_callback');

要は、Ktai Styleによって<!–phplist form–>が削除される前にphplist_callbackを実行するように修正すればいいんじゃないかということです。これで、携帯で見たときにもメルマガ購読フォームが表示されましたし、購読登録できました。


PHP:cURLでBasic認証

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

WordPressのPHPList Form Integrationプラグインを使って、メールアドレス確認なしでメルマガ購読許可できるように設定していたのに、できていなかった。だがPHPList自体には入力したメールアドレスは登録されている。一体何故だ?と思ったら、Basic認証のせいだった。

実は、Basic認証があると登録すらされないので、上の話はBasic認証対応してたのだけど、cURLが2回通信するのに、最初のPHPListにログインする通信でBasic認証してなかった!2回目の通信は成功していたのだけど、1回目の通信が失敗していたからログインできていないせいで一般ユーザからの登録扱いとなり、身元不明扱いになっていた。完全にミスってたなぁ。

$username = 'ユーザ名';
$password = 'パスワード';
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
// curlによるその他のオプション設定・通信は省略

PHP:WordPressのプラグインでsession_start()

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

WordPressでsession_start()するのを、読み込みページ用関数が呼ばれた先頭でやっていたら、エラーが出ていた。あかんやん。タイミング的には確かに、もうページ表示してる途中だから、どこかでechoされてたらアウトなわけです。ということは、session_start()するタイミングは、initだ!

add_action('init', 'hoge_session_start');
function hoge_session_start(){
  session_start();
}

これでエラー出なくなった。


PHP:PHPListをCORESERVERで動かす

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

メルマガをWordPressでできないか?ということについて、以前に調査していたのだが、やりたいことに該当する方法ではなかったので、オープンソースのメルマガ発行ソフトのPHPListを使うことにしようかと思って調査したのでメモ。ちなみにWordPressとPHPListを繋ぐPHPList Form Integrationというプラグインがあるのでこれを使う予定。

参考にさせていただいたサイト

ではいきまーす。

  1. まずはここからPHPListの日本語化されたものをダウンロード。
    http://www.d-ip.jp/download/pivot/entry.php?id=14
  2. ダウンロードしたファイルを解凍し、public_html直下にあるlistsディレクトリをWordPressと同じディレクトリに入れる。
  3. lists/config/config.phpを修正する。インストールするデータベース名、データベースユーザ名、パスワードなどを修正。ここはWordPressと同じものでOK!!あとPLUGIN_ROOT_DIRが原因でエラーが出てたので、コメントアウトしておいた(この辺りはよくわかってない)。TESTの値も0にしておく(そうしないとメール送れないので。後で0にしてもよい。)
  4. PHPがsafe modeで動いてると問題があるかもね!というメッセージが出続けるので、CGIモードで動かすために、lists/admin/.htaccessに以下を追加する。
    AddHandler application/x-httpd-phpcgi .php
  5. CGIモードで動くとphp.iniの情報が変わってしまうので、独自に設定するためにlists/admin/以下にphp.iniを作成する。
    magic_quotes_gpc              = On
    register_globals              = Off
    session.auto_start            = Off
    mbstring.http_input           = pass
    mbstring.http_output          = pass
    mbstring.encoding_translation = Off
    # /tmp以下にセッションファイルが作れないというエラーが出たので、
    # 自分のディレクトリ直下にtmpを生成しておくこと
    session.save_path = "/virtual/********/tmp"
    
  6. http://自分のWordPressのドメイン/lists/admin/にアクセスし、PHPListをインストールする。
  7. 管理者のパスワードを変えておく。
  8. インストールが問題なく終わったら、サンプルでインストールされているリスト(メルマガのこと)をアクティブにしておく(WordPressのプラグイン経由でPHPListを使うため)。
  9. CORESERVERのcronを使ってメルマガ配信するために、シェルスクリプトを作成する。名前はphplist.shとした。
    #!/bin/sh
    wget -q -O - 'http://自分のWordPressのドメイン/lists/admin/index.php?page=processqueue&login=管理者名&password=パスワード' >/dev/null
    

    このファイルは/virtual/********/phplist.shに置いた。実行権限を与えておくこと(705)。

  10. CORESERVERのcronに/virtual/********/phplist.shを登録する。
    普通のサーバのcronならば、

    */15 * * * * /virtual/********/phplist.sh
    

    でよいと思うのだが、CORESERVERでは分に入力できる文字列が2文字までみたいなので、*/15と入力できなかった!やっていいのかどうかはわからないが、4行分使って、

    0 * * * *  /virtual/********/phplist.sh
    15 * * * *  /virtual/********/phplist.sh
    30 * * * *  /virtual/********/phplist.sh
    45 * * * *  /virtual/********/phplist.sh
    

    と設定しておいた。
    これで15分毎にチェックされ、キューに入っているメルマガが15分毎に配信されるはず。

さっきまで試していたことなので、だいたい合っているはず。

WordPressのプラグインであるPHPList Form Integration
の設定については後でまた書きたいと思う。


PHP:MBFpdfでバグ!!["]が出力できない

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

MBFpdfでバグを発見した!!バージョンは1.0b。
["](ダブルクォーテーション)が出力できないというものだ。

$l+=$ascii ? $cw[$c] : $hwkana ? 500 : 1000;

上のソースの$cw[$c]の$cにダブルクォーテーションが入ってるのだが、
undefined index ” と言われてしまう…。
そこで、$cwをprint_rで表示してみたら、
array(…,[\"] => 500, …);
という記述を発見。ダブルクォーテーションあるけれど、バックスラッシュでエスケープされてるじゃないか!?まあこれが正しいと仮定した場合、$cw["]は定義されていないわけだから、$cが["]の場合、$c = ‘\”‘;にしてしまえばいいんじゃないかと思ったので、mbfpdf.phpに手を入れることを決意!!

MBMultiCellメソッドを修正。

//Get next character
$c=$s[$i];
// 以下3行を追加
if($c === '"'){
	$c = '\"';
}

その後、MBWriteメソッドを修正。
行番号は、上記の作業後なので、この付近と思ってください。

//Get next character
$c=$s[$i];
// 以下3行を追加
if($c === '"'){
	$c = '\"';
}

こうしたところ、ダブルクォーテーションがPDFファイルに出力できた。


Get Adobe Flash playerPlugin by wpburn.com wordpress themes