MW211 EXIT

devlog
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
HTML/変更できないチェックボックス
2011年10月07日
チェックボックスを表示するものの内容を変更させたくない場合がある。
たとえば、情報を呼び出して承認する画面とかでだ。

こんな場合は、readonly属性を使うらしい。
┌──────────────────────────────────────┐
│<input type="checkbox" checked="checked" readonly="readonly"                  
                                                    name="name" value="true"/>│
└──────────────────────────────────────┘

しかし、これだと画面操作としてチェックをつけたり、はずしたりすることは可能だ。
だが、ユーザインタフェースの観点から、チェックを変更できない方がいいと思う。
そこで、disabled属性をつける。
ただし、これだと値も無効になってしまうようなので、hidden属性も併用する。
┌──────────────────────────────────────┐
│<input type="checkbox" checked="checked" disabled="disabled"/>              │
│<input type="hidden" name="name" value="true"/>                             │
└──────────────────────────────────────┘

ただこれだと、チェックボックスが薄く表示されてしまう。
確かに変更は頑として受け付けない態度が見えるが、
チェックボックス自体が無効っぽい印象を受ける。(意見には個人差があります)
それが嫌な場合以下のようにonclickを無効にする方法がある。
┌──────────────────────────────────────┐
│<input type="checkbox" checked="checked" onclick="return false;"/>          │
│<input type="hidden" name="name" value="true"/>                             │
└──────────────────────────────────────┘
分類:HTML
PHP/定数二重定義回避
2011年10月06日
定数を既に定義しているのに二重に定義してしまうと以下の警告が発生する。
┌──────────────────────────────────────┐
│Notice: Constant 定数 already defined in …」                               │
└──────────────────────────────────────┘

これを回避する方法は以下の通り。
┌──────────────────────────────────────┐
│if (!defined('定数')) {                                                     │
│  define('定数', 値);                                                       │
│}                                                                           │
└──────────────────────────────────────┘
変数でいうところの「isset()」が定数では「defined()」になるというわけ。
分類:PHP
HTML/未回答のラジオボタン
2011年10月05日
┌───────────┐
│回答:●はい  ○いいえ│
└───────────┘
ラジオボタンといえばこんな感じだが、初期値を未回答としたい場合がある。
┌───────────┐
│回答:○はい  ○いいえ│
└───────────┘

これで選択されないままだと未回答としたいのだが、この場合submitされると
POST(GET)パラメータ上に、この項目自体($_POST['回答'])がなくなってしまう。

これを回避するには以下のようにダミーのラジオボタンを設置すればいい。
┌──────────────────────────────────────┐
│<input type="radio" name="回答" value="はい"/>                              │
│<input type="radio" name="回答" value="いいえ"/>                            │
│<input type="radio" name="回答" value="" checked="checked"                  │
│                                                    style="display:none;" />│
└──────────────────────────────────────┘
分類:HTML
前へ 1 … 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 次へ