MW211 EXIT

devlog
JavaSciprt/setAttribute()と=
2011年10月30日
例えば新規のhidden属性をJavaScript上で生成したい場合、以下の二つの方法がある。
┌──────────────────────────────────────┐
│var newInput = document.createElement("input");                             │
│newInput.setAttribute("type" , "hidden");                                   │
│newInput.setAttribute("name" , "abc");                                      │
│newInput.setAttribute("value", 123);                                        │
│inForm.appendChild(newInput);                                               │
└──────────────────────────────────────┘
┌──────────────────────────────────────┐
│var newInput = document.createElement('input');                             │
│newInput.type  = "hidden";                                                  │
│newInput.name  = "abc";                                                     │
│newInput.value = 123;                                                       │
│inForm.appendChild(newInput);                                               │
└──────────────────────────────────────┘
「setAttribute()」を使って値を代入する方法と、「=」を使って値を代入する方法だ。

違いがよくわからない…。
でも、後者の方がいいみたいだ。
分類:JavaScript
MVC第02回/「index.php」を窓口にする(補足)
2011年10月29日
配下に上位の「.htaccess」にとるRewriteの影響を受けないフォルダを作りたい場合。

なんのことはない、以下のような内容の「.htaccess」を置いて
打ち消してあげればよい。
┌──────────────────────────────────────┐
│RewriteEngine Off                                                           │
└──────────────────────────────────────┘

近い方の「.htaccess」が優先されるから。

例えば、ルートにRewriteの「.htaccess」を置くことになったけど
配下に一時的なworkフォルダを置きたい場合とかに、
そのフォルダを上記設定にして例外にしてあげる時とか有効だ。
分類:MVC
MVC第01回/「index.php」を窓口にする
2011年10月27日
「index.php」を窓口とするため、どのような(サブ配下の)アドレスが入力されても
ここに集まるように設定する。(以下「mvc」フォルダ直下での話とする)

「index.php」に以下のように記述して、実行結果をみるようにする。
┌──────────────────────────────────────┐
│<?php                                                                       │
│echo '「index.php」が実行されました。';                                     │
│echo '指定されたURIは「' . $_SERVER['REQUEST_URI'] . '」です。';            │
│?>                                                                          │
└──────────────────────────────────────┘

「index.php」の横(同一フォルダ)に「.htaccess」を置き、以下のように記述する。
┌──────────────────────────────────────┐
│# 設定                                                                      │
│RewriteEngine On                                                            │
│RewriteBase /mvc/                                                           │
│RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php                          │
└──────────────────────────────────────┘

これで準備OK。

まずは普通に「index.php」(「~/mvc/index.php」)を実行(※)した場合。
※ブラウザのURL入力欄に入力する
┌──────────────────────────────────────┐
│「index.php」が実行されました。指定されたURIは「/mvc/index.php」です。      │
└──────────────────────────────────────┘

続いて、サブフォルダ「~/mvc/abc/」を実行した場合。
┌──────────────────────────────────────┐
│「index.php」が実行されました。指定されたURIは「/mvc/abc/」です。           │
└──────────────────────────────────────┘
「index.php」が実行されて、
「$_SERVER['REQUEST_URI']」で指定されたURIが見られる。
これができれば、一元制御ができる。

ちなみに「~/mvc/abc/def.php」の場合も同じ。
┌──────────────────────────────────────┐
│「index.php」が実行されました。指定されたURIは「/mvc/abc/def.php」です。    │
└──────────────────────────────────────┘
とにかく「index.php」が窓口になってくれている。
分類:MVC
PHP/POSTパラメータは画面リロードでどうなってしまうのか?
2011年10月26日
submit後のGETパラメータはURIの一部になっているので、
「ctrl+r」とかで画面リロードしてもGETパラメータはそのままだ。

SESSIONはもちろんセッション領域に書き込まれるので
リロードしても問題なし(変化なし)。

となるとPOSTパラメータって、リロードするとどうなるのだろう?(消えたりする?)

ということで実験してみた。

万全を期して(?)、他のページへactionで遷移するようにして
そこでprint_r()でダンプを画面に表示してみた。
(遷移先のページにはPOSTする要素はないので雑音なし…という想定)

で、POST直後、hiddenやtextから入力した値がダンプ表示されるのをまず確認。
さで、ここから本番だ、リロード!
すると、見慣れた以下のダイアログが登場、すかさず「再試行」を実行。
┌────────────────────────────────────┐
│このページを再表示するには、以前送信した情報を再送信する必要があります。│
└────────────────────────────────────┘

さきほどのダンプはそのままだ。
つまり、POSTパラメータは消えません。

