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

2009年3月30日月曜日

配列型のカラム

そもそも、配列型のカラムなんてものを初めて知ったのですが、、、

新しい業界標準「SQL99」詳細解説 - 第二章 柔軟さを増したデータ構造(1)

PostgreSQL v8では、このSQL99に準拠して配列型というカラムが使えます。例えば、あるカラムが整数値の配列を持つ場合、

CREATE TABLE hoge
(
....
fuga INTEGER[],
....
)

みたいに書けるのです。この場合、普通にコマンドラインクライアント(PostgreSQLであればpsql)からこのカラムをSELECTすると、"{val1,val2,...}"という様に、整数値がカンマ区切りで繋がれ、中括弧でくくられた文字列値として見えます。

プログラムからデータを取得する場合は、例えばPerlのDBI/DBD::Pgの場合、このカラムを取得したデータ型は、Perlの無名リストへの参照として自動的に展開されます(注1)。

正直言って、SELECT文一発でカラムデータが検索出来なそうな感じがするので、あまり使いたい気はしないんだけれど、こういうデータ型が便利なシチュエーションもあるのかも知れないなあとも思う。

(注1) ちなみにこの挙動はDBD::Pgのバージョンが2.0以上でないと利用できないっぽい。バージョン1.4では、単なる"{val1,val2,...}"という文字列を取得してしまった。。。

PHP5のPostgreSQLバインドは、まだこの配列型に対応していないっぽいです。いちいち"{val1,val2,...}"をパースして配列に展開する作業が鬱陶しいです、正直なところ。

*****

その後、色々とテストしてみると、DBD::Pg v2.0以降であればINSERT/UPDATE/SELECTにおいて、配列型カラムの値はPerlのリストへの参照と等価であることが分かりました。両者の変換はドライバによってシームレスに行われます。

これはちょっと便利かも。

2009年2月9日月曜日

PHPでグローバル変数

かつて書いたPHPのコードが動かないなあ、と悩んでいたが色々調べて解決した。

PHPはバージョン4からクラスの概念が導入されて、バージョン5ではスコープも色々と使えるようになりました(public / protected / private)が、相変わらずグローバル変数を使うことも出来ます。

例えば、あるファイル(aaa.inc)に以下の様に書いておき、

$_VAR['key'] = 'val';

これを別のファイル(bbb.php)から読み込む。bbb.phpではクラスが定義されており、そのメソッドの中で上記のグローバル変数にアクセスする。

require_once("aaa.inc");

class Hoge
{
 public function fuga()
 {
  global $_VAR;
  echo $_VAR['key'];
 }
}

さて、以前PHP5で上記のコードを開発し実行したのだが、その時はうまく動いていた。PHPの細かなバージョンは覚えていないが。

しかし、久々にPHPの環境を変えてからこれを動かすと、うまく動かない。PHP5の環境は、MacOS XデフォルトからMacPortsの物に変えただけである。

何故だろうと色々と調べていたところ、「PHP5 CLI でのグローバル変数の扱い [PHP Tips]」を発見して、解決方法が分かった。

要するに、この様にスコープを飛び越えてグローバル変数にアクセスしたければ、そもそも変数をグローバル変数だと宣言しなければいけないということなのである。具体的には、上記のaaa.incで、

global $_VAR;
$_VAR['key'] = 'val';

という風に「グローバル変数でございます」と宣言してやれば良いわけだ。試してみたところ、確かにこれで動いた。

いつからこれが必要になったのか、正直良く分かっていない。。。

2009年1月30日金曜日

PHPスクリプトの出力が文字化け

EUC-JPで書かれたPHPスクリプトの出力が文字化けしました。mbstring関係の設定をいじっても効果がありません。ApacheのAddDefaultCharsetディレクティブも記述されていないし、何でだろうと思って色々と調べたら分かりました。/opt/local/etc/php.iniのdefault_charset設定が悪さをしていた模様です。

default_charset = "utf-8"

という行をコメントアウトして文字化けは解消しました。

MacPortsでPHP5 (リベンジ編)

というわけでMacPortsでMySQL 5もPostgreSQL 8.3も入れてしまいました。

いよいよPHP5のインストールを再決行します。今回もまた前回の試行の残骸が残っていて悪さするので、とりあえず綺麗にするところから。

% port clean php5
---> Cleaning php5

さて、色々とvariantsを指定してインストール開始。
さっきは気付かなかったけど、PEARもオプションに入れてみました。

