Monthly Archives: 10月 2007 - Page 2

requires PEAR Installer (version >= 1.6.0) などと出た時の pearアップグレード

Linuxのディストリビューションパッケージでpearを入れて、例えばMail_Mimeをインストールした時など、


# pear install Mail_Mime
WARNING: channel "pear.php.net" has updated its protocols, use "channel-update p
ear.php.net" to update
pear/Mail_Mime requires PEAR Installer (version >= 1.6.0), installed version is
1.4.9
pear/Mail_mimeDecode requires PEAR Installer (version >= 1.6.0), installed versi
on is 1.4.9
pear/Mail_mimeDecode requires package "pear/Mail_Mime" (version >= 1.4.0, exclud
ed versions: 1.4.0)
No valid packages found
install failed

pearのバージョン新しくしてよ、と怒られます。でも、WARNINGメッセージ通りに

# pear channel-update pear.php.net

としても、何も変わらないことが多いので、pear upgrade でやってしまいましょう。

# pear upgrade pear

無事、アップグレードできましたでしょうか。

MySQLをソースからインストールした時の、phpMyAdmin設定

LinuxでMySQLをソースからインストールした時にphpMyAdmin用の設定をするメモです。phpMyAdminというか、mysqliですが。php.iniのmysqli設定をインストールしたMySQLのmy.cnfと合わせるというだけですね。

my.cnfで


[mysqld]
port = 3306
socket = /tmp/mysql.sock

と設定しましたので、

php.ini中の

mysqli.default_port = 3306
mysqli.default_socket = /tmp/mysql.sock

をmy.cnfと合わせて記述します。

phpMyAdminの設定ファイル、config.inc.php(無い場合は、config.sample.inc.phpをリネームorコピーしてください)の

$cfg['blowfish_secret'] = 'hoge-blowfish';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['extension'] = 'mysqli';

extensionをmysqliに変更します。
auth_typeはお好みで、auth_type=cookieの場合はblowfish_secretを設定しなくてはいけません。

MySQLは大体パッケージで入れてしまうので、久々にソースからインストールした時に少し戸惑ってしまった、というメモでした

Zend Framework – Zend_Controller_Requestで使えるgetメソッド

Zend_Controller_Requestで使えるメソッドですが、IDEなどで行っているとコード補完で出てくるメソッドが、Zend_Controller_Request_Abstractの持つメソッドしか出てこないので、大概の場合Zend_Contoller_Request_Httpの物も使えますよ、ということで。もちろん大概の場合というのはHTTPリクエストをしている場合、ということですが。

[php]
$this->_request->getRequestUri());
$this->_request->getServer());
$this->_request->getEnv());
[/php]

などなど。
$this->_request->getServer()は$_['SERVER']を取得、といった具合です。

Zend Framework – ControllerのPlugin メモ

Zend FrameworkのControllerにPluginとして色々な処理を組み込めます。
マニュアルはこちら
PluginはDispatcherの色々なアクションにロジックを追加できます。

  • routeStartup() は、Zend_Controller_Front が ルータ をコールしてルートに対するリクエストの評価を始める前にコールされます。
  • routeShutdown() は、 ルータ がリクエストのルーティングを終了した後にコールされます。
  • dispatchLoopStartup() は、Zend_Controller_Front がディスパッチループに入る前にコールされます。
  • preDispatch() は、アクションが ディスパッチャ でディスパッチされる前にコールされます。 このコールバックは、プロキシやフィルタ的な動作をさせることができます。 リクエストの内容を変更してディスパッチフラグをリセット (Zend_Controller_Request_Abstract::setDispatched(false) を使用します) することで、現在のアクションをスキップさせたり置き換えたりすることができます。
  • postDispatch() は、アクションが ディスパッチャ でディスパッチされた後にコールされます。 このコールバックは、プロキシやフィルタ的な動作をさせることができます。 リクエストの内容を変更してディスパッチフラグをリセット (Zend_Controller_Request_Abstract::setDispatched(false) を使用します) することで、新しいディスパッチ先アクションを指定することができます。
  • dispatchLoopShutdown() は、Zend_Controller_Front がディスパッチループを抜けた後にコールされます。

SessionやACLでよく使用されると思われるpreDispatchだとこんな感じでしょうか。

[php]
require_once 'Zend/Controller/Plugin/Abstract.php';
class hogePlugin extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
// ここでPluginの処理を行う。
}
}
?>
[/php]

組み込むには(起動ファイルなどで)フロントコントローラにセットします。

[php]
$front = Zend_Controller_Front::getInstance();
require_once(‘/YOUR_PLUGIN_PATH/hogePlugin.php’);
$front->registerPlugin(new hogePlugin());
[/php]

なかなか分かりやすい作りだと思います。

