MW211 EXIT

devlog
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
HTML/formで送信されるもの
2011年10月04日
form内において、submit時に(キーと値が)送信される項目は以下の通り。
┌──────────────────────────────────────┐
│<input type="submit"   name="キー" value="値"/>                             │
├──────────────────────────────────────┤
│<input type="hidden"   name="キー" value="値"/>                             │
├──────────────────────────────────────┤
│<input type="text      name="キー" value="値"/>                             │
├──────────────────────────────────────┤
│<input type="password" name="キー" value="値"/>                             │
├──────────────────────────────────────┤
│<input type="checkbox" name="キー" value="値" checked="checked"/>         *1│
├──────────────────────────────────────┤
│<input type="radio     name="キー" value="値" checked="checked"/>         *1│
├──────────────────────────────────────┤
│<select name="キー">                                                      *1│
│  <option value="値" selected="selected"></option>                          │
│</select>                                                                   │
├──────────────────────────────────────┤
│<textarea name="キー">値</textarea>                                         │
├──────────────────────────────────────┤
│<input type="file" name="キー"/>                                          *2│
└──────────────────────────────────────┘
  *1:checkbox、radio、selectは選択されている項目のみ送信される。
  *2:値はアップロードされるファイルにあたり、
      「<form method="post" … enctype="multipart/form-data">」みたいに
      「enctype」の指定が必須です

以下はinputタグとはいえ、(キーと値が)送信されない。
┌──────────────────────────────────────┐
│<input type="button"  name="キー" value="値"/>                              │
├──────────────────────────────────────┤
│<input type="image"   name="キー" value="値" src="画像ファイル"/>           │
├──────────────────────────────────────┤
│<input type="reset"   name="キー"/>                                         │
└──────────────────────────────────────┘

ちなみに、以下のようにsubmitボタン的にしてみても、(キーと値は)送信されない。
┌──────────────────────────────────────┐
│<input type="button" name="キー" value="値" onclick="this.form.submit()"/>  │
└──────────────────────────────────────┘
checkboxとかが選択したもののみ送信されるのだから、
buttonも押されたもののみが送信されるのかと思ったのだが違うみたい。
(もしかして方法が違うのかも)
分類:JavaScript
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
前へ 1 … 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 次へ