MW211 EXIT

devlog
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
PHP/一覧中のチェックボックスの処理
2011年09月20日
┌──────────────────────────────────────┐
│┌─┬────┬──────────────┬──────┬───┬────│
││№│  氏名  │            住所            │  電話番号  │ 区分 │        │
│├─┼────┼──────────────┼──────┼───┼────│
││ 1│武田信玄│                            │            │■源氏│        │
│├─┼────┼──────────────┼──────┼───┼────│
││ 2│上杉謙信│                            │            │□源氏│        │
│├─┼────┼──────────────┼──────┼───┼────│
││ 3│徳川家康│                            │            │■源氏│        │
│├─┼────┼──────────────┼──────┼───┼────│
└──────────────────────────────────────┘
上記のような、(複数)明細を入力する画面で、同一列の項目を入力させるには
以下のようにname属性に「[]」をつけて配列にしてあげればいい。
┌──────────────────────────────────┐
│<input type="text" name="氏名[]" value="値"/>                       │←1行目
│<input type="text" name="氏名[]" value="値"/>                       │←2行目
│<input type="text" name="氏名[]" value="値"/>                       │←3行目
└──────────────────────────────────┘
するとPOST後、以下のように配列で値を取得できる。
・$_POST['氏名'][0]  →1行目に入力された氏名  →武田信玄
・$_POST['氏名'][1]  →2行目に入力された氏名  →上杉謙信
・$_POST['氏名'][2]  →3行目に入力された氏名  →徳川家康

しかしこれがチェックボックスの場合は厄介なことになる。
┌──────────────────────────────────────┐
│<input type="checkbox" name="区分[]" value="TRUE" checked="checked"/>       │
│<input type="checkbox" name="区分[]" value="TRUE"/>                         │
│<input type="checkbox" name="区分[]" value="TRUE" checked="checked"/>       │
└──────────────────────────────────────┘
上記のように、テキスト同様定義してあげて、
チェックの有無により以下のように配列で取得できればよいのだが…
・$_POST['区分'][0]  →1行目はチェックあり  →TRUE
・$_POST['区分'][1]  →2行目はチェックなし  →FALSE
・$_POST['区分'][2]  →3行目はチェックあり  →TRUE

実際には以下のようにチェックなしは、その存在自体が無視されてしまう。
・$_POST['区分'][0]  →1行目はチェックあり  →TRUE
・$_POST['区分'][1]  →3行目はチェックあり  →TRUE
(結果的には「■□■」と入力したものが「■■-」と認識される感じだ)

これでは不都合なので、以下のように対処する。

まず、各行にキーとなるものを定義しておき、チェックボックスのvalue属性に設定。
┌──────────────────────────────────────┐
│<input type="checkbox" name="区分[]" value="キー1" checked="checked"/>      │
│<input type="checkbox" name="区分[]" value="キー2"/>                        │
│<input type="checkbox" name="区分[]" value="キー3" checked="checked"/>      │
└──────────────────────────────────────┘
ちなみにキーは以下のような感じで設定しておく。
┌──────────────────────────────────────┐
│<input type="hidden" name="キー[]" value="キー1"/>                          │
│<input type="hidden" name="キー[]" value="キー2"/>                          │
│<input type="hidden" name="キー[]" value="キー3"/>                          │
└──────────────────────────────────────┘

これらは、行ごとに一組になる感じだ。
┌──────────────────────────────────────┐
│<input type="hidden" name="キー[]" value="キー1"/>                          │
│<input type="checkbox" name="区分[]" value="キー1" checked="checked"/>      │
└──────────────────────────────────────┘

それで、以下のように判定すれば、
チェックありの場合はTRUE、チェックなしの場合はFALSEに判定することができる。
・in_array($_POST['キー'][0], $_POST['区分'])
・in_array($_POST['キー'][1], $_POST['区分'])
・in_array($_POST['キー'][2], $_POST['区分'])

注意:全ての明細がチェックボックスをはずしている場合には、
      「$_POST['区分']」自体が存在しないことになり
      「in_array()」が成立せずエラーとなってしまうので
      条件分岐などの考慮が必要です
      以下みたいな感じでしょうか
┌──────────────────────────────────────┐
│if (isset($_POST['区分'])) {                                                │
│  return in_array($_POST['キー'][0], $_POST['区分']);                       │
│} else {                                                                    │
│  return FALSE;                                                             │
│}                                                                           │
└──────────────────────────────────────┘

