ラベル PHP の投稿を表示しています。 すべての投稿を表示
ラベル PHP の投稿を表示しています。 すべての投稿を表示

2010年5月26日水曜日

PHP で半角カナを全角に変換する

Gmail で半角カナを入力して送信すると、

img05-25-2010[1]

全角カナに変換される。

img05-25-2010[2]

PHP で上記のような変換をする関数は mb_convert_kana 。第2引数のオプションの指定により様々な変換に対応している。

例えば、以下のような変換をしたいとする。

「半角カタカナ」を「全角カタカナ」に変換します。

濁点付きの文字を一文字に変換します。"K", "H" と共に使用します。

( PHP: mb_convert_kana - Manual より )

echo mb_convert_kana("本日haセイテンデス", "KV", "utf-8");

結果は、

本日haセイテンデス

ただし、第3引数のエンコーディングを指定しないと変換されなかった。

 

参考サイト

2010年5月2日日曜日

PHP の開発環境を整える (2010.5) - CakePHP の準備

1. 開発環境の一覧

この時期、恒例になってきた開発環境の整備。変なエラーに煩わされないことを祈りつつ設定 (+_+)

利用するツールとバージョンは以下の通り。

 

2. CakePHP を利用するための準備

今回、開発環境を新しくした理由は、修正したいコードがあったため。修正対象のソースコードで、PHP が使われている部分は、

  1. パーツに分割した HTML を結合する処理と ( cf. フレームの代わりにPHPを使う ) 、
  2. フォームでの問い合わせの処理。

DB は使用していない。処理はシンプルなので、テンプレートエンジンを使わず、自前で MVC ライクに書いている。しかし、いくら単純でも、Web ページの数が増えてくると、重複した部分が徐々に気になってくる。フレームワークを使うように変更しようか、検討中。

以前に、CakePHP を試してみようと環境を整えたことがある。

軽量なフレームワーク

も良さげだけれど、 PHP で他のフレームワークを使ったことがないので、とりあえず CakePHP への移行が無難かな。

PHP はたくさんのフレームワークが乱立している。なるべくシンプルでコンパクトなものを使いたい。以下の図による説明を見ると、今回の自分のやりたいことに対して、CakePHP は、妥当な選択に思えた。

ちなみに、調べていたら、 symfony からのつながりで、Twig というテンプレートエンジンが気になった。一度、使ってみたい。

http://www.twig-project.org/

Twig via kwout

 

使用する CakePHP のバージョン

CakePHP のバージョンを確認したら、1.3.0 と 1.2.7 がリリースされている。1.3 はまだ出たばかりのようなので、今回は 1.2.7 を利用することにした。

現時点では、1.2 の方がドキュメントが充実している。

 

PDT へ CakePHP のソースコードをインポート
  1. cakephp / cakephp1x より、1.2.7 をダウンロードして解凍。
  2. PDT で新規に testCakePHP2 プロジェクトを作成。
  3. 解凍した CakePHP のソースコードを testCakePHP2 プロジェクトに D&D。
  4. プロジェクトのプロパティで Resource > Text file encoding を UTF-8 に変更。

 

Apache の設定

Apache の httpd.conf で以下の記述がコメントアウトされているのを確認。 ( cf. Apacheとmod_rewrite )

LoadModule rewrite_module modules/mod_rewrite.so

テスト用のアプリケーションの設定のために以下の記述を追加。

Alias /testCakePHP2/ "C:/develop/tool/eclipse/workspace/testCakePHP2/"
<Directory "C:\develop\tool\eclipse\workspace\testCakePHP2/">
    Options FollowSymLinks 
    AllowOverride All
    Allow from All
</Directory>

ただし、PDT が利用する workspace は、

C:/develop/tool/eclipse/workspace/

であるとする。また、アプリケーションのルートの URL は、

http://localhost/testCakePHP2/

とする。上記の設定中 Options FollowSymLinks を有効にしているのは、Old Nabble - CakePHP - Forbidden Error によると、

In order for mod_rewrite to work you have to have:
Options FollowSymLinks
Put that right under the AllowOverride All and it should work. :)

 

CakePHP の .htaccess に RewriteBase を追加

次に CakePHP on XAMPP でちょっとはまった « 43HR を参考にして、PDT にインポートした CakePHP のソースコードの以下の各々のファイルに内容に RewriteBase を追加。

  • testCakePHP2/.htaccess に RewriteBase /testCakePHP2
  • testCakePHP2/app/.htaccess に RewriteBase /testCakePHP/app
  • testCakePHP2/app/webroot/.htaccess に RewriteBase /testCakePHP2/app/webroot

 

debugger.php の設定

これで http://localhost/testCakePHP2/ にアクセスすることができるようになった。ただし、以下の警告が表示される。

Notice (1024): Please change the value of 'Security.salt' in app/config/core.php to a salt value specific to your application [CORE\cake\libs\debugger.php, line 548]

CakePHPブログチュートリアル :: 開発例 :: マニュアル :: 1.2 Collection :: The Cookbook によると、

security saltは、ハッシュの生成に用いられます。/app/config/core.phpの153行目を編集し、デフォルトのsalt値を変更してください。

これにより、警告が消える。

 

3. MySQL の設定

今回は DB を使う予定はない。しかし、http://localhost/testCakePHP2/ にアクセスすると警告がでるので、ついでに DB の設定もしておく。

XAMPP のコントロールパネルで MySQL の Start ボタンを押す。

Admin ボタンで phpMyAdmin を起動。(phpMyAdmin を使いたくない場合は、MySQL Workbench を利用するとよい。)

データベース」タブを選択し、新規にデータベース testcakephp を作成。

img05-02-2010[2]

XAMPP の MySQLと PHP の説明によると、

MySQLは "root" に対するパスワード無しで起動します。したがってPHPではMySQLサーバを以下で接続できます: mysql_connect("localhost","root","")
MySQLの"root" に対するパスワードを設定したい場合は、コンソール(Console)の下の"mysqladmin"を使ってください。

testCakePHP2\app\config の database.php.default を database.php に名前を変更。 database.php で $default 変数のハッシュのキーに対する値において、

  • login を root
  • password を空
  • database を 上記で作成した testcakephp

に変更する。これで、http://localhost/testCakePHP2/ にアクセスすると警告が消える。

