MW211 EXIT

devlog
PHP/設定系エラー(1)
2012年04月14日
┌──────────────────────────────────────┐
│Fatal error: Allowed memory size of xxxx bytes exhausted                    │
│ (tried to allocate xx bytes) in …                                         │
└──────────────────────────────────────┘
【原因】
  PHPプログラム処理で使用するメモリが規定のサイズを超えた。
  →変数(配列)をいっぱい使うなど贅沢なメモリの使い方の処理をしているなど。
【処置】
  ・プログラムを見直して、使用メモリの省力化をはかる
  ・「php.ini」の「memory_limit」の設定を変更する
分類:PHP
PHP/「\」の扱い
2012年04月09日
PHPにおける「\」の扱い(*1)
  ・「\\」は「\」に変換され、残った「\」は「\」の扱いとなる
  →「\」の数を2で割って端数を切り上げた数が、実質的な「\」の数となる
  *1:「'」もしくは「"」で囲われた文字列中の場合

PostgreSQLにおける「\」の扱い(*2)
  ・「\\」は「\」に変換され、残った「\」は無視される
  →「\」の数を2で割って端数を切り捨てた数が、実質的な「\」の数となる
  *2:「standard_conforming_strings = off」または「E''」の中での扱い

よって、記述内容と、実質的な意味の関係はこんな感じ。
┌─────┬───┬───┬───┬───┐
│          │   \d │  \\d │ \\\d │\\\\d │
├─────┼───┼───┼───┼───┤
│   PHP    │   \d │   \d │  \\d │  \\d │
├─────┼───┼───┼───┼───┤
│PostgreSQL│    d │   \d │   \d │  \\d │
└─────┴───┴───┴───┴───┘
分類:PHP
PHP/バックスラッシュ
2012年04月08日
PHPにおいて、「'」(もしくは「"」)で囲われた文字列中の
「\」(バックスラッシュ)は特別な意味をもつ…らしい。

どんな、特別な意味を持つのか、echoしてみれば一目瞭然
┌──────────────────────────────────────┐
│echo '\';       →閉じるの「'」をエスケープしてしまいエラー                 │
│echo '\\';      →「\」                                                     │
│echo '\\\';     →閉じるの「'」をエスケープしてしまいエラー                 │
│echo '\\\\';    →「\\」                                                    │
│echo '\d';      →「\d」                                                    │
│echo '\\d';     →「\d」                                                    │
│echo '\\\d';    →「\\d」                                                   │
│echo '\\\\d';   →「\\d」                                                   │
└──────────────────────────────────────┘

つまりは、以下のとおり。
  (1) 「\」は直後の文字をエスケープする(エスケープ用文字)
  (2) 「\\」は文字としての「\」に変換される(先頭から順に)
  (3) よって、連続する「\」の数が奇数の場合、最後の「\」はエスケープ用文字となる
  (4) エスケープ用文字「\」は「'」や「"」など、文字囲いには影響を与えるが
      いわゆる正規表現の文字(\dや\w)となっても、
      その文字列なだけでその中身([0-9]とか)にはならない

「preg_match()」など正規表現を使う時には、まず上記の一時変換がなされた後に
その結果を元に正規表現として変換するので
「preg_match('/\d/',…)」も「preg_match('/\\d/',…)」も
「\d」と入力されたのと同じものとして、「[0-9]」的なものに変換される。

但し、「\」を検索文字としたい場合には、正規表現上「\\」でなければならず
そのように変換される元の文字は「\\\\」(もしくは「\\\」)なので
「preg_match('/\\\\/',…)」とPHP上は表記することになる。
※「\\\」が許容されるのは「/\\\/」が「/」+「\\」+「\/」と区切られるのではなく
  「/」+(「\\」+「\」)+「/」と区切られるからのようだ

つまり「preg_match('/\\d/',…)」的な方が正しいのかもしれないが
結果オーライで「preg_match('/\d/',…)」が使用されているのが多数派。
ただし「preg_match('/\\\\/',…)」の意味がよくわからなくなり
「preg_match('/\\\/',…)」も許容されるので訳がわからなくなるという感じか。
分類:PHP
PHP/「\」を「\\」に置換する方法
2012年04月07日
「\」(バックスラッシュ)は、PHPとしても、正規表現としても特殊な意味をもつので
その取扱いがややこしい。

結論からいうと、「preg_replace()」を使った場合、以下のような感じだ。
┌──────────────────────────────────────┐
│$置換後 = preg_replace('/\\\\/', '\\\\\\\\', $置換前);                      │
└──────────────────────────────────────┘

┌──────────────────────────────────────┐
│(1) PHPとして、「'」で囲われた文字中の「\\」は「\」になる                   │
├──────────────────────────────────────┤
│(2) 正規表現として、文字としての「\」を表すのは「\\」(※)                   │
│    ※検索文字だけでなく置換後文字についても該当するので注意                │
└──────────────────────────────────────┘
よって「\」数の「1→2」を行いたい場合「1×4→2×4」=「4→8」となる。

ただ、(1)の原則は時に忘れられがちなので注意が必要だ。

例えば次の二つは同じ意味になるから、たいていは(a)を使う。
┌──────────────────────────────────────┐
│(a) $置換後 = preg_replace('/\d/', '_', $置換前);                           │
├──────────────────────────────────────┤
│(b) $置換後 = preg_replace('/\\d/', '_', $置換前);                          │
└──────────────────────────────────────┘

さきほどの(1)を補足するならば、以下のような感じだろうか。
┌──────────────────────────────────────┐
│(1) PHPとして、「'」で囲われた文字中の「\\」は「\」になる                   │
│    (が、端数の「\」は「\」になる)                                          │
└──────────────────────────────────────┘
#「\」の後続に続く文字によって挙動が変わるという言い方もある