#わかりやすいように変数名を日本語にしていますが、実際は英語です
#POST送信を例にしています、GETでも同じです
分類:PHP
PHP/複数のsubmitボタン
2011年09月19日
同一画面(フォーム)内に複数のsubmitボタンがある場合、
それらのどれが押されたか区別する必要があるが、その方法。

(1) ボタンに表示される文字で識別する方法
┌──────────────────────────────────────┐
│【HTML側の設定】                                                            │
│<input type="submit" name="run" value="実行1"/>                            │
│<input type="submit" name="run" value="実行2"/>                            │
├──────────────────────────────────────┤
│【PHP側の処理】                                                             │
│if (isset($_POST['run'])) {                                                 │
│  switch ($_POST['run']) {                                                  │
│    case '実行1':                                                          │
│      処理1                                                                │
│      break;                                                                │
│    case '実行2':                                                          │
│      処理2                                                                │
│      break;                                                                │
│  }                                                                         │
│}                                                                           │
└──────────────────────────────────────┘

(2) ボタンのname属性で識別する方法
┌──────────────────────────────────────┐
│【HTML側の設定】                                                            │
│<input type="submit" name="run1" value="実行"/>                             │
│<input type="submit" name="run2" value="実行"/>                             │
├──────────────────────────────────────┤
│【PHP側の処理】                                                             │
│switch (TRUE) {                                                             │
│  case (isset($_POST['run1']))                                              │
│    処理1                                                                  │
│    break;                                                                  │
│  case (isset($_POST['run2']))                                              │
│    処理2                                                                  │
│    break;                                                                  │
│}                                                                           │
└──────────────────────────────────────┘
分類:PHP
PHP/submitボタンのname属性
2011年09月18日
うっかり、フォームの送信ボタンを
┌──────────────────────────────────────┐
│<input type="submit" name="submit" value="送信"/>                           │
└──────────────────────────────────────┘
とかってやって、name属性を「submit」に揃えたりすると、
JavaScriptのsubmitコマンドが動かなくなる(以下のようなやつ)。
┌──────────────────────────────────────┐
│this.form.submit();                                                         │
└──────────────────────────────────────┘
競合してしまうようだ(submitメソッドが上書される)。

JavaScriptでsubmitしなければ、問題ないので気にならないことが多いが
はじめから「submit」以外のname属性にするように心がけておいた方がよいだろう。
分類:PHP、注意
PHP/CSVファイルダウンロード
2011年09月17日
基本的に以下のような感じ。
┌──────────────────────────────────────┐
│header('Content-Disposition: attachment; filename="ファイル名.csv"');       │
│header('Content-Type: text/csv;');                                          │
│print "データ1A,データ1B\n";                                                │
│print "データ2A,データ2B\n";                                                │
│exit();                                                                     │
└──────────────────────────────────────┘
「implode(',', $配列)」なんかも有効活用できるね。
分類:PHP
PHP/プルダウンメニューによる実行
2011年09月16日
プルダウンメニューを選択し、実行ボタンで確定する処理の場合、
以下のような実装になる。
┌──────────────────────────────────────┐
│<form>                                                                      │
│<select name="■■">                                                        │
│</select>                                                                   │
│<input type="submit" name="run" value="確定"/>                              │
│</form>                                                                     │
└──────────────────────────────────────┘
しかし、ボタンを省略して、プルダウンのみで確定させてい場合は、
<select>タグに以下のような「onchange属性」をつけて
JavaScriptで「submit()」させればいい。
┌──────────────────────────────────────┐
│<select name="■■" onchange="submit(this.form)">                           │
└──────────────────────────────────────┘
ただしこの場合、POSTパラメータ(もしくはGETパラメータ)に
$_POST['run'](='確定')が渡らない
→ボタンが複数あったりして、こいつで識別したい場合には厄介だ。

これを実現するには、ひと手間(ふた手間?)加える必要が出てくる。
(1) submitを直接実行するのではなく、一旦ユーザ関数を経由するようにする
┌──────────────────────────────────────┐
│<select name="■■" onchange="submit2(this.form)">                          │
└──────────────────────────────────────┘
(2) (JavaScriptの)ユーザ関数で、hidden属性を生成した上でsubmitする
┌──────────────────────────────────────┐
│<script type="text/javascript">                                             │
│  function submit2(inForm){                                                 │
│    // hidden属性の生成                                                     │
│    var e = document.createElement('input');                                │
│    e.type  = "hidden";                                                     │
│    e.name  = "run";                                                        │
│    e.value = "確定";                                                       │
│    inForm.appendChild(e);                                                  │
│    // submit                                                               │
│    inForm.submit();                                                        │
│  }                                                                         │
│</script>                                                                   │
└──────────────────────────────────────┘
本格的にJavaScript記述が必要なので、ちょっとめんどくさいかも。
分類:PHP
PostgreSQL/boolean型
2011年09月15日
PostreSQLにおいてboolean型の項目の値は、
普通にSQL文を実行したり、pg_query()を使ったりすると
「t」(true)か「f」(false)という一文字で取得される。
なので、取得された結果を使う場合、
「if(■ == 't')」とかって判定をしなきゃならない。

