2inc.org

海の家

PICT0333

phpにおける文字列比較でハマる

数値として文字列が評価された時、結果の値と型は次のように定義されます。

文字列の中に ‘.’ や ‘e’、’E’ といった文字が含まれず、 数値が integer 型の範囲内 (PHP_INT_MAX で定義されています) におさまる場合は integer として評価されます。それ以外の場合は、すべて float として評価されます。

文字列の最初の部分により値が決まります。文字列が、 有効な数値データから始まる場合、この値が使用されます。その他の場合、 値は 0 (ゼロ) となります。

http://www.php.net/manual/ja/language.types.string.php#language.types.string.conversion

phpは数値と文字列が比較された場合、文字列は「0」として扱われるんだと。普通に考えて「0==文字列」で比較してtrueになるなんて思わねぇだろ\(^o^)/

文字列として比較する場合は、「strcmp($str1,$str2)」を使った方が無難。

参考

クラゲ

PICT0471

HTTPS通信時、IEでCSVファイルがダウンロードできない件

phpでDBからCSVファイルを生成、submit押したらダウンロードという単純なプログラムを作成したんだけど、なぜかIEでだけダウンロードできない。またIEかよと。

調べてみたところ、どうやらCache関係でいろいろあるらしい。

no-cache指定されていると発生するようです。

なんとなく意味がわかりました。IEだとページ閲覧もダウンロードもすべてtemporary Internet filesフォルダへいったん保存されます。保存されたデータは、no-cache指定されていると、即削除されるため、ダウンロードの場合の、

ダウンロード→temporary→指定フォルダ

この流れが実現できないためかと思われます。ダウンロード→temporaryこの時点で削除されてしまうため。

PHPで、これを回避するには、cacheするように設定することで対応可能です。

PHPでCSVファイルのダウンロード(SSL+IE)Tips for Programing

実際にheader情報を確認してみると、確かに

Cache-Control: no-cache
Pragma: no-cache

とあるのを発見。まぁ冷静に考えてみれば、SSLなんだからこのようなCache設定になってるのは当たり前か。
てことなんだけど、以下のような情報も発見。

IE6 の場合、アクセスしたページの HTML ファイル本体とそのファイルで指定してあった css ファイルが一時フォルダにキャッシュされることが確認できた。ブラウザを閉じても、これらのファイルは残されたままだった。サイトの設計によっては、このキャッシュファイルの中にクレジットカード情報などが入っていることになるかも知れない。ちょっと恐ろしい仕様だと思われた。サーバー側でがんばって no-cache ヘッダを出すとか、対策をする必要があるだろう。

ff3 の場合、アクセスしたページの HTML ファイル本体とそのファイルで指定してあった css ファイルがメモリにキャッシュされた。ブラウザを閉じたらこれらのキャッシュは消えてしまった。後から出たブラウザだからこうなっているのかも知れない。キャッシュもきいて、センシティブな一時ファイルも残らない、バランスの取れた実装だと思った。

SSL と キャッシュの微妙な関係 民芸的プログラミング 〜ソフトウェア開発日記〜

IE・・・orz
今度実験してみよう。