データベースで、アプリケーション専用のユーザを作成してアクセスしたいなら、phpMyAdmin の「特権」タブにおいて、test ユーザを作成。パスワードを test とする。その際、グローバル特権にデータと構造に全てチェックを付けておいた。

img05-02-2010[3]

上記の database.php に戻り、

  • login を test
  • password をtest
  • database を 上記で作成した testcakephp

と設定する。

http://localhost/testCakePHP2/ にアクセスすると、オールグリーンで準備完了。

img05-02-2010[1] 

 

4. 分散バージョン管理に移行しようかな…

分散バージョン管理Git/Mercurial/Bazaar徹底比較 (1/5) - @IT (2009/1/14) によると、

分散バージョン管理システムでは、ローカルのブランチに対して作業を行い、テストまできちんと終了した作業のまとまりを中央リポジトリへ反映できます。

出先で、ノート PC を利用してバージョン管理をしたいので、そろそろ分散バージョン管理に移行しようかな。

個人的には Haskell で作られている Darcs を使ってみたい。

 

関連記事

2009年12月7日月曜日

XAMPP 1.7.2 上でエラーとなった PHP コード - ショートタグの設定

1. XAMPP のバージョンを上げたら PHP でエラーが発生

XAMPP 1.7.0 上で問題なく動作していた PHP のコードが、XAMPP 1.7.2 にしたら、以下のエラーを吐いた。

Parse error: syntax error, unexpected $end in C:\...

syntax error, unexpected $end の意味を教えてください - 教えて!goo によると、

<?php
で始まったPHPスクリプトの部分が
?>
で終わっていない、ということはありませんか?

コード上に、上記で指摘されている箇所はなかった。ただし、エラーが発生するコードでは、一般的な PHP のタグと

「ショートタグ」

による記述が混在していた。

 

2. ショートタグとは

ショートタグとは、 <? ではじまり ?> により、PHP のコードを示す書き方のこと。

3.  <? echo 'これは、SGML を処理する最もシンプルな方法です'; ?>

(PHP: HTML からの脱出 – Manual より)

ショートタグが動作するためには、

短縮型のタグ(例 3.)が有効なのは、php.ini 設定ファイルのディレクティブ short_open_tag が 有効になっている場合か PHP が --enable-short-tags オプションつきで configure されている場合のみです。

(同上より)

 

3. XAMPP のバージョンによる、ショートタグを動作させる設定の違い

XAMPP 1.7.0 において、phpinfo() を表示させたら、

short_open_tag      On

XAMPP 1.7.2 では、

short_open_tag      Off

となっていた。

これにより、ショートタグ形式で書かれていたコードが、PHP のコードとして認識されずエラーとなった。

 

4. ショートタグの危険性

【PHPカンファレンス2006】PHPで書かれた実際のアプリケーションに潜む危険なコード - ニュース:ITpro  によると、

… PHPのコードを埋め込むために「<?」(ショートタグという)を利用していたのも問題だという。ショートタグはデフォルトでは有効だが,オンオフを切り替えられる。オフに設定していたサーバーでは,ソースコードが見えてしまうことになる。…

元々ショートタグを使っているつもりは全くなかった。しかし、誤って書いていたものが、XAMPP 1.7.0 では問題なく動作してしまった。ショートタグが有効なため問題が表面化しなかった。 (+_+)

2009年8月21日金曜日

PHP で文字列の分割と結合

分割

文字列の分割は explode を使って、

print var_dump(explode(":", "hoge:piyo:fuga"));

結果は、

array(3) { [0]=>  string(4) "hoge" [1]=>  string(4) "piyo" [2]=>  string(4) "fuga" } 

explode の意味は、

1 〈火薬・タンクなどを〉爆発させる.

(Yahoo!辞書  より)

文字列を爆発させて分解するというイメージなのかな?

 

結合

文字列の結合は explode の反対 implode 。このネーミングは import <–> export のような対義語で忘れにくいかも。

print implode(":", array("hoge","piyo","fuga"));

結果は、

hoge:piyo:fuga

implode の意味は、

1 内側に破裂する.

(Yahoo!辞書 より)

「内側に破裂」ってどういうことかと思ったら、Implosion (mechanical process) - Wikipedia, the free encyclopedia によると、

An example of implosion is a submarine being crushed from the outside by the hydrostatic pressure of the surrounding water.

なるほど、潜水艦がぐしゃってなるようなやつか。つまり、配列をぎゅっとつぶして文字列にするということか。

 

エイリアス

それにしても、explode – implode って変った名前だなぁ。他の言語みたいに join – split にすればいいのにと思ったら、PHP: join – Manual に、

join — implode() のエイリアス

PHP: 関数エイリアスのリスト – Manual によると、

数はかなり少ないですが、PHPには複数の名前でコールされる関数があります。 いくつかの関数は単に二つの名前があり、実際の機能を持ちません。

split もあるけれど、PHP: split – Manual によると、

array split ( string $pattern , string $string [, int $limit ] )

string を、正規表現によって配列に分割します。

PHP: explode – Manual は、

array explode ( string $delimiter , string $string [, int $limit ] )

文字列の配列を返します。この配列の各要素は、 string を文字列 delimiter で区切った部分文字列となります。

explode の方は区切り文字が文字列に対して、split は正規表現なのでエイリアスではないと。

2009年7月20日月曜日

PHP でセッションの利用 – session_start()

PHP でセッションを利用するには session_start() を使う。

しかし、次のコードを実行するとエラーが発生。

こんにちは
<?php
session_start();
?>

結果は、

こんにちは
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:XXXXXX\test.php:2) in C:XXXXX\test.php on line 3

これは 初めてのPHP5 (p164) によると、

HTML の前はヘッダを含む応答の一部です。ヘッダは画面には表示されませんが、Web クライアントからサーバへの命令や情報になります。…

Web サーバから Web クライアントへの応答ヘッダはすべて、応答の始めにあるべきです。… 一度、本文が送られると、たとえそれが 1 行であっても、それ以上ヘッダが送られることはありません。…

setcookie() や session_start() のような関数は応答にヘッダを追加します。追加されたヘッダが適切に送られるためには、出力の開始前に追加されなければなりません。…

ブランク行であっても、<?php ?> タグの外側には何もないことをチェックしましょう。

