MW211 EXIT

devlog
PHP/タイムスタンプ型(2)
2012年07月07日
┌──────────────────────────────────────┐
│echo strtotime('1 day', 0);                                                 │
└──────────────────────────────────────┘
ってやると、結果は「86400」。

┌──────────────────────────────────────┐
│echo date('Y/m/d H:i:s', strtotime('1 day', 0))                             │
└──────────────────────────────────────┘
ってやると、既定を日本時間にしてると「1970/01/02 09:00:00」とかとなって
なんだかわけがわからなくなるが、「1970/01/02 00:00:00」のことで
しっかりスタートから一日分加算されているのだ。

ということで、つ・ま・り…、あのn日後とかの日付計算ができるってわけ。

┌──────────────────────────────────────┐
│$timestamp = time();                                                        │
│echo date('Y/m/d H:i:s', $timestamp).'<br/>';                               │
│$timestamp += strtotime('1 day', 0);                                        │
│echo date('Y/m/d H:i:s', $timestamp).'<br/>';                               │
└──────────────────────────────────────┘
これで1日進められる。

┌──────────────────────────────────────┐
│$timestamp += (strtotime('+1 day') - time());                               │
└──────────────────────────────────────┘
やった!これみたいなまわりくどいことをしなくてもよくなった!

ただね、月に関しては相変わらずダメ。
┌──────────────────────────────────────┐
│echo strtotime('1 month', 0);                                               │
└──────────────────────────────────────┘
この結果が「2678400=31日×86400秒」でつまり、31日固定のようだ。
ま、1970年の01月は31日あるもんね。

ちなみに1ヶ月ずらしてみると…。
┌──────────────────────────────────────┐
│echo strtotime('1 month', 2678400) - strtotime('1 month', 0);               │
└──────────────────────────────────────┘
結果は「2419200=28日×86400秒」。やはり2月で28日(うるう年じゃないし)となる。
分類:PHP
PHP/タイムスタンプ型(1)
2012年07月06日
タイプスタンプ型は要は「1秒を1とする整数」みたいなもんだから、
「1」を加算すれば、1秒進められる。
┌──────────────────────────────────────┐
│$timestamp = time();                                                        │
│echo date('Y/m/d H:i:s', $timestamp).'<br/>';                               │
│$timestamp += 1;                                                            │
│echo date('Y/m/d H:i:s', $timestamp).'<br/>';                               │
└──────────────────────────────────────┘

「24時間×60分×60秒」(=86400)を足してあげれば、一日進めることができる。
┌──────────────────────────────────────┐
│$timestamp = time();                                                        │
│echo date('Y/m/d H:i:s', $timestamp).'<br/>';                               │
│$timestamp += 24 * 60 * 60;                                                 │
│echo date('Y/m/d H:i:s', $timestamp).'<br/>';                               │
└──────────────────────────────────────┘

日数を計算する上では毎日均等だからいいけど(※)、
月を計算する時には31日の月とか30日の月とかあるからややこしい。
これらを「mktime()」とかが楽チンに計算してくれるわけだ。

※「うるう秒」ってどうなってんだろう。。。
分類:PHP
PHP/【訂正】タイムスタンプ型の値を1ヶ月後にする方法
2012年07月05日
先日1ヶ月後の日時を求める簡単な方法で以下を紹介しましたが、
┌──────────────────────────────────────┐
│$timestamp += (strtotime('+1 month') - time());                             │
└──────────────────────────────────────┘
これだと、これを実行した現在月により加算される日数が
31日だったり、30日だったりして、うまくいかないことが判明しました。

9月に8月1日の変数で上記を実行すると、結果は8月31日になってしまうわけです。

やっぱり、mktime()使って地道にやるのが一番の近道かも。
┌──────────────────────────────────────┐
│$timestamp = mktime(date('H', $timestamp),      // 時                       │
│                    date('i', $timestamp),      // 分                       │
│                    date('s', $timestamp),      // 秒                       │
│                    date('m', $timestamp) + 1,  // 月                       │
│                    date('d', $timestamp),      // 日                       │
│                    date('Y', $timestamp));     // 年                       │
└──────────────────────────────────────┘
分類:PHP
PHP/ゼロサプレイスと8進数(3)
2012年07月04日
気になったのでいろいろvar_dump()してみた。

「var_dump(010)」          →「int(8)」
「var_dump('010')」        →「string(3) "010"」
「var_dump('010' + 0)」    →「int(10)」
「var_dump('010' + '010')」→「int(20)」

やっぱり、数値の「010」は8進数の8で、
文字列の「010」はあくまで文字列で数値に変換する時は
10進数に変換するようだ。
分類:PHP
PHP/ゼロサプレイスと8進数(2)
2012年07月03日
ところで、1月1日を「date('md')」にすれば「0101」だよね。
これに、「7」とか足したら繰り上がって「0110」とかになるのかな?

