Posts tagged PHP
シェルから CLI版 PHP を実行した場合の返り値
0シェルから PHP を実行してその結果を元にシェルで処理をしたいので、PHP からシェルに値を戻す方法を調べた。
exit で引数を指定できるのを知らなかったのでメモ。
●参考PHPマニュアル
PHP: exit – Manual
正常終了の場合
exit(0);
異常終了の場合
exit(1);
とすれば
/usr/bin/php hoge.php if [ $? -ne "0" ]; then 異常終了時の処理 else 正常終了時の処理 fi
と “$?” で php からの返り値をチェックしてその後の処理の分岐に使用できます。
CakePHP findAll の条件に NOT IN 演算子を使う
0前回の投稿の「CakePHP findAll の条件に IN 演算子を使う」のつづきで、NOT IN 演算子を使用するときに少し調べたのでメモしておきます。
$this->model->findAll('field NOT IN (1, 2, 3)');
または、
$this->model->findAll(array('NOT' => array('field' => array(1, 2, 3))));
で出来ました。
CakePHP findAll の条件に IN 演算子を使う
1CakePHP の findAll の条件に IN 演算子には下記のように条件を指定すればOKです。
$this->model->findAll(array('field IN (1,2,3)'));
または、
$params = array(1,2,3); $this->model->findAll(array('field' => $params));
配列で渡せば勝手に IN 演算子を使用してくれるんですね。
OpenPNEでのSmarty の覚書
1「OpenPNE PHP で作成したプログラムを組み込む」で書いたように、
/openpne/webapp_ext/modules/pc/page/hoge_foo.php に
class pc_page_hoge_foo extends OpenPNE_Action { function execute($requests) { // ここに処理を書く } }
のようにすると ?m=pc&a=page_hoge_foo でアクセスできるようになります。
このときにどうやって Smarty に値を渡すのか少し戸惑ったのでメモしておきます。
Smarty タグ
通常は 「{」「}」 ですが、OpenPNE では 「({」「})」 です。
assign
$smarty->assign("var", $var);
のようにして Smarty に値を渡したいときは execute メソッド内で
$this->view->set("var", $var);
とすればOK。
display
$smarty->display("hoge_foo.tpl");
は自動的にやってくれます。
default_modifiers (escape)
また、OpenPNE の smarty オブジェクトはオブジェクト生成時に
$smarty->default_modifiers に escpae 修飾子が設定されているので、
テンプレート変数に HTML タグが設定されていて HTMLタグを出力したい場合は
({$var|smarty:nodefaults})
とすれば、escape 処理されずに出力されます。
私は HTML_QuickForm をよく使うので、form タグ関係を出したいことがありますので、その場合に使用しています。
OpenPNE PHP で作成したプログラムを組み込む
1OpenPNE PHP で作成したプログラムを組み込むときのメモです。
基本的に、/openpne/webapp_ext/ 以下に追加するファイルを置きます。
URLのパターン
OpenPNE の URL は下記のようになります。
- ?m=pc&a=page_hoge_foo
- ?m=pc&a=do_hoge_foo
携帯だと m=ktai とかになりますが、今回はPC のみ考えます。
page_hoge_foo のパターンはページを表示する
do_hoge_foo のパターンはモデルに対して処理を行う
page_hoge_foo でモデルに対して処理を行うこともできるが
MVC の意味がないかも。
?m=pc&a=do_hoge_foo のURL を追加する
/openpne/webapp_ext/modules/pc/do 以下に
hoge_foo.php を作成
hoge_foo.php
class pc_do_hoge_foo extends OpenPNE_Action { function execute($requests) { // ここに処理を書く } }
/openpne/webapp_ext/modules/pc/validate/do 以下に
hoge_foo.ini を作成
例えば ?m=pc&a=do_hoge_foo&id=10&no=20 のように id, no を GET で渡したい場合は
[id] type = "int" required = 1 [no] type = "int" required = 1
のように定義する。
こうしておくと do/hoge_foo.php 内で
$id = $requests["id"];
のようにバリデーションを通して値を取得できる。
?m=pc&a=page_hoge_foo のURL を追加する
/openpne/webapp_ext/modules/pc/page 以下に
hoge_foo.php を作成
hoge_foo.php
class pc_page_hoge_foo extends OpenPNE_Action { function execute($requests) { // ここに処理を書く } }
/openpne/webapp_ext/modules/pc/validate/page 以下に
hoge_foo.ini を作成
中身は do_hoge_foo の場合と同じ。
その他
/openpne/webapp_ext/lib
クラスファイルなどを置きました
自分で作成クラスをインクルードしたいときは /openpne/webapp_ext/lib
からインクルードします。
OpenPNE 画像の保存、表示方法
2OpenPNE で写真のアップロード機能を作成していて調べたことをまとめておきます。
画像を保存するテーブル c_image
OpenPNE では画像をDB に保存しています。保存するテーブル名は c_image です。
このテーブルにはプロフィール写真や日記の写真、スキンの画像などが保存されるようです。
CREATE TABLE c_image ( c_image_id int(11) NOT NULL auto_increment, filename text NOT NULL, bin longblob NOT NULL, r_datetime datetime NOT NULL default '0000-00-00 00:00:00', `type` text, PRIMARY KEY (c_image_id), KEY filename (filename(100)) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
- filename
- 画像のファイル名、任意につけていいみたいですが、プロフィール写真だと
m_2_1188204858.jpg
という感じです。
最初の 「m 」はたぶんプロフィール写真を表す文字、
次の「2」はプロフィール写真のNo(2番目にアップした写真)
次の10桁の数字は多分 time() 関数で取得したアップロードした時間 - bin
- base64_encode した画像ファイルのバイナリデータ
- type
- 画像のタイプ( jpg | gif | png )
- r_datetime
- 登録日時
表示方法
c_image テーブルに格納した画像を表示するHTML
<img src="/img.php?filename=m_2_1188204858.jpg&w=180&h=180&m=pc">
Smarty のタグで書くと
<img src="({t_img_url filename=$pet.image1 w=180 h=180})">
filename に c_image.filename を指定して、
w, h に幅と高さの最大値を指定する。
幅と高さは最大値を超えると自動的にリサイズする。
その他
c_image に画像を保存しておくと管理画面からアップロードされた写真をすべて管理することができるので、SNS を運営する上で便利だと思います。
OpenPNE テンプレートのカスタマイズ
2OpenPNE は Smarty を使用していますが、そのテンプレートを修正したい場合、直接オリジナルのテンプレートを編集するのではなくカスタマイズ用のテンプレートを作成して修正することができます。
ディレクトリは下記になります。
オリジナルのテンプレート
/openpne/webapp/modules/pc/templates/
カスタマイズ用のテンプレート
/openpne/webapp_ext/modules/pc/templates/
/openpne/webapp_ext/modules/pc/templates/ ディレクトリは最初からはないので作成します。
次にカスタマイズしたいテンプレートをオリジナルのテンプレートディレクトリからカスタマイズ用のディレクトリにコピーします。
次に /openpne/config.php の
define('USE_EXT_DIR', false);
を
define('USE_EXT_DIR', true)
に変更すれば、カスタマイズ用ディレクトリにテンプレートが存在すればそちらを優先して使用されます。
カスタマイズ失敗してもカスタマイズ用のテンプレートを削除すればオリジナルのテンプレートが使用されますので、便利ですね。
この /openpne/webapp_ext/ ディレクトリはテンプレート以外でも webapp ディレクトリのファイルを上書きできます。
PHP で多次元配列のソートを SQL の ORDER BY のように複数項目でソートする
1PHP で多次元配列の項目を複数使用して SQL の ORDER BY のようにソートする方法です。
$answer = array( "category1" => array( "ans1" => 1, "ans2" => 1, "ans3" => 1 ), "category2" => array( "ans1" => 1, "ans2" => 2, "ans3" => 0 ), "category3" => array( "ans1" => 0, "ans2" => 2, "ans3" => 1, ), );
というような配列を下記条件でソートします。
- ans1 の多い順
- ans1 が同じ場合は ans2 の多い順
- ans2 が同じ場合は ans3 の多い順
PHP の uasort 関数を使用します。
この関数はユーザーが比較関数を定義でき、その関数を使用して連想インデックスを保持したまま配列をソートします。
uasort($answer, "compare"); function compare($a, $b) { foreach ($a as $k=>$v) { if ($a[$k] > $b[$k]) { return -1; } else if ($a[$k] < $b[$k]) { return 1; } } }
上記の関数を使用してソートした結果 $answer は下記のようになりました。
$answer = array( "category2" => array( "ans1" => 1, "ans2" => 2, "ans3" => 0 ), "category1" => array( "ans1" => 1, "ans2" => 1, "ans3" => 1 ), "category3" => array( "ans1" => 0, "ans2" => 2, "ans3" => 1, ), );
生年月日から年齢を簡単に求める方法
2担当しているシステムで生年月日から年齢を求める処理があったので、最初は PHP の strtotime などを使ってやろうかと考えていました。
しかし、ググってみると
にすごく簡単な方法が紹介されていました。
誕生日が1969年9月19日だと
$year = (int) ((date('Ymd')-19690919)/10000);
で今日現在の年齢が求められるということです。
上で紹介した記事は2年くらい前の記事なんですが、昨日はてぶをチェックしていると同じ方法が ITPro でも紹介されていましたね。
生年月日から年齢を計算する簡単な計算式:佐野裕のサーバ管理者日記:ITpro
しかし、これでなぜ求められるのか理由が書かれてなくしばらく考えてしまった。
年齢の計算は現在の年から生まれた年を引いてその数に、
今年の誕生日が来ていなければ -1、
来ていればそのままの数が年齢になるということ。
そして上の計算式ではそれをいっぺんに行っているということですね。
わからなければ実際に電卓で引き算をしてみればすぐに理解できるはず。
CakePHP HTML ヘルパーで textarea を出力する
1CakePHP の HTML ヘルパーでテキストエリアを出力するには下記のように書きます。
<?php echo $html->textarea("Model/field", array("cols"=>20, "rows"=>5, "value"=>"hoge")); ?>
checkbox や radio などと違って第2引数に HTML 属性値がくることに注意が必要です。
array("value"=>"hoge")
などと書くことにより初期値を入れることができます。