PHPで組んだものをIEデミルとどうも動きが怪しい。
ちょっと調べてみると、IEがセキュリティ設定の都合でHTTP_REFERERを吐いていないらしく、一部画面の推移に影響が出ていた。
てっきりJavaScriptだけだと思っていたのに、サーバにも情報を隠蔽していたらしい。
仕方がないので、HTTP_REFERERを使わないようにい変更するしかない・・・
「PHP」カテゴリーアーカイブ
Spreadsheet_Excel_Readerのバグ
セルの書式に文字列を指定すると、
Notice: Undefined variable: formatstr in D:\xxx\xxx\Excel\reader.php on line 636
という注意が出ます。
xxxは適当なパスだと思ってください。
このエラーメッセージの出るところを見てみると、変数の初期化がきちんと行われていなため、例外処理が不完全だということのようです。
このあたりの一連の処理が始まるところで、$formatstrを初期化してしまいましょう。
630行目に
$formatstr=”;
とでもしておきます。
これで注意が表示されなくなりました。
このあたりは、PHPのバージョンが違うと注意は表示されないのかもしれません。
このライブラリのようなコードの書き方はあまり馴染めません。
中括弧({})を使ったほうが見やすいと思うのですが。
型を取得する
Perlの場合
ref( $str );
全て大文字の文字列が返る
PHPの場合
gettype( $str );
全て小文字の文字列が返る
path設定のセパレータがOSで違うのにハマった
ちょっと複雑な設計になってくると、パスの制限を回避したくなります。
いや、本当はそういう制限があっても問題ないのが本当はいいのだけど、いちいちdefineで宣言するのもめんどくさいし、過程よりも結果に重きをおくべきなのはいうまでもありません。
ということで、set_include_pathをいじって、システムの設計を一部変更して、テストサーバにアップしたとたんに異変が。
今まで動いていたのが、ファイルが見つからないの嵐に。
よくよく調べたら、Windowsとそれ以外ではpath設定のセパレータが異なるという。
OSのpathを利用しているからだと分かればたいしたことないのだけれど、コロンとセミコロンなんて、ぱっと見て違いに気づきませんよ、普通。
定数のPATH_SEPARATORを使えばいいのだけれど、こういう回避の仕方はphpだからこそというか、無理やりというか・・・
マニュアルのページには以下のようなコードが載っていました。
<?php
if ( ! defined( "PATH_SEPARATOR" ) ) {
if ( strpos( $_ENV[ "OS" ], "Win" ) !== false )
define( "PATH_SEPARATOR", ";" );
else define( "PATH_SEPARATOR", ":" );
}
?>
phpの定数とか関数の初期値は、バージョンが変われば変化してしまう危険があるので、あまり使いたくないけど、どの道php6はまだ先のことだろうから、とりあえずPATH_SEPARATORをつかってしのぐことにしようかな。
.htaccessでやればいいみたいだけど、詳しい説明が載ってない。
設定済みのものを取得私鉄かしたいような場合だと、.htaccessでは全部書き直さなければいけないようなので、phpで一度取得した後に再設定する方法がいいのだろう・・・。
と、散々愚痴っていたけど、php.iniをよく見たら
; UNIX: "/path1:/path2" ; Windows: "\path1;\path2"
このように、しっかり書かれてあった。
まとめると、以下のようになる
php.iniで設定する場合
include_path = ".;c:\php\pear;c:\php\cli\pear;c:\home\php_myLib"
.htaccessで設定
する場合
php_value include_path ".:/usr/local/lib/php:/home/user/php_myLib"
長いこと使っていても知らなかった。
というか、使うことがなかっただけかもしれない。
PHPでメールを送信するときのメモ
メール送信はどうも使い慣れません。
現在のWebコンテンツでメール送信は切っても切り離せないものですが、どうも使い方に慣れません。
とりあえず、何度かこうやってメモしていけば体が覚えてくれることでしょう。
本棚にはオライリーの4000円もする「電子メールプロトコル」の本がありますが、たいして活用されていません。
とりあえず、さて、メールを送信したアドレスが存在しない場合、その送信先のドメインが存在しなかったり、ユーザが存在以内場合はリターンメールが返ってくるのですが、その通知先を指定できます。
(そもそもこの考え方であっているのか?)
ヘッダでは「Return-Path」です。
ヘッダにあたる部分には以下のように記述しておくことになっています。
Return-Path: return@exsample.com
しかし、この方法ではほとんど有効ではなく、スクリプトやサーバが指定したものに強制的に上書きされることがほとんどのようです。
もちろん、設定できるのですが、動的に変化させる場合この方法では使えません。
これを回避するには、sendmailへのスイッチが有効なようです。
PHPでは第5引数に次の内容を追加します。
"-f return@exsample.com"
つまり実際にはこうなります。
mb_send_mail( $to, $subject, $body, $headers, "-f $mail" );
これで、受信したメールのソースを見ても正常に設定されました。
メール送信用のモジュールやライブラリを使っている場合はこの限りではありませんので、ご注意ください。
参考にしたのはこのあたり
http://builder.japan.zdnet.com/member/u87200/blog/2009/02/08/entry_27020134/
PHPのHTTP_Clientライブラリ
ファイルをアップロードするにはHTTP_Clientがいいらしいんだけど、
セッションでログイン管理しているからCookieを食わせなくてはいけない。
正確には、すでに食っているので、クッキーの値を送ってやる必要がある。
いろいろ調べてみると、HTTP_Client_CookiManagerというものがあって、passCookies()でセットできるらしいところまではわかったけどうまくいかない。
解説サイトも翻訳しただけで、ろくなサイトが見つからない。
やっぱりこういうクライアント側のごにょごにょはPerlしか使い物にならないのだろうか・・・
更新件数を取得する
PHPでMySQLを扱うときのお話。
データベースに変更のあった行の数を取得する
mysql_affected_rows();
ただし、UPDATEの場合、更新が行わなければ0が返る。
ファイルのMD5ハッシュを求める
このページはhttp://pg.penlabo.net/another/md5.htmlに移行します。
Perlの場合
use Digest::MD5; my $file = 'exsample.txt'; open FILE, $file; binmode FILE; print Digest::MD5 -> new addfile( *FILE ) -> hexdigest; close FILE;
PHPの場合
$file = 'exsample.txt'; echo md5_file( $file );
PHPの関数「mysql_insert_id()」について
データベースを利用していて、割と使用頻度の高い関数mysql_insert_id()
同時に書き込んだ場合、この値が狂うとこまるし、テーブルをロックしたほうがいいのかどうかを調べてみました。
PHP: mysql_insert_id – Manualによれば、セッションで管理されていて、MySQLのlast_insert_idと同じ機能だということです。
つまり、テーブルをロックする必要はないということでした。
PHPでExcelを読み書きする
PHPでEXCELを読み書きするには、
- Spreadsheet_Excel_Writer
- Spreadsheet_Excel_Reader
が便利です。
ドキュメントの使い方だけを載せているサイトは沢山ありますが、インストール方法を載せているサイトはぜんぜん無いので書いておきます。
WriteはPEARに登録されていますが、Readerは手動でインストールする必要があります。それにWriteの利用にはOLEのインストールも必要になります。WriterとOLEは共に開発版だったので、-fオプションをつけてインストールする必要があります。
pear install -f OLE
pear install -f Spreadsheet_Excel_Writer
次にReaderのインストールですが、SourceForgeで公開されているので、書庫を保存します。
必要なファイルはExcelフォルダとその中にある2つのファイル「reader.php」と「oleread.inc」です。
Excelのディレクトリごと、PEAR保存フォルダの「Spreadsheet」ディレクトリにコピーします。
本来はこれで仕えるはずですが、残念ながらそうは行きません。
reader.phpを編集してrequireするファイル名を変更します。31行目を削除またはコメントアウトして、1行追加してください。
//require_once 'Spreadsheet/Excel/Reader/OLERead.php';
require_once 'oleread.inc';
OLERead.phpは検索しても出てこないので、PEARに登録するときにこの名前にするつもりだったとか、開発環境ではこの名前になっているとか言う落ちでしょう。自分でもたまにやりますから。これでSpreadsheet_Excel_Readerが動くようになりました。このライブラリの使い方は別の機会に。
おまけ
Writerの解説ページ