でも、PDO(->execute()したり、->fetch()したり)だと
「1」(true)か「」(false)という形で取得される。
つまりこれだと「if(■)」でOKだ。

追記:PHPで「echo TRUE;」ってすると「1」が表示される。
上記の「1」は「=== TRUE」では真だが「=== 1」や「=== '1'」では偽だ。
まぎれもなく、「TRUE」のようだ。

ちなみに、SQL文中のSELECTのWHERE句、INSERTのVALUES句、UPDATEのSET句とかでは
「true」「false」をそのまま使える。
あくまで参照結果の話。

追記:以下でも入力可能みたい
・trueなら「TRUE」「't'」「'true'」「'y'」「'yes'」「'1'」
・falseなら「FALSE」「'f'」「'false'」「'n'」「'no'」「'0'」
分類:PHP、PostgreSQL
PostgreSQL/insertしたレコードのIDを取得
2011年09月14日
insertしたデータのシーケンシャルIDを取得する方法は以下の通り。
#selectと取得するとその間に割り込みの危険性があるからこの方法で
┌──────────────────────────────────────┐
│$pg_db = pg_connect('host=ホスト名 port=ポート名 dbname=DB名                │
│ user=ユーザ名 password=パスワード);                                        │
├──────────────────────────────────────┤
│$sql = "INSERT INTO 表 (列) VALUES ('値') RETURNING id";                    │
│$pg_result = pg_query($pg_db, $sql);                                        │
│$row = pg_fetch_array($pg_result);                                          │
└──────────────────────────────────────┘
ここで「$row['id']」を参照する。

INSERT文のSQL発行と同時にSELECT文のSQLを発行して取得したようなイメージ。
「RETURNING」句を使うのがミソ。
SELECT句と同じような指定になる。

一方、PDOの場合は以下のような感じになる。
┌──────────────────────────────────────┐
│$dbh = new PDO(DSN名, ユーザ名, パスワード);                                │
├──────────────────────────────────────┤
│$sql = "INSERT INTO 表 (列) VALUES ('値')";                                 │
│$sth = $dbh->prepare($sql);                                                 │
│$sth->execute();                                                            │
└──────────────────────────────────────┘
ここで「$dbh->lastInsertId('シーケンスオブジェクト名')」を参照する。

シーケンスオブジェクト名とは、「表名_id_seq」みたいなやつ。
AutoNumber的な項目をCREATE文実行すると自動で作成されるみたい。
MySQLの場合はこれが不要(「()」でいい)らしい。
分類:PostgreSQL
秀丸エディタ/正規表現における最長一致の原則
2011年09月13日
例えば、「『」と「』」で囲われた文字列を検索(置換)する場合の正規表現は
以下の通り。
┌───┐
│『.*』│
└───┘
「.*」は最強のワイルドカードだ。

でも、これだと「『あ』『い』『う』」を「『ん』」に置換したい場合、
「『ん』『ん』『ん』」としたくとも「『ん』」だけになってしまう。
秀丸エディタの正規表現は、最長一致の原則に則っているからだ。
(「あ』『い』『う」が「.*」とみなされてしまうのだ)

「『ん』『ん』『ん』」としたい場合には、以下を使う。
┌─────┐
│『[^』]+』│
└─────┘
「[^■]」は「否定」なわけだが(「+」は繰り返し)、
見方を変えれば「否定」(の繰り返し)って準ワイルドカードでもあるのだ。
分類:秀丸エディタ
MicrosoftExcelの小ネタ(3)
2011年09月12日
「ScrollLock」キーをONにすると、
「↑、↓」で画面全体を一行上下させることができる。
この時、選択しているセルの位置は上下に移動しない。
(隣のセルを選択せずに選択中のセルをそのまま選択し続ける)

「PageUp、PageDown」だとひと固まり(一頁)分画面が上下するが、
「ScrollLock」+「↑、↓」の場合は、一行ずつ上下する。

ちなみに、「Ctrl」+「ScrollLock」+「↑、↓」で
「PageUp、PageDown」と同等の動きになる。

「ScrollLock」キーは基本的に「OFF」にしておいた方がいいみたい。
分類:Excel
前へ 1 … 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 次へ