上記のヘッダとは[Studying HTTP] HTTP Header Fields による、

クライアントとサーバは、HTTP ヘッダを使ってデータやソフトウェア自身の情報をやりとりしていきます。 HTTP/0.9 では、データの取得のみを目的としていたので、HTTP ヘッダというものは存在しませんでした。しかし、WWW が活用され始め、そのリソースに関連する情報 (例えば、返されるリソースのサイズやその更新時刻等) や、クライアント側の情報 (例えば、ユーザエージェントの種類やそれを参照するリソースの URL 等) をやりとりしたいと思うようになり、実際のリソースとは別のメタ (外部) 情報を扱うものとして、HTTP ヘッダが開発されたのです。

PHP: session_start – Manual の注意をよく読むと、

注意: クッキーに基づくセッションを使用している場合、ブラウザに何か出力を行う前に session_start() をコールする必要があります。

呼出すタイミングには注意が必要。状態を考えてコーディングしないといけないのはやっぱ面倒だなぁ。。 (+_+)

 

参考

2009年7月13日月曜日

PHP でローカルにおけるメールの送信テスト - MELON

メールを送信するためのテスト用のコードを

を参考にして作成。

<?php
function sendmail($to, $subject, $body, $from){
 $body = mb_convert_encoding($body, 'iso-2022-jp', 'UTF-8');
 $subject = mb_convert_encoding($subject, 'iso-2022-jp', 'UTF-8');
 $subject = mb_encode_mimeheader($subject, 'iso-2022-jp');
 $headers[] = "From: $from";
 $headers[] = 'Content-Type: text/plain; charset=iso-2022-jp';
 $headers[] = 'Transfer-Encoding: 7bit';
 mail($to, $subject, $body, join("\n", $headers));
}
sendmail("宛先のメルアド",
   "メールテスト",
   "これはテストです。",
   "差出人のメルアド")
?>

ローカルで SMTP サーバ Radish を起動。しかし、宛先に Gmail を指定して実行したら Radish が落ちた。 (@_@;) 

何度やっても結果は同じだったので、他の SMTP サーバはないかと探すことに。hMailServer , XAMPP に含まれている Mercury は使い方がよくわからず、PHP Portable SMTP Server for WindowsAvira AntiVir が反応したので怖くて使えず。 (+_+)

 

PEAR::Mail

PHPでメールの送信(Gmail使用) - 教えて!goo によると、

もし、自分のプロバイダのSMTPサーバーを使えない理由があり、どうしてもsmtp.gmail.comをSMTPとして使いたいというのなら、すでにご回答のある通り、mail()やmb_send_mail()でなくPEAR::Mailなどを使って SSL+SMTP-AUTHで送るようする必要があります。

( より)

この方法は面倒そうなのでまた今度。。 ^^;

 

MELON

シンプルで軽そうな SMTP サーバはないかと探したら、MELON を発見。起動したら Radish のようにタスクトレイに常駐。

上記のコードを実行したら同様にエラーで送ることができなかったが、今回はエラーメッセージが表示された。

The IP you're using to send mail is not authorized to

これは、「The IP you're using to send email is not authorized... (メールの送信にご使用の IP では、Google のサーバーへのメッセージの直接送信が承認されていません)」 - Gmail ヘルプ によると、

Gmail では迷惑メールを防ぐために、送信元の IP アドレスが送信元のドメインと一致しない場合、メールを拒否します。ご使用のサーバーから Gmail にメールを送信するには、ISP から提供されている SMTP リレーを使用してください。

そこで、上記の「宛先のメルアド」を Yahoo メールにしたら、今度は送信が完了した。

そういえば、Radish の 「設定 > SMTP/POP3サーバ」 のドメイン名に適当に名前を付けていたのを思い出し、自分のネットワークのドメインにしたら、今度は Radish が落ちることはなくなった。しかし、待てど暮らせど受信せず。。

 

参考サイト

2009年1月14日水曜日

Meadow (Emacs) のライブラリをポータブルに - Dropbox へ配置

1. php-mode のインストールと設定

Emacs で PHP を編集するために、php-mode を利用する。

SourceForge.net: PHP mode for Emacs からダウンロードして解凍。

設定方法は、Installation - PHP Mode Manual を参考にして、

  1. Emacs Lisp のライブラリに php-mode.el を置く。
  2. .emacs に以下を追記。
