MW211 EXIT

devlog
PHP/浮動小数点型とフォーマット指定子
2013年11月03日
「sprintf('%.f')」で浮動小数点型を表示する場合、
こまかく表示しすぎると誤差がでてしまう。
┌──────────────────────────────────────┐
│sprintf('%.17f', 0.7);                                 →0.69999999999999996│
└──────────────────────────────────────┘

でも、端数を四捨五入してくれるらしいので、
ある程度まで粒度を下げると、正しい値になってくれる。
┌──────────────────────────────────────┐
│sprintf('%.16f', 0.7);                                 →0.7000000000000000 │
└──────────────────────────────────────┘
こいつが、端数切捨てで「0.699…」だったら大変だ。

ちょっと気になったのでついでに。
┌──────────────────────────────────────┐
│sprintf('%.f'  , 0.7);                                 →0.700000           │
└──────────────────────────────────────┘

なお、ちなみに「%.F」(こちらはfloat型、「%.f」はdouble型)も同じ結果。
分類:PHP
PHP/iniファイルの記述ミス
2013年11月02日
┌─────────────────────────────────[xxxx.ini]┐
│[WEB]                                                                       │
│ROOT=/root                                                                  │
└──────────────────────────────────────┘
上記のようなiniファイルを定数化してしまうプログラム。
┌──────────────────────────────────────┐
│foreach (parse_ini_file('xxxx.ini', TRUE) as $key1 => $value1) {            │
│    foreach ($value1 as $key2 => $value2) {                                 │
│        define($key2, $value2);                                             │
│    }                                                                       │
│}                                                                           │
└──────────────────────────────────────┘

以下のようにコメントアウトするつもりが…。
┌─────────────────────────────────[xxxx.ini]┐
│;ROOT=/root                                                                 │
└──────────────────────────────────────┘

入力ミスで以下のようにコメントアウトしてしまった。
┌─────────────────────────────────[xxxx.ini]┐
│::ROOT=/root                                                                │
└──────────────────────────────────────┘

そしたら、以下のようなエラーとなってしまった。
┌──────────────────────────────────────┐
│Warning: Class constants cannot be defined or redefined in …               │
└──────────────────────────────────────┘

「["::ROOT"]」を定数名にしようとしてしまったんだから当然だ。

ま、iniファイルだからそんなに堅牢にする必要はないのだけど…。
分類:PHP
PHP/formの飛び先パスについての注意
2013年10月25日
formタグのactionパラメータに、飛び先のURLを指定する場合、
それがファイルではなく、ディレクトリであった場合には
しっかり末尾に「/」をつけてあげなければならない。
┌─┬────────────────────────────────────┐
│×│<form method="post" action="/abc">                                      │
├─┼────────────────────────────────────┤
│○│<form method="post" action="/abc/">                                     │
└─┴────────────────────────────────────┘

さもないと、「301転送」が発生してしまう。
┌─┬────────────────┬───────────────────┐
│×│… "POST /abc HTTP/1.1" 301 …  │301 Moved Permanently(転送)           │
├─┼────────────────┼───────────────────┤
│○│… "POST /abc/ HTTP/1.1" 200 … │200 OK(正常)                          │
└─┴────────────────┴───────────────────┘
(といっても、そうならないパスがあったりするから厄介だ)

「301転送」が起きるとどうなるのか?POSTの中身が消えてしまう(引き継がれない)

つまり、formタグの「/」がないだけで、いくらsubmitしても
受信側で$_POSTでデータを拾えないという怪奇現象が発生してしまうのだ。
(といっても、そうならないパスがあったりするから、ますます怪奇現象だ)
【後日追記あり】
分類:PHP、Apache
PHP/タイムゾーンの設定
2013年10月13日
「php.ini」で定義するか。
┌─────────────────────────────────────┐
│[Date]                                                                    │
│date.timezone = Asia/Tokyo                                                │
└─────────────────────────────────────┘

プログラム中で定義するか。
┌─────────────────────────────────────┐
│date_default_timezone_set('Asia/Tokyo');                                  │
└─────────────────────────────────────┘
分類:PHP
PHP/phpinfo()をコマンドラインから
2013年10月08日
「php.exe」のあるフォルダにて
┌──────────────────────────────────────┐
│> php.exe -i                                                                │
└──────────────────────────────────────┘
と、「-i」オプション付きで実行すると、ずらずらと情報が画面出力される。

