MW211 EXIT

devlog
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
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
PHP/定数二重定義回避
2011年10月06日
定数を既に定義しているのに二重に定義してしまうと以下の警告が発生する。
┌──────────────────────────────────────┐
│Notice: Constant 定数 already defined in …」                               │
└──────────────────────────────────────┘

これを回避する方法は以下の通り。
┌──────────────────────────────────────┐
│if (!defined('定数')) {                                                     │
│  define('定数', 値);                                                       │
│}                                                                           │
└──────────────────────────────────────┘
変数でいうところの「isset()」が定数では「defined()」になるというわけ。
分類:PHP
PHP/ZIPファイルに圧縮してダウンロード
2011年10月03日
「PEAR」の「Archive_Zip」が実装されていることが前提条件。
┌──────────────────────────────────────┐
│C:\xampp\php>pear list                                                      │
│INSTALLED PACKAGES, CHANNEL PEAR.PHP.NET:                                   │
│=========================================                                   │
│Archive_Zip                0.1.1       beta                                 │
└──────────────────────────────────────┘
「Archive_Zip」クラスの「create()」メソッドを使えば、
ZIPファイルが圧縮生成される。
┌──────────────────────────────────────┐
│// ZIPファイル生成                                                          │
│require_once('Archive/Zip.php');                                            │
│$zip_file = 'xxxx/xxxx.zip';                                                │
│$newArchiveZip = new Archive_Zip($zip_file);                                │
│$newArchiveZip->create('oooo/ooo1.txt','oooo/ooo2.txt',…);                 │
│// ダウンロード                                                             │
│header('Content-Disposition: attachment; filename="ダウンロードファイル名"'); 
│header('Content-Type: application/octet-stream');                           │
│header('Content-Length: '.filesize($zip_file));                             │
│readfile($zip_file);                                                        │
└──────────────────────────────────────┘
生成されるZIPファイルは「xxxx/xxxx.zip」、
圧縮されるファイルたちは「oooo/ooo1.txt」など(複数指定できる)
なお、「Content-Length:」はダウンロード時の進捗表示のために
全体サイズを指定している。
分類:PHP、PEAR
PHP/一意な一時ファイル名
2011年10月02日
一時的なワークファイルとかに名称をつけたい場合、
以下のような方法があります。
┌───────┬──────────────────────────────┐
│date('YmdHis')│秒単位(「u」をつければマイクロ秒もありだが…)               │
├───────┼──────────────────────────────┤
│time()        │UNIX秒単位                                                  │
└───────┴──────────────────────────────┘

っておい、以下のような便利な関数があるじゃないか。
┌──────────────────────────────────────┐
│tempnam(パス,接頭辞)                                                        │
└──────────────────────────────────────┘
ちなみに接頭辞はWindowsの場合、3文字(3バイト)までらしい。
分類:PHP
PHP/宣言していない変数の扱い
2011年09月21日
PHPの変数は宣言不要で、値を格納した時点で宣言して初期化されたような状態になる。
逆にいえば、値を格納していない変数は宣言されていないものとみなされる。

┌──────────────────────────────────────┐
│$変数 = '値';                                                               │
│echo $変数                                                                  │
└──────────────────────────────────────┘
上記はOKでも、下記はNGである(でもエラーではない)。
┌──────────────────────────────────────┐
│echo $変数                                                                  │
└──────────────────────────────────────┘

この場合、「Notice: Undefined variable: 変数 in 行番号」のような警告が出る。

「@」を使えば、警告は抑止されるので以下のようにすれば、事実上支障はなくなる。
┌──────────────────────────────────────┐
│echo @$変数                                                                 │
└──────────────────────────────────────┘

では以下のように代入した場合はどうなるのか?
┌──────────────────────────────────────┐
│$代入先 = @$変数;                                                           │
└──────────────────────────────────────┘

この場合は「NULL」が格納されているものとみなされ、代入先にも「NULL」が入る。

つまり以下のような処理の場合、条件に該当しなければ、
代入先に「NULL」が入ってくれるということになる。
┌──────────────────────────────────────┐
│if (条件) {                                                                 │
│  $変数 = '値';                                                             │
│}                                                                           │
│$代入先 = @$変数;                                                           │
└──────────────────────────────────────┘

なお、「is_null()」と「isset()」が正反対の関係、
つまり「is_null() = !isset()」の関係にあるのは
これを元に考えれば辻褄が合う。

つまり、setされていない変数はNULL扱いなのだ。
分類:PHP
前へ 1 … 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 次へ