………あれ?そういや見慣れたダイアログに答えが書いてあったじゃん。
「以前送信した情報を再送信」ってね。
分類:PHP
PHP/NULLを文字列結合すると文字型になる
2011年10月25日
「gettype()」って便利な関数があって、変数のデータ型を調べられるのだが、
以下のような結果となった。
┌──────────────────────────────────────┐
│echo gettype(NULL);                                                 →NULL  │
│echo gettype(NULL . NULL);                                          →string│
└──────────────────────────────────────┘
つまりは、NULLを文字列結合すると文字型扱いとなるのだ。

ってことは、「is_null(NULL . NULL)」は偽となってしまうのである。

これは変数を介した時にハマりやすい罠だ。
「$c = $a . $b;」で「if (is_null($c)) {…」とかって処理を書いてしまうと
「$a」も「$b」もNULLの場合、当然真になる…なんて間違いを犯してしまうことになる。
分類:PHP、注意
PHP/配列でSQL抽出
2011年10月24日
配列$idに抽出したいIDを格納しておいて、
これを元にSELECT文を発行したい場合には、以下のような感じに
「implode()」で「,」区切り一直線に連結して「WHERE IN()」の中にぶち込むとよい。
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表                                                                 │
│    WHERE "ID" IN ({implode(',', $id)});                                    │
└──────────────────────────────────────┘
#これはあくまでイメージで、実際には「.」とかで文字列結合してください

すると以下のようになるわけだ。
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表                                                                 │
│    WHERE "ID" IN (1,2,3);                                                  │
└──────────────────────────────────────┘

しかし、配列$idに一件もIDがないと、以下のようになって当然エラー。
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表                                                                 │
│    WHERE "ID" IN ();                                                       │
└──────────────────────────────────────┘

ということで、これを回避するには、「WHERE IN()」の部分に
ありえない値を入れるのが手っ取り早いのではないだろうか。
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表                                                                 │
│    WHERE "ID" IN (0);                                                      │
└──────────────────────────────────────┘
※IDが「1」から始まり「0」がないことが前提

万全を期すならば「WHERE IN()」の部分を「WHERE FALSE」に
(条件分岐で)置換してあげるという手もある
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表                                                                 │
│    WHERE FALSE;                                                            │
└──────────────────────────────────────┘

間違っても、WHERE句毎削除してはいけない。
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表;                                                                │
└──────────────────────────────────────┘
全件ひっかかってしまう(該当ありになってしまう)からだ。
分類:SQL、PHP配列
PostgreSQL/順番の末尾にデータを追加したい場合
2011年10月23日
順番を示す項目について、データを追加する場合に
その時点で存在するデータの最大値に+1して追加したい場合、
以下のようにSELECTで最大値をひっぱてきて、それに+1してINSERTする。
┌──────────────────────────────────────┐
│INSERT INTO "表"                                                            │
│           ("名前","順番")                                                  │
│    SELECT '文字',                                                          │
│           MAX("順番") + 1                                                  │
│        FROM "表";                                                          │
└──────────────────────────────────────┘
しかし、これだと最初に追加する場合、エラーになってしまう(データが追加できない)。
つまり、順番を示す項目の最大値が該当なしでNULLとなってしまい、+1できないのだ。

そこで、ひと手間。
以下のようにNULLの場合に0に変換する「COALESCE()」をはさんであげるとよい。
#COALESCE()は引数(配列)中のNULLじゃない最初のデータを採用する関数
┌──────────────────────────────────────┐
│INSERT INTO "表"                                                            │
│           ("名前","順番")                                                  │
│    SELECT '文字',                                                          │
│           COALESCE(MAX("順番"), 0) + 1                                     │
│        FROM "表";                                                          │
└──────────────────────────────────────┘
ちなみに、SELECTは()で括れば個別に引用できるので、以下のようにもできる。
┌──────────────────────────────────────┐
│INSERT INTO "表"                                                            │
│           ("名前","順番")                                                  │
│    VALUES ('文字',                                                         │
│            COALESCE((SELECT MAX("順番")                                    │
│                          FROM "表";                                        │
│                     ), 0) + 1;                                             │
└──────────────────────────────────────┘
これだと複数のテーブルから様々な項目を参照できる。
分類:PostgreSQL
PHP/try&catchのサブ関数化
2011年10月22日
元々、こんな感じでtry&catchな処理を行っているとする。
┌──────────────────────────────────────┐
│public function メソッド() {                                                │
│  try {                                                                     │
│    $dbh = new PDO(…);                                                     │
│  } catch (PDOException $e){                                                │
│    echo $e->getMessage();                                                  │
│  }                                                                         │
│}                                                                           │
└──────────────────────────────────────┘
だけど、一部、サブ関数化(サブメソッド化)して他に持っていきたい場合がある。
例えばこんな感じ。
┌──────────────────────────────────────┐
│public function メソッド() {                                                │
│  try {                                                                     │
│    $dbh = $this->サブメソッド;                                             │
│  } catch (PDOException $e){                                                │
│    echo $e->getMessage();                                                  │
│  }                                                                         │
│}                                                                           │
├──────────────────────────────────────┤
│public function サブメソッド() {                                            │
│  $dbh = new PDO(…);                                                       │
│  return $dbh;                                                              │
│}                                                                           │
└──────────────────────────────────────┘
でもtryの中身を他に持っていくと、catchができなくなる。
メイン側で、サブ関数から戻ってきた直後にエラー判定して、
疑似的にエラーにして、catchに拾ってもらう?
いやいや、そんな面倒なことはしなくてよい。
「throw」してやればいいのだ。
┌──────────────────────────────────────┐
│public function メソッド() {                                                │
│  try {                                                                     │
│    $dbh = $this->サブメソッド;                                             │
│  } catch (PDOException $e){                                                │
│    echo $e->getMessage();                                                  │
│  }                                                                         │
│}                                                                           │
├──────────────────────────────────────┤
│public function サブメソッド() {                                            │
│  try {                                                                     │
│    $dbh = new PDO(…);                                                     │
│  } catch (PDOException $e){                                                │
│    throw $e;                                                               │
│  }                                                                         │
│  return $dbh;                                                              │
│}                                                                           │
└──────────────────────────────────────┘
エラー情報のたらいまわしですな。
分類:PHP
JavaScript/formの送信項目を送信しない
2011年10月21日
form内にhidden属性か何かで入力項目を設定しておくと、
submit時にその項目が飛び先に送られる。
飛び先側では、「$_POST['項目名']」とかでその値を参照できる。

しかし、事情により、formの中に項目は設定してしまったんだけど
submit時に除外したい場合の方法(を模索中)。
(submitしないで、link系でページ遷移すればいいじゃんというのはナシ)
┌──────────────────────────────────────┐
│<form method="post" action="飛び先.php">                                    │
│<input type="hidden" name="項目名" value="値"/>                             │
│<input type="submit" value="送信したふり"                                   │
  onclick="document.getElementsByName('項目名')[0].removeAttribute('name');"/>│
│</form>                                                                     │
└──────────────────────────────────────┘
これだと、飛び先に「$_POST['項目名']」は送られない。

submit時に「removeAttribute()」で自身の属性名自体を削除して
自身の存在を消している(ようにしている)。

もっといい方法がありそうだが、DOMを熟知していないので、今はここまで。
分類:JavaScript
JavaScript/submitボタンを明細毎につける
2011年10月20日
以下のような「選択」ボタンが明細毎に存在する画面があって
ボタンを押した飛び先に、明細のIDを渡したい場合がある。
┌─┬───────────────────────────────┌──┐┐
│ 1│明細1                                                        │選択││
├─┼───────────────────────────────├──┤┤
│ 2│明細2                                                        │選択││
├─┼───────────────────────────────├──┤┤
│ 3│明細3                                                        │選択││
└─┴───────────────────────────────└──┘┘

GETパラメータで渡すのは簡単で、以下のようにURIを編集してlinkしてあげればよい。
┌──────────────────────────────────────┐
│<input type="button" value="選択" onclick="window.open('飛び先.php?id=1',… │
│<input type="button" value="選択" onclick="window.open('飛び先.php?id=2',… │
│<input type="button" value="選択" onclick="window.open('飛び先.php?id=3',… │
└──────────────────────────────────────┘

しかし、POSTパラメータとして渡すとなるとsubmitボタンとなり、
以下のように識別子が入り込む余地がない(ように見える)。
┌──────────────────────────────────────┐
│<form method="post" action="飛び先.php">                                    │
│<input type="submit" value="選択"/>                                         │
│<input type="submit" value="選択"/>                                         │
│<input type="submit" value="選択"/>                                         │
│</form>                                                                     │
└──────────────────────────────────────┘

ベタな方法としては、以下のようにname属性を分けて、
飛び先で、$_POSTを全件ループして、キーが「submit_id_xxxx」のものを抽出し、
さらに「submit_id_」を除外すればidが取得(復元)できる。
┌──────────────────────────────────────┐
│<form method="post" action="飛び先.php">                                    │
│<input type="submit" name="submit_id_1" value="選択"/>                      │
│<input type="submit" name="submit_id_2" value="選択"/>                      │
│<input type="submit" name="submit_id_3" value="選択"/>                      │
│</form>                                                                     │
└──────────────────────────────────────┘

JavaScriptが使えるならもう少しスマートな方法がある。
┌──────────────────────────────────────┐
│<form method="post" action="飛び先.php">                                    │
│<input type="hidden" name="id"/>                                            │
│<input type="submit" value="選択" onclick="this.form.id.value='1';"/>       │
│<input type="submit" value="選択" onclick="this.form.id.value='2';"/>       │
│<input type="submit" value="選択" onclick="this.form.id.value='3';"/>       │
│</form>                                                                     │
└──────────────────────────────────────┘
これなら、「$_POST['id']」で一発で受け取ることができる。
分類:JavaScript
前へ 1 2 3 次へ