% port install php5 +apache2 +mysql5 +postgresql83 +pear
Error: Target org.macports.fetch returned: fetch failed Error: The following dependencies failed to build: apache2 curl pkgconfig freetype gd2 autoconf help2man p5-locale-gettext perl5.8 perl5 automake fontconfig jpeg libpng libtool libmcrypt mhash tiff

なんか、httpdをfetchしようとして失敗してる・・・。やっぱりapacheすらもMacPortsじゃないといけないのかな。と思ったらこちらのサイトが。早速参考にさせて頂き、apache2をfetchしてみる。

% env MASTER_SITE_LOCAL=http://distfiles.macports.org/apache2 port -v fetch apache2

なんか、あっさりfetch出来た。何かデフォルトのPortsのサイトにトラブルがあるのかな?改めてapache2のインストールだけを試みる。

% port install apache2

今度はうまく行きました。更に本命のPHP5に掛かります。

% port install php5 +apache2 +mysql5 +postgresql83 +pear

依存関係絡みで、pkg-configやcurl、freetype、perl、gettextといったパッケージも入る模様。何故Curl?、しかもperl既に入ってるんですが、って感じもするんだけれど。まぁ、PATHがちゃんとしてればMacOS Xデフォルトのバージョンとはかぶらないから大丈夫なのかな。それよりもMacPortsで入れたApache2をどうするかの方が気になる。

と思ったらエラーで停止。しかも、Perl 5.8.8をPerl 5.8用とPerl 5用と、二つの目的で二回別々にビルドして入れようとしてる。何かおかしくないか??

---> Fetching perl5.8
---> Attempting to fetch perl-5.8.8.tar.bz2 from http://www.cpan.org/src/5.0/
---> Verifying checksum(s) for perl5.8
---> Extracting perl5.8
---> Applying patches to perl5.8
---> Configuring perl5.8
---> Building perl5.8 with target all
---> Staging perl5.8 into destroot
---> Installing perl5.8 5.8.8_3+darwin_9
---> Activating perl5.8 5.8.8_3+darwin_9
---> Cleaning perl5.8
---> Fetching p5-locale-gettext

これと、

---> Fetching perl5
---> Attempting to fetch perl-5.8.8.tar.bz2 from http://www.cpan.org/src/
---> Verifying checksum(s) for perl5
---> Extracting perl5
---> Applying patches to perl5
---> Configuring perl5
---> Building perl5 with target all
---> Staging perl5 into destroot
---> Installing perl5 5.8.8_0+darwin_9
---> Activating perl5 5.8.8_0+darwin_9
Error: Target org.macports.activate returned: Image error: /opt/local/bin/a2p is being used by the active perl5.8 port. Please deactivate this port first, or use the -f flag to force the activation.
Error: The following dependencies failed to build: gd2 autoconf help2man perl5 automake fontconfig jpeg libpng libtool libmcrypt mhash tiff Error: Status 1 encountered during processing.

これ。当然同じ物だからかち合うよね。。。とりあえずエラー発生後にインストール済パッケージを調べると、

% port list installed
(snip)
perl5 @5.8.8 lang/perl5
perl5.8 @5.8.8 lang/perl5.8
(snip)

そりゃあ当然入ってるよね。エラー出た割にちゃんと入っているみたいなので、しつこくPHP5のインストールを再実行してみる。

% port install php5 +mysql5 +postgresql83 +pear

すると、何事も無かったかの様に(笑)、help2man、autoconf、automake、fontconfig、jpeg、libpng、libtool、gd2、libmcrypt、mhash、tiff、php5とインストールを続行する。依存パッケージ大杉。全部ソースのtar-ballダウンロードして展開してビルドしてインストールだから、めっちゃ時間掛かるしCPUも喰う。(コンパイラのCPU負荷は高いですから・・・)グラフィックス描画のgdライブラリをビルドするから画像系のパッケージが要るのかな?それにしても、さっきのエラーは何だったんだろうか。。。

さて、時間は掛かったものの無事インストールは終了。最後に以下のコマンドを実行することを進められたので、実行しておく。

% cd /opt/local/apache2/modules
% /opt/local/apache2/bin/apxs -a -e -n "php5" libphp5.so

するとエラーが・・・

% cd /opt/local/apache2/modules
% /opt/local/apache2/bin/apxs -a -e -n "php5" libphp5.so
apxs:Error: Config file /opt/local/apache2/conf/httpd.conf not found.

で、件の/opt/local/apache2/confディレクトリ以下を見ると、httpd.confは無く、httpd.conf.sampleがある。そこで、サンプルをコピーして上記のコマンドを再実行。

