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 からの返り値をチェックしてその後の処理の分岐に使用できます。

OpenPNE PHP で作成したプログラムを組み込む

1

OpenPNE 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
からインクルードします。

PHP で多次元配列のソートを SQL の ORDER BY のように複数項目でソートする

1

PHP で多次元配列の項目を複数使用して 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 などを使ってやろうかと考えていました。
しかし、ググってみると

えせSEの1日1Hack : 年齢の計算

にすごく簡単な方法が紹介されていました。
誕生日が1969年9月19日だと
$year = (int) ((date('Ymd')-19690919)/10000);
で今日現在の年齢が求められるということです。

上で紹介した記事は2年くらい前の記事なんですが、昨日はてぶをチェックしていると同じ方法が ITPro でも紹介されていましたね。
生年月日から年齢を計算する簡単な計算式:佐野裕のサーバ管理者日記:ITpro

しかし、これでなぜ求められるのか理由が書かれてなくしばらく考えてしまった。
年齢の計算は現在の年から生まれた年を引いてその数に、
今年の誕生日が来ていなければ -1、
来ていればそのままの数が年齢になるということ。
そして上の計算式ではそれをいっぺんに行っているということですね。

わからなければ実際に電卓で引き算をしてみればすぐに理解できるはず。

Smarty truncate のマルチバイト対応 mb_truncate

2

Smarty のマルチバイトプラグインの紹介の続きです。

truncate というプラグインが Smarty に標準であります。
文字列を指定文字数で切るというものです。
ただ、マルチバイトには対応していないため最後の切られた文字が文字化けしてしまうことがあります。

その truncate プラグインをマルチバイト対応したものが下記のページで紹介されている mb_truncate プラグインです。

このプラグインは以前からかなり重宝しています。
文字化けしたり、切り捨てられる文字数がおかしい場合は mb_internal_encoding で内部文字コードを指定してあげれば直ると思います。

もともとの配布元のページが見れないので、下記のページよりダウンロードできます。
kawama.jp: [Smarty]mb_truncate

Smarty のマルチバイト対応

0

マルチバイトの文字列を指定行数で強制改行する仕様があって、wordwrap 関数をマルチバイト化してさらに Smarty のプラグインを作ろうと思っていたらありました。

Smarty のマルチバイト対応
Artisan Version管理システム

マルチバイト処理に弱いとされる、Smartyをマルチバイト対応とし、よりアプリケーション内で役立てることができるよう、オリジナルの関数や、関数に改造を行っています。

7月に読んだ本

0

7月に読んだ本のメモ
一番のお勧めは一番下に書いた「ビーサン屋げんべい物語」。
葉山にあるビーチサンダル専門店「げんべい」さんが出した本です。
たかがビーサンと侮れませんね。私も1年中愛用させていただいております。

Lifehacker インターネット時代のワークスタイル改善術!

Lifehacker インターネット時代のワークスタイル改善術!

2ちゃんねるはなぜ潰れないのか? (扶桑社新書 14)

2ちゃんねるはなぜ潰れないのか? (扶桑社新書 14)

「1日30分」を続けなさい!人生勝利の勉強法55

「1日30分」を続けなさい!人生勝利の勉強法55

PHPによるデザインパターン入門

PHPによるデザインパターン入門

WordPress標準ガイドブック―導入&基本操作からフルチューンまで

WordPress標準ガイドブック―導入&基本操作からフルチューンまで

モバゲータウンがすごい理由 ~オジサンにはわからない、ケータイ・コンテンツ成功の秘けつ~

モバゲータウンがすごい理由 ~オジサンにはわからない、ケータイ・コンテンツ成功の秘けつ~

WEB+DB PRESS 総集編 [Vol.1~36]

WEB+DB PRESS 総集編 [Vol.1~36]

レバレッジ・シンキング 無限大の成果を生み出す4つの自己投資術

レバレッジ・シンキング 無限大の成果を生み出す4つの自己投資術

ネットで人生、変わりましたか?

ネットで人生、変わりましたか?

iPhone 衝撃のビジネスモデル

iPhone 衝撃のビジネスモデル

ビーサン屋げんべい物語―葉山の片隅から世界を狙うオンリーワン商店


PEAR::Pager ページ番号を PATH_INFO で渡す

3

ページング処理を行ってくれる PEAR::Pager 、かなり便利です。
通常は
index.php?pageID=2
のようにしてページ番号を渡すのですがこれをPATH_INFO で渡すには下記のようにオプションパラメータを指定します。

$params = array(
...
'path' => 'http://localhost/foo/',
'fileName' => '%d',
'append' => false,
cuurentPage => 現在のページ
);

ポイント

append = false なら fileName の %d にpageID を埋め込む。
currentPage を指定しないと Pager が現在のページが分からない。

fileName

'path' => 'http://localhost/',
'fileName' => 'foo/%d'

なども可能。append=false なら fileName の %d にpageID を埋め込むということ。

現在のページを取得するには

$path_info = explode("/", $_SERVER['PATH_INFO']);
if (isset($path_info[1]) {
    $currentPage = $path_info[1];
} else {
    $currentPage = 1;
}

PATH_INFO が使用できるか

サーバによっては PATH_INFO が使用できない。
使用できるかは $_SERVER["PATH_INFO"] が存在するかどうか。
ただし、http://localhost/index.php では $_SERVER["PATH_INFO"] には値はセットされないので、 http://localhost/index.php/1 などのようにして $_SERVER["PATH_INFO"] が設定されているか調べる。

PEAR::Page マニュアル

PHP の便利な関数 output_add_rewrite_var

1

PHP から出力する HTML に最終的に a タグや form タグを見つけ出し、自動で指定した変数をクエリストリングや hidden 属性で挿入してくれる関数です。

PHP4.3 から追加されたようなのですが知らなかったです。
昔から、session.use_trans_sid というセションID を a タグや form タグの hidden 属性に追加してくれるのはありましたが、それをセションID 以外にも使用できるように関数化したもののようです。

URL リライト機構に新しい名前/値の組を追加します。 名前および値は、URL (GET パラメータとして) およびフォーム (hidden フィールドとして) で追加されます。これは、session.use_trans_sid で透過的 URL リライティングが有効になっている場合に セッション ID が渡される方法と同じです。 絶対 URL (http://example.com/..) はリライトされないことに注意しましょう。

- PHP マニュアルより

userid の値 $userid を全てのリンクに付与したい場合は、
output_add_rewite_var('userid', $userid);と書くことにより
<a href="index.php">TOP</a>
<a href="index.php?userid=1">TOP</a>と出力されます。

form タグも
<form action="index.php" method="post">
<input type="hidden" name="userid" value="1">となります。

注意点としては絶対URLはりライトされないことです。
これがないと他サイトにまで、セションID などを渡してしまいますからね。

PHP マニュアル
output_add_rewrite_var

いよいよ PHP5 への移行が進むか

0

Do You PHP はてな – PHP4への最後通告

ついに来ましたか。。。2007/12/31いっぱいはサポートを続け、2008/08/08までは致命的なセキュリティFIXのみ行うようです。

最近の開発では PHP5 が増えてきましたし、いよいよPHP5 への移行が加速しそうですね。
個人的にはPHP5 は大歓迎です。

Go to Top