MW211 EXIT

devlog
PHP/データ量の多い折れ線グラフ描画
2011年10月19日
X軸一目盛に対してY軸の値が一つずつ並んでいるような配列があるとする。

例えばGDを使って以下のように折れ線グラフを描画したりできるような配列だ。
┌──────────────────────────────────────┐
│for ($x = 1; $x < 100; $x++) {                                              │
│  imageline(出力先, $x - 1, $y[x - 1], $x, $y[x], 色);                      │
│}                                                                           │
└──────────────────────────────────────┘

このデータが10倍になったけど描画する領域がそのままの場合。
つまり描画できる横幅よりもデータが多い場合に、
1/10に圧縮して、ローソク足グラフのように、縦幅のあるグラフを描画する方法。
┌──────────────────────────────────────┐
│for ($x = 0; $x < 1000; $x++) {                                             │
│  $y1 = min(array_slice($y, $x, 10));                                       │
│  $y2 = max(array_slice($y, $x, 10));                                       │
│  imageline(出力先, $x, $y1, $x, $y2, 色);                                  │
│}                                                                           │
└──────────────────────────────────────┘
上記のような感じで、「min()、max()、array_slice()」を駆使すればよい。
これで、最小値から最大値までの縦幅のもつ線が横にずらっと並んでいく。
まるで、横に押しつぶしたかのようにだ。
分類:PHP
PHP/ゼロパディング
2011年10月18日
「1」を「0001」とかのいわゆる書式付文字列にして出力する方法。
C言語の「sprintf()」関数を流用する。
以下のような感じ。
┌──────────────────────────────────────┐
│sprintf("%04d", 1)                                                          │
└──────────────────────────────────────┘
分類:PHP
PHP/画像ファイルのアップロード
2011年10月17日
まず、「$_FILES[識別名]['type']」で、ファイル種類を取得できるが、
信用できないらしい。
情報元がブラウザに依存し、ブラウザによっては情報を提供しないものがあり
必ずしも取得できるわけではない(らしい)。
とにかく、アテにしない方がいいみたい。

で、代替案…(つづく)
分類:PHP
PHP/画像のアップロード
2011年10月16日
入力方法としては、formの中に以下のinputタグを置き、submitさせる。
┌──────────────────────────────────────┐
│<input type="file" name="識別名"/>                                          │
└──────────────────────────────────────┘
※上記タグは以下のような入力欄となる。
┌──────────────────────────────────────┐
│┌────────┐┌───┐                                              │
││                ││参照..│                                              │
│└────────┘└───┘                                              │
└──────────────────────────────────────┘

アップロード処理は「move_uploaded_file()」で行う。
さきほどのタグによる入力欄に投入した情報は、「$_FILES[識別名]」に格納される。
┌──────────────────────────────────────┐
│if (move_uploaded_file($_FILES[識別名]['tmp_name'], 新ファイル名)) {        │
│  chmod(新ファイル名, 0644);  // Windowsの場合は不要                        │
│} else {                                                                    │
│  echo 'エラー:アップロードできませんでした';                              │
│}                                                                           │
└──────────────────────────────────────┘
Unix系の場合はファイルアクセス権限があるので「chmod()」で適宜変更してあげる。

「$_FILES[識別名]」の中身はこんな感じになっている
┌──────────────────────────────────────┐
│Array (                                                                     │
│  [name]     => xxxx.png       アップロード時のファイル名                   │
│  [type]     => image/x-png    アップロードしたファイルの種類               │
│  [tmp_name] => xxxx/xxxx.tmp  アップロード直後の一時ファイル名             │
│  [error]    => 0              エラーコード                                 │
│  [size]     => 1024           ファイルサイズ(バイト単位)                   │
│)                                                                           │
└──────────────────────────────────────┘

なお、事前にいろいろチェックして不正なデータをはじく必要がある。

まずはファイルを指定されたかのチェック。
┌──────────────────────────────────────┐
│if ((!isset($_FILES[識別名]))                                               │
│ || (!is_uploaded_file($_FILES[識別名]['tmp_name']))) {                     │
│  echo 'エラー:ファイルを指定してください';                                │
│}                                                                           │
└──────────────────────────────────────┘

ファイルサイズが大きすぎないかのチェック。
┌──────────────────────────────────────┐
│$filesize = filesize($_FILES[識別名]['tmp_name']);                          │
│if ($filesize > (1 * 1024 * 1024 * 1024)) {  // 1Gバイト                    │
│  echo 'エラー:ファイルのサイズが大きすぎます';                            │
│}                                                                           │
└──────────────────────────────────────┘