結局のところ「\」自身を使う場面でなければ(1)の原則はあまり意識されない。
日頃から原則に従って(b)を使うように徹底すれば、なんてことはないのだが
突然「\」を使う段になって、(1)のような話に出くわすと結構焦る。
(a)もすべて(b)に置換しなきゃダメなのかという恐怖感に襲われたりして。

なので、(b)を徹底しないまでも(徹底する必要もないのかもしれないが)、
この考え方はしっかり覚えておくべきだろう。
分類:PHP
PHP/全角トリム
2012年03月29日
┌──────────────────────────────────────┐
│trim($変数);                                                                │
└──────────────────────────────────────┘
PHPのトリム関数「trim()」は半角スペースしか除去してくれない。

全角スペースも除去したいのであれば、
以下のように正規表現をつかって除去してしまう方法がある。
┌──────────────────────────────────────┐
│preg_replace('/^[ △]+|[ △]+$/u', '', $変数);                              │
└──────────────────────────────────────┘
  ※△の部分は、全角スペースにしてください

正規表現の置換は処理が遅いらしいが、それほど気にならないかも。

あ、「trim()」はスペース以外にもタブとかも除去してくれるんだった。

ってことで、「trim()」の既定の除去対象文字を洗い出したところ以下の通り。
  「 」   …(0x20)半角スペース
  「\t」  …(0x09)タブ
  「\n」  …(0x0A)復帰(改行)
  「\r」  …(0x0D)改行
  「\0」  …(0x00)NULL
  「\x0B」…(0x0B)垂直タブ

なので、以下のようにすれば完璧!
┌──────────────────────────────────────┐
│preg_replace('/^[△ \t\n\r\0\x0B]+|[△ \t\n\r\0\x0B]+$/u', '', $変数);      │
└──────────────────────────────────────┘
分類:PHP
PHP/アップロードファイルサイズ
2012年03月26日
アップロードできるファイルサイズの最大サイズの設定は、「php.ini」で行う。
ただし、関係するパラメータがいくつかあり、以下のように設定せねば反映されない。
┌──────────────────────────────────────┐
│「memory_limit」≧「post_max_size」≧「upload_max_filesize」                │
└──────────────────────────────────────┘
分類:PHP
PHP/クッキー
2012年03月25日
クッキーの設定方法と参照方法は以下のような感じ。
┌──┬───────────────────────────────────┐
│設定│setcookie('クッキー変数名', 値);                                      │
├──┼───────────────────────────────────┤
│参照│$_COOKIE['クッキー変数名']                                            │
└──┴───────────────────────────────────┘

ただし、設定されるのは、そのスクリプトが終了した時なので、
以下のような場合、設定された値はechoされない。
┌──────────────────────────────────────┐
│$変数 = '値';                                                               │
│setcookie('クッキー変数名', $変数);                                         │
│echo $_COOKIE['クッキー変数名'];  // →''                                   │
└──────────────────────────────────────┘

なので、そのスクリプトでクッキー変数の値を使いたい場合は、
設定元を(分岐して)使う必要がある。
┌──────────────────────────────────────┐
│$変数 = '値';                                                               │
│setcookie('クッキー変数名', $変数);                                         │
│echo $変数;  // →'値'                                                      │
└──────────────────────────────────────┘

ちなみに、以下のように直接代入すると、
そのスクリプト内ではクッキー変数に値が代入されているが、
実際のクッキーの中身には値は入らないので、次画面以降では値はクリアされてしまう。
┌──────────────────────────────────────┐
│$_COOKIE['クッキー変数名'] = '値';                                          │
│echo $_COOKIE['クッキー変数名'];  // →'値'                                 │
└──────────────────────────────────────┘
一瞬設定が成功したかのような錯覚に襲われるので注意が必要。
分類:PHP、注意
PHP/Windowsの場合の分岐
2012年03月19日
Windowsの場合のみの特殊処理を行いたい場合の分岐処理は以下の通り。
┌──────────────────────────────────────┐
│if ((PHP_OS === 'WIN32') || (PHP_OS === 'WINNT')) {                         │
│  echo 'Windowsです';                                                       │
│} else {                                                                    │
│  echo 'Windowsではありません';                                             │
│}                                                                           │
└──────────────────────────────────────┘

例えば、以下のようなファイル権限変更なんてのは
(Linuxとかでは必要だが)Windowsでは不要だから分岐したりする。
┌──────────────────────────────────────┐
│chmod($ファイル, 0644);                                                     │
└──────────────────────────────────────┘
分類:PHP
PHP/php.iniをプログラムから扱う
2012年03月18日
「php.ini」の内容を知るためには、「ini_get()」という関数が使える。
#他には「ini_get_all()」ってのもある。
これで、「php.ini」を直接参照しなくても、プログラム表示で参照することができる。

一方、「ini_set()」では設定までできてしまう。
ただし、権限が絡んでくるので何もかも設定できるわけではない。
ま、設定できる場合は、「php.ini」をプログラム的に
書き換える(ようなこと)ができるわけだ。
分類:PHP
PHP/ファイル出力したい場合
2012年03月17日
「$変数」にひたすら文字列を格納したものを、ファイル出力するには、
「file_put_contents()」が簡単だ。

こんな感じ。
┌──────────────────────────────────────┐
│file_put_contents('C:/xxxx/xxxx.txt', $変数);                               │
└──────────────────────────────────────┘
とっても簡単。
分類:PHP
前へ 1 … 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 次へ