(load "php-mode")
(add-to-list 'auto-mode-alist
     '("\\.php[34]?\\'\\|\\.phtml\\'" . php-mode))

PHP ファイルを Emacs で開いた場合、表示が次のように変わる。

g2413

 

拡張子を追加

Drupal のソースファイルの拡張子は .php ではなく、.module, .inc 。この拡張のファイルを開いたときも、php-mode を利用したい。

Installation - PHP Mode Manual  を参考にして、

(add-to-list 'auto-mode-alist '("\\.module\\'" . php-mode))
(add-to-list 'auto-mode-alist '("\\.inc\\'" . php-mode))

 

2. Dropbox に Emacs のライブラリを置く

現在、Emacs のライブラリはローカルに配置している。どの場所にいても、同じライブラリを使いたいので、ライブラリを Dropbox フォルダに置くことにした。

My Documents\My Dropbox

に eslips フォルダを作成。上記の php-mode.el を置いた。

初期設定ファイル (~/.emacs) に、ライブラリのフォルダを認識させるために、以下を記述。

(add-to-list 'load-path "~/My Documents/My Dropbox/elisp")

 

3. その他

設定に関する関数や変数を調べたい場合、

正規表現におけるバックスラッシュについては、

2008年11月29日土曜日

PHP の開発環境を整える (2) – NetBeans

久しぶりに PHP の開発環境を整える。今年の 4 月の時点では、Eclipse がベースの PDT を利用した。

NetBeans 6.5 IDE - PHP Development によると、Netbeans でも PHP を扱えるようになったようなので試してみる。

 

前提となるツール

以下のツールがインストールされていること。

 

NetBeans のインストール

NetBeans IDE ダウンロード より、PHP のみをサポートしたものをダウンロード。

 

新規プロジェクトの作成

メニューより「ファイル > 新規プロジェクト」。

カテゴリから「PHP」を選択、プロジェクトから「PHP アプリケーション」を選択して、「次へ」ボタンを押す。

081129-001

プロジェクト名を適当につける。

ソースフォルダは、xampp のドキュメントルートにプロジェクト名と同じになるようにした。

( PDT で設定をするとき、ここでややこしいことになった。ドキュメントルートにソースを置けば、Apache の設定ファイルで指定しなくてもいいので楽。)

081129-002

プロジェクト URL が表示されるので確認。

081129-003

index.php にコードを書いて「プロジェクトを実行」ボタンを押すと、ブラウザが起動して結果が表示される。

081129-004

 

HTML ファイルの作成
  1. 081129-005メニューより「ファイル > 新規ファイル。」
  2. その他 > HTML ファイル を選択。

左側のペインには要素がツリー状で表示されている。 PHP のエディタと同じく、コードの横にはコードを畳むためのボタンがついていて便利。

 

Subversion の設定と使い方

メニューより「バージョン管理 > Subversion > チェックアウト」を選択したら、エラーが表示された。

予め Subversion の bin ディレクトリを指定することが必要。

081129-002

 

プロジェクトのインポート

上記で作成したプロジェクト PhpProjce1 で右クリックし、

  • Subversion > バージョン管理 > Subversion リポジトリにインポート

を選択。

081129-003

Subversion のリポジトリは C:\develop\svn に作ってある。メニューよりリポジトリの指定をする。

file:///C:/develop/svn

081129-005

リポジトリフォルダに PhpProject1 と指定。(以下の写真では PhpProject2 となってるけど ^^;)

メッセージを適当に書く。

081129-007

インポートされるファイルが表示されて完了。

081129-008

 

感想

何の苦もなく、簡単にできてしまった。^^ PDT ではなく、NetBeans でいいかも…。

2008年11月26日水曜日

Drupal で PHP snippets (3) - テーブルで出力

前回「Drupal で PHP snippets - 最新のストーリーのタイトル一覧を表示」では結果をリストとして表示した。今回はこれをテーブルで表示したい。

 

theme 関数

Drupal では theme 関数を使ってテンプレートに即したデザインを出力することができる。前回、リストとして表示されたのは PHP snippets の以下の部分による。

theme('item_list', $items);

この辺りどういう仕組みか理解していないが、theme | Drupal API によると、

All requests for theme hooks must go through this function.

theme 関数がテンプレートを利用するための窓口になっているようだ。

Default theme implementations | Drupal API には、theme 関数の使い方の例が書かれていた。

For example, theme('table', $header, $rows); Additionally, the theme() function can take an array of theme hooks, which can be used to provide 'fallback' implementations to allow for more specific control of output. For example, the function: theme(array('table__foo', 'table'), $header, $rows) would look to see if 'table__foo' is registered anywhere; if it is not, it would 'fall back' to the generic 'table' implementation.

(太字は引用者による)

theme 関数の第1引数で表示の仕方を指定するようだ。その際、いろいろと細かな指定ができるようだけれど、それは横に置いておく。とにかく、

theme('table', $header, $rows);

というように記述することができる。前回との違いは、theme 関数の第1引数に指定している文字列が ‘item_list’ から ‘table’ に変化しいるところ。この ‘table’ というのが HTML の table 要素の出力に対応。

PHP snippets の中で、テーブルを出力する Display a table of node entries sorted by a start date taken from the event module の例を見ても、

print theme('table', array(…

というように第1引数に 'table’ と指定しているので、やはりこれがテーブルの出力に関与しているようだ。

 

theme_… 関数

Default theme implementations | Drupal API の関数の一覧の中に次の関数がある。

接頭辞 `theme_’ を取り除けば、上記で指定した item_list, table に対応。よくわからないが、この辺りを theme 関数が窓口となって呼出しているようだ。ソースを見るとそんな感じ。

 

前回は、リストの内容として「ストーリーのタイトルの一覧」を表示した。今回テーブルに表示する内容は、タイトルに加えて「コンテンツが作成された日付」も表示するようにしてみる。

テーブルとして表示するには、theme(‘table’,… とする。第2引数以降は、theme_table | Drupal API によると、

$header An array containing the table headers. …

  • "data": The localized title of the table column.

$rows An array of table rows. …
  • "data": an array of cells

02:モジュールのベース部分を作成 | Neoceed には、theme(‘table’ … の例が書かれていたので、これを参考にした。

    $header = array(array('data' => '氏名'), array('data' => '電話番号'), array('data' => '住所'));
    $result = db_query("SELECT * FROM {maddress}");
    while ($record = db_fetch_array($result)) {
        $rows[] = array(
            array('data' => $record["name"]),
            array('data' => $record["tel"]),
            array('data' => $record["address"])
        );

上記のドキュメントにあったように ‘data’ と対応させてテーブルの内容を指定しているのがわかった。

日付の出力にいては、Aggregator headline display with date の例を見たら、date 関数によって書式が指定されていた。これは PHP で用意されている関数なので PHP: date – Manual を参照。

 

コード例

<?php
$sql ="
	SELECT n.nid, n.title, n.created 
	FROM {node} n 
	WHERE n.type = 'story' 
	AND n.status = 1 
	ORDER BY n.created DESC
";

// テーブルのヘッダ
$header = array(array('data' => 'タイトル'),
				array('data' => '日付'));
// テーブルの内容
$rows = array();

// クエリの実行 
$result = db_query_range($sql, 0, 5);
// 各々のデータを取得
while ($node = db_fetch_object($result)) {
	$rows[] = array(
		array('data' => l($node->title, "node/$node->nid")),
		array('data' => date("Y/m/d", $node->created)));
}
if(count($rows)){
	return theme('table', $header, $rows);
}else{
	return 'ストーリーがありません。';
}
?>

今回は t 関数を使わずにソースに直接日本語を書いた。

2008年11月25日火曜日

Drupal で PHP snippets (2) - インターフェイスの翻訳

Drupal で PHP snippets - 最新のストーリーのタイトル一覧を表示 のつづき

1. 拡張子が .po であるファイル

Drupal の本体を日本語化するために、

を利用した。ファイルの拡張子が .po 。これは Locale: multi-language support によると、

These translations are available as GNU gettext Portable Object files (.po files for short).

詳しくは、Technical background on interface translations を参照。

 

2. t 関数

それに対して、前回のように PHP snippets で t 関数を利用して出力した文字列は、どうやって翻訳しておけばいいのだろうか?

前回 t 関数にておいて、次のように文字列を渡した。

 t('No nodes available.')

これに対応する日本語を表示させたい。

 

3. インターフェイスの翻訳

管理セクション › サイトの構築 › インターフェイスの翻訳」で「検索」をクリック。

「含まれる文字列」フィールドにおいて、'No nodes available.' を入力して検索。

081124-007

検索の結果、「文字列」が、前回作成した PHP snippets の node の URL の一部が表示された。

「編集」をクリック。

081124-008

オリジナルのテキストに対して翻訳を入力して保存。

081124-009

 

4. 疑問

これで日本語が表示されるようになったが、PHP snippets で、特に他の言語へ配慮する必要がないなら、直接日本語を表示するようにしてやった方が良かったんだろうか?

2008年11月24日月曜日

Drupal で PHP snippets - 最新のストーリーのタイトル一覧を表示

1. 標準で用意されている PHP snippets を利用する

Drupal で表示をカスタマイズするには、Views モジュールを使うのが良い。

今回、このモジュールを使わずに、標準で用意されている PHP をコンテンツの作成で埋め込む方法について調べる。

予め Drupal でコンテンツの作成において PHP コードを埋め込む ことができるように PHP filter モジュールを有効にしておく。これにより、コンテンツの作成において PHP を埋め込むことが可能となる。

には、PHP を利用してデータを表示するためのサンプルがいくつか載っている。

 

2. 予めチェックしておくドキュメント

PHP を利用してコンテンツを抽出・表示するには、

  1. SQL を記述
  2. データの取得
  3. 表示

という 3 つの手順を踏む必要がある。

Drupal では、コードの可搬性・セキュリティを考慮した

がある。この API を利用して DB にアクセスする。

DB にアクセスするには、データベースの構造を理解する必要がある。

には、代表的なテーブルの構造が説明されている。この中で重要なのは、

Drupal では、ノードに様々なコンテンツが保存される形になっている。

取得したデータを表示するには

を利用する。

 

3. 例題

最近投稿したコンテンツタイプ「ストーリー」のタイトルの一覧を、リストとして表示したい。

ただし、一覧に表示する数の上限は 5 つ。

 

4. コード例 1

PHP snippets にある、以下のコードを真似した。 (ただし、6.x では動かない。)

<?php
$sql ="
 SELECT n.title  
 FROM {node} n 
 WHERE n.type = 'story' 
 AND n.status = 1 
 ORDER BY n.created DESC
";
$result = db_query_range($sql, 0, 5);
if(db_num_rows($result)){
 return node_title_list($result);
}
return t('No nodes available.');
?>

 

a. node テーブル

ストーリーはコンテンツの一種であり、コンテンツは node テーブルに保存される。

を参照しながら SQL を作成する。

SQL 内でテーブルを参照するときに使われている { } は、Database abstraction layer によると、

Curly braces are used around "node" to provide table prefixing via db_prefix_tables().

同一の DB に複数のシステムをインストールしている場合、テーブル名に何らかの接頭辞を使うことが多い。上記の記述によってこれを補ってくれる。

 

b. データの取得 : db_query_range

DB にアクセスするには

が基本となる。SQL で LIMIT を書かずに関数のパラメータとして与えるのが

範囲を指定するには、第2、第3引数に数値を与える。

$from The first result row to return.

$count The maximum number of result rows to return.

 

c. node のタイトルをリンクへ : node_title_list

今回は、node のタイトルの一覧を取得したい。そのため、node モジュールの

関数を利用した。

を使うと、クエリの結果を一気に node のタイトルのリンクに変更できる。

 

d. 各言語で表示

は、各々の言語で表示する文字列を変化させるために用いる。

 

e. db_num_rows は 6.x で廃止

しかし、Remove db_num_rows() method によると、

The db_num_rows() method was removed from the database abstraction layer in 6.x core, as it was a database dependent method.

db_num_rows() メソッドが削除されているよ。上記のコードは 6.6 では動作しなかった。(+_+)

 

5. コード例 2

以下の PHP snippets を参考にして作成した。

<?php
$sql ="
 SELECT n.nid, n.title 
 FROM {node} n 
 WHERE n.type = 'story' 
 AND n.status = 1 
 ORDER BY n.created DESC
";
$items = array();
$result = db_query_range($sql, 0, 5);
while ($node = db_fetch_object($result)) {
 $items[] = l($node->title, "node/$node->nid");
}
if(count($items)){
 return theme('item_list', $items);
}else{
 return t('No nodes available.');
}
?>

 

a. データを一件ずつ取得 : db_fetch_object

によって node オブジェクトを取得。

Fetch one result row from the previous query as an object.

 

b. リンクを作成 : l

各々の node オブジェクトを取得し、

l メソッド

によって node へのリンクを作成する。

コンテンツは

http://XXXXX.xrea.jp/node/nid

という形式で参照できる。そのため、SQL においてタイトルだけではなく nid も取得した。

は、与えられた文字列と URL からリンクを生成してくれる。上記では、DB から取得した node のタイトルと、その node への URL からリンクを作成した。

 

c. 内容の表示 : theme

によって内容を表示する。引数の説明によると、

Parameters

$hook The name of the theme function to call.

この hook の辺り、どのような仕組みになっているのかわからない。 (+_+) 上記の場合だと、theme.inc に書かれている theme_item_list() が呼出されるということなのかな? QQQ

 

関連記事

2008年9月17日水曜日

Python のグローバル変数

4.1 名前づけと束縛 (naming and binding) によると、

ある名前がブロック内で束縛されている場合、名前はそのブロックにおけるローカル変数 (local variable) です。ある名前がモジュールレベルで束縛されている場合、名前はグローバル変数 (global variable) です。

6.13 global 文 によると、

global 文は、列挙した識別子をグローバル変数として解釈するよう指定することを意味します。 global を使わずにグローバル変数に代入を行うことは不可能です (…)

global 文で列挙する名前は、同じコードブロック中で、プログラムテキスト上 global 文より前に使ってはなりません。

試してみる。

hoge = 10

def test():
    # ローカル変数
    hoge = 1000

test()
print hoge   #=> 10


def test2():
    # グローバル変数
    global hoge
    hoge = 1000
    
test2()
print hoge   #=> 1000

PHP と同様か。

Ruby では、変数の前に $ を付けるとグローバル変数になる。(cf. 変数と定数 - Rubyリファレンスマニュアル)

2008年4月29日火曜日

WordPress のソースコードを読む準備 - PDT を使って

前提

  • PDT が使えること。
  • XAMPP がインストールされていること。

(cf. PHP の開発環境を整える)

 

手順

WordPress | 日本語http://ja.wordpress.org/wordpress-2.5.1-ja.zip をダウンロードして、解凍する。後は、Drupal のソースコードを読む準備 と同じ手順を踏む。

 

データベースの設定

WordPress 用に新しくユーザ (wordpress) を作成した。

Image1

 

PDT

新しく PHPProject を作成し、先ほど解凍したフォルダをインポートする。

 

WordPress の設定

WordPress | 日本語 » インストール の手順に従った。

wp-config.php を開く。

Image3

 

先ほどデータベースで作成した設定を書き込む。

Image2

 

PDT で実行

Run As > Open Run Dialog... の設定を以下のようにする。

Image4

QQQ 上記のように設定した場合、どこかのファイルを更新したとして、上記を実行したら、どこまで反映されるのだろう?特定のファイルを更新したら、それようの実行設定を作らなくてはいけないのだろうか?

 

WordPress のインストール

Image5

 

指示通りにして、完了。

Image6

2008年4月21日月曜日

PHP の include によりファイルが検索される場所

include 関数を利用している PHP ファイルがある。このファイルを別の環境に移したら動かなくなってしまった。 (+_+) 原因は何だろう?

 

include はどこからファイルを探すのか?

言語リファレンス > 制御構造 > include によると、

ファイルのインクルードは、指定されたパスから行います。パスを指定しない場合は、 include_path の設定を利用します。…

パス (絶対パスあるいは相対パスのいずれでも) を指定した場合は include_path は無視されます。たとえば ../ ではじまるファイル名を指定した場合は、 親ディレクトリからそのファイルを探します。

上記 include_path とは、

PHP は、インクルードするファイルを探す際に インクルードパスの各エントリを個別に調べます。 まず最初のパスを調べ、見つからなければ次のパスを調べ、…… というように、ファイルが見つかるか warning あるいは error が発生するまで続けます。

(PHP: コア php.ini ディレクティブに関する説明 – Manual より)

include_path を調べるには、phpinfo 、または get_include_path を利用する。 XAMPP を使っているなら、以下の URL にアクセス。

http://localhost/xampp/phpinfo.php

 

include を試してみる

Image3右図のようにファイル構成で include の挙動を確認する。実行した環境は、XAMPP を利用しており、phpinfo() を見ると include_path

D:\xampp\php\pear\

と表示される。 右図のルートとなる www フォルダは、PDT で testphp プロジェクト内に作成した。

各ファイルの内容は以下の通り。

  • www/index.php
<?php
include ("include/a.php");
?>
  • www/include/a.php
<?php
print "include/a.php"."<br>";
include("b.php");
?>
  • www/include/b.php
<?php
print "include/b.php"."<br>";
?>

これで www/index.php を実行すると、

include/a.php
include/b.php

と表示された。

 

include でファイルを探しにいく場所を順に考える

上記の実行される流れを考える。最初に www/index.php にアクセスしたので current working directory

www

include する側のファイルとされる側を矢印で示すと、

  • www/index.php → include/a.php、
  • include/a.php → include/b.php

という関係。

ところで、マニュアルには次のように書かれていた。

ファイルのインクルードは、指定されたパスから行います。パスを指定しない場合は、 include_path の設定を利用します。…

つまり、include/a.php において

“b.php”

を include するとき、パスが指定されていないので最初に include_path である

D:\xampp\php\pear\

に b.php がないか検索される。その後 www/include/ 内を検索。

上記の場合は include_path に b.php がなく、www/include/ に b.php があるので www/include/b.php が実行される。

 

相対パスによって指定するとそのディレクトリから検索される

ところで、先ほどのドキュメントには、以下のように書かれていた。

パス (絶対パスあるいは相対パスのいずれでも) を指定した場合は include_path は無視されます。たとえば ../ ではじまるファイル名を指定した場合は、 親ディレクトリからそのファイルを探します。

上記における www/include/a.php で include している部分を include("./b.php"); に変更して実行したら、以下のエラーが表示された。

include/a.php
Warning: include(./b.php) [function.include]: failed to open stream: No such file or directory in D:\xampp\htdocs\testphp\www\include\a.php on line 3
Warning: include() [function.include]: Failed opening './b.php' for inclusion (include_path='.;D:\xampp\php\pear\') in D:\xampp\htdocs\testphp\www\include\a.php on line 3

これは、

./

を付けたことによって current working directory から検索されるため。

www/b.php

は存在しないので上記のようなエラーが表示された。b.php を www に置いたら、エラーは表示されない。

 

意図しないファイルを include してしまう

さて、ここで www/include/

config.php

を作成する。ファイルの内容は "config.php" と文字列を表示するのみ。

これを include/a.php から include して動作を確かめる。 include/a.php の include を include("config.php") と変更した。

実行するとなぜか "config.php" と表示されなかった。

include("config.php") をブレークポイントにしてデバッグしたところ、config.php の include で以下のような表示がされている。

Image5

www/include/config.php を include しているつもりが、include_path (D:\xampp\php\pear\) 内の Config.php を include してしまっている。これは先ほどの説明にあったように、

include_path が最初に検索される

のが理由。 include_path 内にあるファイルと同名のファイルを include をするときは注意が必要。

 

意図しない include をしないための対策

config.php の内容が実行されるには、3 つの方法がある。

  • config.php を myconfig.php のように名称を変え、pear\Config.php とバッティングしないようにする。
  • config.php を current working directory に置き、相対パスで呼出すようにする。www/config.php に置き、include/a.php では、include("./config.php") とする。
  • www/include/config.php の場所は変えず、include/a.php の include の呼出しを次にようにする。

include(dirname(__FILE__) . "/config.php");

include しているファイルから見て相対的な位置で include できるように記述すればよい。(参考: PHP の include, require で相対パスを指定して読み込む場合のメモ - hoge256ブログ)

 

環境を変えたら動作しなかった理由

最初の問題に戻る。環境を変えたら動かなくなった理由は、問題なく動いていた環境では PEAR がインストールされていなかったために、

include("config.php")

の記述により、自分が作成した config.php が include されたていた。

しかし、環境を XAMPP に変更したことにより include_path に PEAR が設定され、include("config.php") の記述により PEAR の Config.php が呼出されたために挙動がおかしくなった。

パタッ(o_ _)o~†

2008年4月20日日曜日

PHP の開発環境を整える (2008.4) - XAMPP, PDT, デバッガ

1. XAMPP を利用する

去年(2007.3)、PHP の開発環境を整えた。あれから一年以上経過したので、再度、開発環境を構築する。

以前は、IDE に PHPEclipse を使い、 Apache, PHP, MySQL を個別にインストールした。今回も個別にインストールすべきか、それとも XAMPP を利用すべきか迷うところ。個別にアプリケーションをインストールすれば、コストはかかるけれど、知識が得られる。

XAMPP の構成は、apache friends - xampp for windows によると、

    • Apache 2.2.8 + OpenSSL 0.9.8g
    • MySQL 5.0.51a
    • PHP 5.2.5 & PHP 4.4.8
    • phpMyAdmin 2.11.4
    • FileZilla FTP Server 0.9.25
    • Mercury Mail Transport System v4.52

[ThinkIT] 第4回:5分でわかるXAMMPの導入事例 (1/3) によると、

多くの企業の担当者たちは、容易なインストールや運用保守の簡易性だけでなく、各種アプリケーションのバージョンをあげる際のマイグレーションのしやすさに着目し、XAMPPの普及が非常に早いスピードで進みました。
   特に小規模のサーバが対象であれば、XAMPPのみで運用を行っている企業はかなりの数に上ります。これに対して、クラスタリング構成を取ることの多い中・大規模なサーバ運営ではXAMPPのみで管理を行えなくなってくるため、このような分野では導入数は少なくなりますが、場合によってはステージング用途として利用されることもあります。
   また最近では、組み込みパッケージのプラットフォームの一部にXAMPPが使われるケースも見られるようになりました。

(太字、下線は引用者による)

今回は、XAMPP を利用することにした。

 

XAMPP のインストールと起動

apache friends - xampp for windows から、インストーラ をダウンロードして、D:\xampp にインストールした。

しかし、XAMPP コントロールパネルアプリケーションから、Apache を起動しようとしたが、出来ない。(@_@;)

こころあてに・・・ - Apacheが起動しない・・・ XAMPP試してみました によると、

[Apache skype]でネットで検索してみました。原因はひょっとしてSkypeがポート80を占拠 Apacheが起動でエラー←コレですか?マジですか?

Skype において、

  • ツール > 設定 > 詳細 > 接続 の「上記のポートの代わり、ポート80を使用

のチェックをはずした。

再度、Apache を起動してみたら、今度は OK 。

http://localhost にアクセスして動作を確認。

 

2. IDE に PDT

PHP のための IDE として、Eclipse プロジェクトで開発されている PDT を利用する。

PDT 1.0.2 は、設定がわからず諦めた

PDT ProjectDownloads から、R20080103pdt-all-in-one-R20080103-win32.zip をダウンロード。

解凍して、起動。適当に PHP Project を作成し、

を参考にして、設定を行った。

  • Windows > Preference... > PHP > PHP Excecutables

で、Executable Path を設定。

Name は、XAMPP でインストールした PHP のバージョンを付けておいた。

Image4

次に、HP Servers の設定でハマった。EclipseでPHP開発環境を作る - 設定 - delab で説明されている PDT と、自分が使っているもののバージョンが違うため、設定画面が異なっていた。

このサーバーへプロジェクトを公開

という項目がなくなっている代わりに、

Path Mapping

というタブが追加されている。

PHP のソースは D:\develop\workspace 内に置き、Apache が、workspace 内のプロジェクトを認識するような設定を、簡単にできると考えていた。しかし、設定できない。どうやるのだろう?

とりあえず、 D:\xampp\htdocs 内に Eclipse のプロジェクトを置けば、実行できる。しかし、できればソースを htdocs 以下とは別の場所で管理したい。 PHPEclipse を使ったときのように、 Apache の httpd.conf を変更する方法しかないだろうか?

Tutorial: Install a PHP Development Environment with Eclipse PDT, Apache 2.2, PHP 5, MySQL 5, and phpMyAdmin Using XAMPP Lite の 11 で説明されている方法も、

Set the workspace to C:\xampplite\htdocs\webs ,

うーむ... (@_@;) この問題について、考えるのは後回しにしよう。ちなみに上記の同サイト内には、PHPEclipse を使った設定の方法が書かれていた。 QQQ

 

PDT 1.0 を利用することに

最新のバージョンでは設定がわからなかったので、一つ前のものを使うことにした。これなら、EclipseでPHP開発環境を作る - 設定 - delab の説明に従って設定を行うことができる。

1.0.2 Release Build: R20070917 より pdt-all-in-one-1.0-R20070917-win32.zip をダウンロードしなおして解凍。

  • Windows > Preference... > PHP > PHP Excecutables

を設定。

Image5

  • Preference... > PHP > PHP Servers

で、ワークスペースに作成した PHP ファイルを、 Apache の htdocs 以下の test フォルダにおいて実行できるように設定した。

Image6

 

Server の設定と、PHP の実行の対応付け

Server の設定は複数作成することができる。複数の PHP プロジェクトがあった場合、それぞれ対応付けることができそう。

例えば、hoge という名前の設定を新しく作ったとする。

Image7

上記の設定を利用するには、PHP Explorer において、実行したいファイルで

  • 右クリック > Run as > Open Run Dialog

を選択する。以下のように、PHP Web Page の設定において、 Server の設定の PHP Server を先ほど作成した hoge にする。

Image8

この設定を適用して実行すると、htdocs の hoge フォルダで実行されるようになる。

追記(2008.4.21): [XAMPP+Eclipse PDT] WindowsでPHP開発環境[文系大学的IT系の悲哀] によると、PHP Server のデフォルトの設定に、ドキュメントルートを設定すればいいとのこと。また、Test というプロジェクトを作成し、そこに test.php を置いた場合、デバックをするときの設定として、以下のようにする。

File/Projectのところには/Test/test.phpを指定。Publish files to Serverにチェックを入れて、Publish to:の末尾にTestと加える。そして、Debugをクリック。

これにより、複数の PHP Server の設定を作らなくても、実行時やデバッグ時の設定をするだけで済む。

 

デバッガのインストール

Tutorial: Install a PHP Development Environment with Eclipse PDT, Apache 2.2, PHP 5, MySQL 5, and phpMyAdmin Using XAMPP Lite の 13 を参考にした。

  1. Help > Software Updates > Find and Install を選択。
  2. Search for new features to install を選択して、Next 。
  3. New Remote Site ボタンを押して、Name: PDT Debugger, URL: http://downloads.zend.com/pdt を入力する。
  4. PDT Debugger がチェックされていることを確認し、Finish ボタンを押す。
  5. Update Site Mirrors ダイアログが表示されるので、Automatically select mirrors にチェックをつけて、OK ボタンを押す。
  6. Updates ダイアログが表示されたら、PDT Debugger にチェックを入れて、Next 。
  7. 後は、指示に従ってインストールを進める。

しかし、デバッグしようと思い、実行したらエラーがでた。パタッ(o_ _)o~†

[Eclipse PDT (PHP Development Tool)] Q&A? によると、

ZendDebugger 5.2.10 は PDT1.0(R20070917)用.5.2.12 は PDT1.0.2(R20080103)用.

(太字は引用者による)

  • Help > Software updates > manage Configuration

を選択し、Zend Debugger Feature 5.2.12.v20071210 を

  • 右クリック > uninstall 。

再度、インストール作業をした。インストールの途中の画面で、

Show the latest version of a feature only

のチェックをはずし、Zend Debugger Feature 5.2.10.v20070905 を表示させ、選択してインストールした。

Image9

追記(2008.4.21): [Eclipse PDT (PHP Development Tool)] Q&A? によると、

PDT+Zend Executable Debugger Plugin でできること(非推奨)

  • PHP ファイルの編集
  • 拡張モジュールを一切使用しない PHP ファイルのコマンドベースでの実行・デバッグ

* 拡張モジュールは含まれていないので実使用には耐えません.

そこで、ZendDebugger-5.2.10-cygwin_nt-i386.tar.gz をダウンロードして解凍。

[XAMPP+Eclipse PDT] WindowsでPHP開発環境[文系大学的IT系の悲哀] によると、

中にある5_2_x_compというフォルダを、php-5.2.xという名前にリネームして、適当なところに置く。今回はZend Extension ManagerとZendOptimizerの隣(C:\xampp\php\zendOptimizer\lib)にDebuggerというフォルダを作り、その中にリネームしたフォルダを設置。

また、同上の説明に従い、環境に合わせて、D:\xampp\apache\bin\php.ini の [Zend] に以下を追加した。

zend_extension_manager.debug_server_ts = "d:\xampp\php\zendOptimizer\lib\Debugger"
zend_debugger.deny_hosts = all
zend_debugger.allow_hosts = 127.0.0.1/192.168.11.*
zend_debugger.expose_remotely = always

Apache を再起動し、 phpinfo() を見ると、Zend Debugger という設定内容が表示されるようになった。これにより、Eclipse の PDT プロジェクトの PHP ファイルで

  • 右クリック > Debug as > PHP Web Page

が動作するようになった。

 

デバッグの方法

を参考に。

Subversion の設定に続く...

 

関連記事

2007年3月6日火曜日

PHP の開発環境を整える (2007.3) - PHPEclipse, デバッガ, Eclipse HTML Editor Plugin

1. 利用するアプリケーション

PHP で開発するための環境を構築したい。

以下のアプリケーションを利用することにする。

上記の構成で、デバッガを利用するには、Eclipse 3.1.2 を利用する必要があるようだ。

According to the forum the debug functions in PHPEclipse 1.1.8 do not work with Eclipse 3.2, use Eclipse version 3.1.2 instead.

 

2. 各アプリケーションのインストール

Eclipse 3.1.2 をダウンロード

PHPEclipse のインストール

デバッガのインストール

ところで、Eclipse のサイトを見ると、PHPに関しても開発が進んでいるようだ。今後が注目される。

Eclipse HTML Editor Plugin をインストールする。

Eclipse 3.1.2 では、2.0.2 までが対応しているようなので、そのバージョンをダウンロード。

GEF が必要なようなので、インストール。バージョンは, 3.1.1 を利用した。

2007年1月30日火曜日

Eclipse において PHP の関数のヘルプを見る

調べたい関数の上にカーソルを持っていき、Ctr + Shift + h

Eclipse で PHP のファイルエンコーディングを EUC-JP にする

Project > Properties > Info > Text file encoding > Other を選択し、直接 EUC-JP と入力する。

Apache に Eclipse で開発してるディレクトリを認識させ PHP を実行

PHPの開発環境を整える」の続き。

Eclipse で開発する際、以下のディレクトリにソースコードを置いている。(workspace)

D:\develop\work\

このディレクトリを Apache に認識させ、ブラウザで

http://localhost/eclipsework

にアクセスしたときに PHP が実行されるようにする。

 

httpd.conf の設定

Apache の httpd.conf に以下を追加。

Alias /eclipsework "D:/develop/work/"
<Directory "D:\develop\work\">
   Options Indexes MultiViews
   AllowOverride All
   Order allow,deny
   Allow from all
</Directory>

追記 (2011.4.27) : XAMPP 1.7.3 を使い、上記を httpd.conf に追加しても反映されなかった。代わりに

  • C:\xampp\apache\conf\extra\httpd-xampp.conf

に追記したら動作した。

追記 (2011.5.18) : C, D ドライブの両方に XAMPP をインストールしているのを忘れ、設定ファイルの記述が間違っていたのが上記動作の原因かも。

 

Eclipse の設定

Eclipse のメニューより Project > Properties > PHP Project Settings において use project setting を選択し、 localhost に

http://localhost/eclipsework

と設定する。

PHP で作業するためには、Window > Open Perspective > Other > PHP を選択。

これにより、PHP Browser が表示されるようになる。