ファイルの種類が意図したものかのチェック(GDを使用)。
┌──────────────────────────────────────┐
│$getimagesize = getimagesize($_FILES[識別名]['tmp_name']);                  │
│switch ($getimagesize['mime']) {                                            │
│  case 'image/png':                                                         │
│  case 'image/jpeg':                                                        │
│    break;                                                                  │
│  default:                                                                  │
│    echo 'ファイルの種類が不正です';                                        │
│    break;                                                                  │
└──────────────────────────────────────┘
分類:PHP
PHP/16進ダンプを見る方法
2011年10月15日
「bin2hex()」を使う。

例えば、「あ」の16進ダンプを見たい場合には、以下のような感じ。
┌──────────────────────────────────────┐
│echo bin2hex('あ');                                                         │
└──────────────────────────────────────┘

UTF-8環境において、結果は以下のようになる。
┌──────────────────────────────────────┐
│e38182                                                                      │
└──────────────────────────────────────┘
分類:PHP
PHP/INIファイルの読み込み
2011年10月14日
INIファイルの読み込みには「parse_ini_file()」を使う。
┌──────────────────────────────────────┐
│foreach (parse_ini_file('INIファイル.ini', TRUE) as $key1 => $value1) {     │
│  if ($key1 == 'セクション') {                                              │
│    foreach ($value1 as $key2 => $value2) {                                 │
│      define($key2, $value2);                                               │
│    }                                                                       │
│  }                                                                         │
│}                                                                           │
└──────────────────────────────────────┘

「INIファイル.ini」の中身はこんな感じ。
┌──────────────────────────────────────┐
│[セクション]                                                                │
│キー1=値1                                                                   │
│キー2=値2                                                                   │
│:                                                                          │
└──────────────────────────────────────┘

これで、「define('キー1', 値1);」とかを一つ一つ定義したのと同じことになる。
分類:PHP
Windows/ショートカットで実行するEXEに引数を付ける
2011年10月13日
通常のショートカットを作成後、右クリックして「プロパティ」を開き
「ショートカット」タグの「リンク先」を編集する。

例えば「C:\xxxx.exe」となっていたら「C:\xxxx.exe -debug」みたいに編集すればOK。
分類:Windows
SQL/左外部結合の勘違い
2011年10月12日
なにも左外部結合に限った話ではなく、右外部結合も同じなのだが
右外部結合はあんまり使わないので、左外部結合で話をすすめる。

左外部結合を使うシチュエーションというのは、
キーと値が1対1の定数的な関係のテーブルを参照する場合が多い。

コード(キー)はわかっているので、それを文字(値)に変換したい場合だ。
例えば、「1→北海道」「2→青森県」みたいな感じ。

なのでたいていの場合、キーは主キー(もしくは一意キー)であり、
該当するレコードは1件(もしくは0件)だ。

これに慣れてしまうと、左外部結合は1件だけキーを値に変換してくれる
変換関数的なイメージをもってしまう。

もし、キーが同一なものが2件あった場合は?
(例えば「201→青森市」「201→盛岡市」みたいな場合)

先頭の1件だけをひっぱってきてくれる…なんて勘違いしてませんか?

いやいや、SQLの結合の基本は直積なので、左外部結合も直積なのです。
つまり参照元のレコードが2倍に増殖してしまう。

ま、あんまりそんなシチュエーションには出くわさないのだけど
たまにだから、驚いてしまう。
分類:SQL
PHP/REQUESTの内容確認
2011年10月10日
「$_REQUEST、$_GET、$_POST、$_COOKIE」など配列の内容をダンプするには
「print_r()」と「var_dump()」がある。
#なお「$_REQUEST」は「$_GET、$_POST、$_COOKIE」をまとめたもの

「print_r()」は連想配列として内容を出力するのに対して
さらに「var_dump()」はデータ型も出力する。

送信内容だけ知りたい場合は「print_r()」を使い、
より詳しい情報が知りたい場合には「var_dump()」を使えばよいようだ。

・「print_r()」の出力例
┌──────────────────────────────────────┐
│Array ( [キー] => 値 [キー] => 値 … )                                      │
└──────────────────────────────────────┘

・「var_dump()」の出力例
┌──────────────────────────────────────┐
│array(配列数) { ["キー"]=> データ型 "値" ["キー"]=> データ型 "値" … }      │
└──────────────────────────────────────┘

ちなみに、「echo」や「print」で出力させても、
配列なので以下のような結果しか得られない。
┌──────────────────────────────────────┐
│Array                                                                       │
└──────────────────────────────────────┘
分類:PHP
PHP/参照渡しのうっかりミス
2011年10月08日
PHPで関数の引数を参照渡しする場合には、以下のように関数側に「&」をつけます。
┌──────────────────────────────────────┐
│関数($引数);                                                                │
├──────────────────────────────────────┤
│function 関数(&$引数) {                                                     │
└──────────────────────────────────────┘

これをうっかり、関数呼び出し側に「&」をつけてしまうと…
┌──────────────────────────────────────┐
│関数(&$引数);                                                               │
├──────────────────────────────────────┤
│function 関数($引数) {                                                      │
└──────────────────────────────────────┘

以下のエラーが発生します
┌──────────────────────────────────────┐
│Deprecated: Call-time pass-by-reference has been deprecated in …           │
└──────────────────────────────────────┘

なお、参照渡しすれば、引数に指定した内容が関数内で
書き換えられてしまいます(書き換えることが可能です)。
分類:PHP
前へ 1 2 3 次へ