結果は、「108」。
う~ん、「date('md')」の「0101」はあくまで文字列で
(変数に代入してvar_dump()するとstring型だとわかる)、
数値型8進数ではないようだ
ちなみに、「010」を変数に代入してvar_dump()すると、int型だけど
すでに「8」って扱いになってしまっている。

結論としては、「intval('010')」の結果が「10」になるのと同じってことだね。

「var_dump('010' + '010');」→「int(20)」でした。
分類:PHP
PHP/ゼロサプレイスと8進数(1)
2012年07月02日
整理整頓好きのゼロサプレイスの敵といったら8進数だ。
3桁の中に2桁が混じっているので、ゼロサプレイスして「010」とかした日には
8進数の「10」と認識されて(10進数の)「8」とかにされてしまう。

ところで、時間関係の関数で「date('d')」のように、
ゼロサプレイスしてくれるものがある。
これって、「07」日とかで、「+1」日後にしたら、
「010」日つまり「8」日とかになってしまったりするのでは…
…あっ、7日の次は8日だね。
問題ないというオチでした。。。
そりゃ「+10」日後を「+010」日後にしたりすりゃ8日後になりますけどね。
分類:PHP
PHP/ファイルを読み込む方法
2012年07月01日
リトライ(RETRYとSLEEP)付きで読み込むには以下のような感じで。
┌──────────────────────────────────────┐
│$file = 'パスとファイル名';                                                 │
│$fp = NULL;                                                                 │
│if (file_exists($file)) {                                                   │
│  $success_flag = FALSE;                                                    │
│  for ($i = 0; $i < RETRY; $i++) {                                          │
│    $data = file_get_contents($file);                                       │
│    if ($data !== FALSE) {                                                  │
│      $success_flag = TRUE;                                                 │
│      break;                                                                │
│    }                                                                       │
│    usleep(SLEEP);  // マイクロ秒                                           │
│  }                                                                         │
│  if ($success_flag) {                                                      │
│    $fp = tmpfile();                                                        │
│    fwrite($fp, $data);                                                     │
│    rewind($fp);                                                            │
│  } else {                                                                  │
│    Log::notice('読み込み失敗:'.$file);                                     │
│  }                                                                         │
│} else {                                                                    │
│  Log::notice('みつかりません:'.$file);                                     │
│}                                                                           │
│//$fp  --ファイルポインタ                                                   │
└──────────────────────────────────────┘
分類:PHP
SQL/内訳数
2012年06月30日
┌──────────────────────────────────────┐
│a                                                                           │
│└b                                                                         │
│  └c                                                                       │
└──────────────────────────────────────┘
上記のような階層になっていて、a毎の内訳数をそれぞれで得たいとき。

以下のようにやってはダメ。
┌──────────────────────────────────────┐
│SELECT a.id,                                                                │
│       COUNT(b.*) AS count_b,                                               │
│       COUNT(c.*) AS count_c                                                │
│    FROM a                                                                  │
│        LEFT JOIN b ON b.a_id = a.id                                        │
│        LEFT JOIN c ON c.a_id = a.id                                        │
│    GROUP BY a.id                                                           │
└──────────────────────────────────────┘
「count_b」も「count_c」もおっきな数になる(a×b×cの組み合わせ総数になる)。

以下のようにすればよい。
┌──────────────────────────────────────┐
│SELECT a.id,                                                                │
│       COUNT(DISTINCT b.*) AS count_b,                                      │
│       COUNT(DISTINCT c.*) AS count_c                                       │
│    FROM a                                                                  │
│        LEFT JOIN b ON b.a_id = a.id                                        │
│        LEFT JOIN c ON c.a_id = a.id                                        │
│    GROUP BY a.id                                                           │
└──────────────────────────────────────┘
分類:SQL
PostgreSQL/書式の罠
2012年06月29日
数値を文字列に変更するには、以下のように「TO_CHAR()」を使う。
┌──────────────────────────────────────┐
│TO_CHAR(列, '0') AS 新名                                                    │
└──────────────────────────────────────┘
でもこうすると、「 1」みたいに先頭にスペースが付加されてしまう

これを回避するには
┌──────────────────────────────────────┐
│TO_CHAR(列, 'FM0') AS 列                                                    │
└──────────────────────────────────────┘
って「FM」をつけてあげればよい。
「1」になる。
分類:PostgreSQL
【未解決】formのenctypeの弊害
2012年06月28日
<form enctype="multipart/form-data">
って、アップロードとかの時に必要だけど
これって弊害はないのかな?
なければ常時記述しておけばいいと思うのだけど
記述量が多いっていう弊害以外になんかあるのだろうか?
分類:PHP、【未解決】
前へ 1 … 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 … 156 次へ