例によって、「clip」コマンドと併用して、バッファに吐き出し
エディタに貼り付けると便利かも。
┌──────────────────────────────────────┐
│> php.exe -i | clip                                                         │
└──────────────────────────────────────┘
分類:PHP
PHP/DateTimeインスタンスのコピー
2013年10月01日
┌──────────────────────────────────────┐
│$newDateTime = new DateTime();                                              │
│$newDateTime2 = $newDateTime;                                               │
│$newDateTime2->modify('+1 minutes');                                        │
└──────────────────────────────────────┘
上記のように、DateTimeクラスのインスタンスをコピーして
コピー先を更新すると、コピー元も更新される。
(つまり「$newDateTime」の方も1分進んでしまう)

ちょうど、アドレス渡しで更新した時のような感じだ。

では、値渡しのような別物をコピーするには?
┌──────────────────────────────────────┐
│$newDateTime2 = new DateTime($newDateTime->format('Y-m-d H:i:s'));          │
└──────────────────────────────────────┘
とか?(試していないので実際に動作するかはわからない)

いやいや、もっと簡単な方法がある。「clone」だ。
こんな感じ。
┌──────────────────────────────────────┐
│$newDateTime = new DateTime();                                              │
│$newDateTime2 = clone $newDateTime;                                         │
│$newDateTime2->modify('+1 minutes');                                        │
└──────────────────────────────────────┘
これだと「$newDateTime」の方には影響がない。
分類:PHP
PHP/改行コード除去
2013年09月30日
改行コードを除去するには以下のようにやるのが主流らしい。
┌──────────────────────────────────────┐
│$文字列 = str_replace(array("\r\n","\r","\n"), '', $文字列);                │
└──────────────────────────────────────┘
CR、LF、CRLFいずれもいっぺんに除去できる。
分類:PHP
PHP/tempnam()の不正時
2013年09月26日
「tempnam()」は、一時ファイルを作成したい場合に、
適当なファイル名を作成してくれる便利な関数だ。

以下のように引数を指定すると、そのフルパスを返却してくれる。
┌──────────────────────────────────────┐
│tempnam(ディレクトリパス, ファイルの接頭辞);                                │
└──────────────────────────────────────┘

ところで、ディレクトリパスが存在しないものだった場合は?

この場合、Windows一時ファイル(「C:\Windows\Temp」配下など)のパスで
作成されるようだ。(但し、もちろんWindows環境での話)

ぶっちゃけ適当な文字列を指定しても(空文字も含む)、同じようだ。
分類:PHP
PHPダウンロード/readfile()は大きなファイルには使えないⅡ
2013年09月25日
「readfile()」で、大容量のファイルをダウンロードした場合以下のエラーとなる。
┌──────────────────────────────────────┐
│Fatal error:  Allowed memory size of xxxxxxxxx bytes exhausted              │
│                                   (tried to allocate xxxxxxxxx bytes) in …│
└──────────────────────────────────────┘

これを回避するには「while (@ob_end_clean());」で、
出力バッファリングをオフにしてやればいい。
┌──────────────────────────────────────┐
│while (@ob_end_clean());                                                    │
│readfile($大容量ファイル);                                                  │
└──────────────────────────────────────┘
「ob_end_clean()」の前に「@」を付けてエラーメッセージを抑止しているのは、
万一既に出力バッファリングがオフだとエラーとなってしまうため。
デバッグで「ob_get_level()」でその時点での状況を確認してみればよい。
「1」以上だとオンだ。

ということで、「fread()」とかを使わずにそのまま対応できるようだ。
分類:PHP
PHP/ZipArchive
2013年09月24日
PHP標準でZIP圧縮ができるようになった(って結構前から?)。
ZipArchiveクラスである。
include不要、即使える。

こんな感じ。
┌──────────────────────────────────────┐
│$newZipArchive = new ZipArchive();                                          │
│$result = $newZipArchive->open('test.zip',                                  │
│                               ZIPARCHIVE::CREATE);                         │
│if ($result !== TRUE) {                                                     │
│    exit('エラー');                                                         │
│}                                                                           │
│$newZipArchive->addFromString('test.txt',                                   │
│                              'てすと');                                    │
│$newZipArchive->close();                                                    │
└──────────────────────────────────────┘
即席でテキストファイルを作り、圧縮している例だ。

「addFromString()」メソッドの部分を、「addFile()」メソッドにすれば
既存ファイルを参照して、圧縮することができる。
┌──────────────────────────────────────┐
│$newZipArchive->addFile('C:\input.txt',                                     │
│                        'test.txt');                                        │
└──────────────────────────────────────┘
分類:PHP
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 … 18 次へ