Zend Framework – Zend_Db_Selectのメモ

マニュアル

例 10.44. 流暢なインターフェイスの使用例

[php]
$select = $db->select()
->from( …テーブルとカラムを指定します… )
->where( …検索条件を指定します… )
->order( …ソート条件を指定します… );
[/php]

joinとかは
[php]
// できあがるクエリは、このようになります
// SELECT p."product_id", p."product_name", l.*
// FROM "products" AS p JOIN "line_items" AS l
// ON p.product_id = l.product_id
$select = $db->select()
->from(array(‘p’ => ‘products’),
array(‘product_id’, ‘product_name’))
->join(array(‘l’ => ‘line_items’),
‘p.product_id = l.product_id’);
[/php]

で。JOIN LEFTは
[php]
joinLeft(table, condition, [columns])
[/php]

こんな感じ。メモメモ。

FirebugでPHPをデバッグするツールまとめ : アシアルブログ

PHPからFirebugのconsoleにメッセージを表示させるの、一時期はやってたんですが。

FirebugでPHPをデバッグするツールまとめ : アシアルブログ

PEAR_Logから使えたらかなり便利かもしれません。
FirebugのconsoleからPHPが叩けたら素敵なんですが無茶言うなですね。

DBから取得したデータを一度に沢山表示する場合の高速化

より良い環境を求めて – DBから取得したデータを一度に沢山表示する場合の高速化に色々と興味深い情報が載っています。

  • アクセラレータを利用する
  • foreach を減らす
  • 圧縮転送を行う
  • 文字コードにEUC-JPは使わない

EUC-JPを使わない、というのは面白いですね。IEだとEUC-JPの展開が遅いとか。

PHPでexecを使わずに外部コマンドを簡単に実行する方法

PHPでexecを使わずに外部コマンドを簡単に実行する方法 – ぎじゅっやさんで、exec()やsystemを使わないコマンドの実行方法が載っています。それの方法は『バッククォートで囲む』。

[php]
$ls = `ls -al`;
[/php]

シェルプログラミングみたいですね。
ちょっとしたPHPで簡単にコマンドを使いたい時、簡単に書けますね。

XenoPocket – SimpleXMLのシリアライズ

SimpleXMLのシリアライズができないとの話。ふむふむ。知らなかった。中で活性化してないんですかね。
SimpleXMLは

[php]
$s = simplexml_load_file(‘hoge.xml’);
$name = $s->name;
[/php]

としもオブジェクトが入ってしまいますね。

[php]
$s = simplexml_load_file(‘hoge.xml’);
$name = (string) $s->name;
[/php]

キャストすればOKですが。これを忘れてハマるのでメモ。

TableKitのEditに対応するコントローラアクション習作

簡単・便利のTableKitはかなりお役立ちのテーブルソートScript。最近ちょいちょい使うので、これのEditableに対応したZend FrameworkのActionをメモっておきます。

基本として、

&row=n: The row index of the edited cell
&cell=n: The row index of the edited cell
&id=id: The id attribute of the row, it may be useful to set this to the record ID you are editing
&field=field: The id attribute of the header cell of the column of the edited cell, it may be useful to set this to the field name you are editing
&value=xxxxxx: The rest of the POST body is the serialised form. The default name of the field is ‘value’.

というリクエストを取得して、データの修正を行います。

[php]
public function updateFromTablekitAction()
{
$content = null;

// IDを取得。
try {
$id = $this->_getParam(‘id’);

// テーブルのidを取得したり、どの表から取得、というのを取得するための苦肉の処理です。。
list($from,$id) = explode(‘:’, $id);

if (!ctype_digit($id)) {
throw new Exception();
}
$field = $this->_getParam(‘field’);
$value = $this->_getParam(‘value’);

$hoge = new HOGE_TABLE();
$hoge_row = $hoge->find($id)->current();
$hoge_row->$field = $value;
$id = $hoge_row->save();

$site_row = $hoge->find($id)->current();
$this->view->content = $hoge_row->$field;
}
catch (Exception $e) {
$this->view->content = “#ERROR#”;
}
}
[/php]

テーブルに再表示するための文字列として$contentをview_helperに渡していますが、まあ普通にechoしたほうが楽な気がします。
どのテーブルの値を変更するのか、$fromなどから取得したりします。
Validateも、もう少しきちんと行わなければいけないですね。
場当たり的ですが、今のところエラー表示をひとまとめにtry~catchでくくってます。
idの列などEditableにしない列は

[html]

[/html]

と、テーブルヘッダclassを”noedit” しておくことで編集不可になります。
#noeditのクラス名は衝突を避けるため変更可能です。
#TableKit.options.noEditClass = ‘unavailabe’
#とか。