% cp httpd.conf.sample httpd.conf
% cd /opt/local/apache2/modules
% /opt/local/apache2/bin/apxs -a -e -n "php5" libphp5.so
[activating module `php5' in /opt/local/apache2/conf/httpd.conf]

今度はうまく行きました!

今回はMacPortsでもApache2を入れ、PHP5はそちらに設定しました。MacOS XデフォルトのApacheでMacPortsのPHP5を参照しても良いんですが、今日は水入りとしまして・・・

それにしても、ホントMacPortsって何でも出来ちゃいますね。元々のPortsシステムも凄いけれど、それをMacOS Xに移植してくれた人も凄いです。先人の知恵と努力の結晶に感謝しつつ、今日も何とか作業が完了しました。

2009年1月29日木曜日

MacPortsでPHP5

JavaFlavor Blogさんの「MacPortsでApache2+PHP5」を参考にさせて頂き、MacPortsからPHP5を入れることにする。

既にMacPortsは導入済みなので、早速以下のコマンドラインを試してみることに。

% /opt/local/bin/port variants php5

すると、上記のblogエントリにあるよりももっと多くのオプションが利用可能に。。。凄い、凄いよMacPorts!

というわけで、現在MySQL5を使っていて、今後はPostgreSQL 8.3を使いたい(というか既にインストール済)な私は、以下のコマンドラインでインストールにトライ。

% /opt/local/bin/port -v install php5 +apache2 +mysql5 +postgresql83

しかし残念ながらエラーで止まる。エラーメッセージはこんな感じ。

Error: Target org.macports.build returned: shell command " cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_databases_mysql5/work/mysql-5.0.67" && make all " returned error 2

もしかして、MySQLはMacPorts経由じゃなく入れているからだろうか。

ApacheはMacOS Xのデフォルトでインストールされているのでそちらを使うとして、MySQLとPostgreSQLはMacPorts経由で入れ直した方が良いかしら。

ApacheでVirtualHost

プライベートも含めて幾つかのウェブサイトを開発しているので、開発機のMacBook君にVirtualHostを設定することに。

以下、備忘録です。

  1. まずhostsファイルを編集して必要なドメインを登録
    /etc/hostsに"127.0.0.1 hoge.com"みたいな記述を追加
  2. 次にApacheのVirtualHost用設定ファイルを編集
    /etc/apache2/extra/httpd-vhosts.confを編集
  3. 更にApacheのVirtualHostを有効化
    /etc/apache2/httpd.conf内のhttpd-vhosts.confに関するIncludeディレクティブを有効化
  4. 設定ファイルのチェック
    % apachectl configtest
  5. そしてApacheを再起動
    % apachectl restart
VirtualHostの設定ではIPではなくホスト名ベースの設定を採用。適宜VirtualHost毎にDocumentRoot, ErrorLog等を設定。

元々のVirtualHost設定ファイルには"CustomLog /path/to/log common"みたいな記述があるが、これがチェックで引っ掛かる。ここは"TransferLog /path/to/log"と書き直して対応。最後の"common"が残らない様に注意。ここの記述って、Apacheのバージョンによって違うのかな??

とりあえずこれでVirtualHostの設定が完了。

次はPostgreSQL対応のPHP5を入れます。

2009年1月28日水曜日

MacOS XのPHP

いわゆるLAMP (Linux, Apache, MySQL, and PHP) ならぬMAMP (MacOS X, Apache, MySQL, and PHP) な環境でソフト開発をしていたんですが、今度はMySQLの代わりにPostgreSQLを使うことになり、早速MacOS X用のインストーラを落としてきて入れました。

ところが、何とMacOS XデフォルトのPHP5はPostgreSQLに対応していません。phpinfo()で見ると、ビルド時のconfigureオプションでPostgreSQLを有効にしていないのです。

何たる割り切り・・・orz

というわけで、何とかしてMySQLもPostgreSQLも使えるPHP5を導入しなければいけなくなりました。MA(M|P)Pって感じです。(←分かり辛っ)

2009年1月18日日曜日

PHPのinclude_pathで

paperboy & co.のHeteml (ヘテムル) というホスティングサービスを個人的に契約して使っているのですが、ここのPHPがイマイチ使いにくい。とは言ってもPHPはPHPなのでどこで使おうが一緒なのだけれど、問題は各ユーザが個別にinclude_pathを設定できない点。

通常、.htaccessでphp_valueディレクティブを使ってinclude_pathを設定すれば、各ユーザが個別にinclude_pathの設定が出来るのだと思われるが、これが出来ない為にrequireやincludeに指定するパスをどうすれば良いのか、非常に悩ましいのだ。

ちなみに、今はrequire / include対象のファイルを絶対パスで指定することでこの問題を避けているが、これははっきり言ってダサい。あまりにもダサい。

もっとスマートにどうにか出来ないものかなあ。

2008年10月4日土曜日

Cプログラミング雑記

すっかりこちらの更新が滞っていました。

最近、C言語でのプログラミングを仕事でやっているんですが、組込向けなので自前でライブラリ関数レベルの機能を実装しなければいけなくて、結構ハマる事もしばしば。

最近ではBASE64エンコード/デコードのコードを書いたのですが、細かなビットシフト演算の部分でミスがあったりして、1週間くらい格闘する羽目に陥りました。結局は全て解決して、やっとちゃんとしたコードになりました。

あともう一つハマったのは、CでBASE64エンコードしたデータを受け取る側のPHPスクリプトの問題です。Content-Typeをapplication/x-www-form-urlencodedで送ると、URLエンコード特有の処理をPHPが裏でやってくれてしまうんですよね。いわゆる、空白文字をプラス文字(+)に置き換えている処理を、PHPスクリプトでは自動デコードしてくれてしまうのです。

BASE64は、アルファベット(A-Za-z)と数字(0-9)と記号(+/)にデータを変換するのですが、URLエンコードの自動でコード処理をされてしまうと、+にエンコードされていたデータが空白に戻されてしまっておかしな事になります。

これもだいぶハマりました。。。

まぁ、うまく行った時の達成感は得がたい物がありますが、C言語は本当に全てがプログラマ任せで大変です。Javaがメインだった頃が懐かしい・・・

2007年2月3日土曜日

emacsでphp-modeのデフォルトエンコーディングをutf-8にしたい件

Meadow2を参考にさせて頂き、以下の記述を~/.emacsの先頭に追加するとスッパリ解決。

(modify-coding-system-alist 'file "\\.php$" 'utf-8)
(modify-coding-system-alist 'file "\\.inc$" 'utf-8)

やはり頼るべきはイソターネットですね。
多謝

php-mode

久々にPHP開発をしているのだが、久々ついでにエディタはEmacsを使っている。しかし、php-modeでなぜかエンコーディングがSJISになってしまって困っている。本当はUTF-8にしたいのだが。。。

mmm-modeで同一バッファ内でのhtml-modeとphp-modeの切り替えをしているのだが、こちらはこちらでphp-modeでのインデント時にエラーが発生する。また、デバッグをオンにしてもエラーメッセージの意味が分からない。。。(汗

久々のEmacsには中々手こずる。しかし、このキーバインドにはすっかり馴染んでしまっているので、何とか頑張らないと。

2007年1月2日火曜日

PHPからMySQLへの接続で問題発生

Mac OS X Server 10.4: PHP から MySQL への接続時に生じる問題

MacOS X (Serverぢゃなくて普通のクライアント版)にはデフォルトでApacheが仕込まれており、更にご丁寧な事にPHP 4.0のモジュールまで導入済みだ。設定ファイルをちょっといじってApacheを再起動すればすぐにPHPが利用可能となる。

更に、MySQLは簡単に導入可能であったりして、もはやLAMP (Linux Apache MySQL PHP)の開発専用コンピュータなのではないかと思ってしまうくらい、MacOS XはLAMP Readyだ(笑)。

そして、ちょっとPHPを使ってみたらMySQLへの接続でエラーが出てしまったが、冒頭の様にAppleのサイトには既にFAQ(?)らしく、ちゃんと情報が載っている。

素晴らしい!やっぱMacOS Xは開発者の為にもベストチョイスだ。涙出そうだ・・・(大げさ)

2006年12月31日日曜日

PHP開発環境の導入に難儀

Eclipseで良いPHP開発環境が無いかと思って探したのですが、まずはZendのPHP IDEを試そうとしたところ、何しろ他feature/pluginのrequirementが多いのなんの。で、色々と苦労して必要な機能を導入したのですが、EMF(Eclipse Modeling Framework)のバージョン2.3が入っているのに、「EMF 2.2もしくは同等版が存在しない」と文句を言われる始末。

面倒なので一旦Eclipseをフォルダごと削除し、再びPHP IDEありきでセットアップ再開ですわ。。。orz