MW211 EXIT

devlog
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
PHP/改行の表示
2011年09月08日
「<br/>タグ」を「改行コード(\n)」に変換するには、「br2nl()」を使う
例)$data = nl2br($html);

「改行コード(\n)」を「<br/>タグ」に変換するには、「nl2br()」を使う
例)$html = nl2br($data);

(DB内などの)データとしては「改行コード(\n)」で管理し、
表示する時には「<br/>タグ」で出力するという感じ。

但し、「<input>タグ」で入力される場合、
ユーザは「<br/>タグ」なんか入力しない(改行で入力する)ので
使用頻度的には以下なのかもしれない。
  「br2nl()」<「nl2br()」

個人的には、「nl2br()」で変換なんかせずに、「<pre></pre>タグ」で囲っちゃって
そのまま出力してしまった方が使い勝手はいいような気がする。
若干、単細胞な感じだけどね。
ちなみに当blogも見た目重視で「<pre></pre>タグ」を採用しています。
なってたって固定フォントの字下げが生命線ですから。
分類:PHP
$_GET、$_POST、$_SESSIONの違い
2011年09月05日
$_GET
・aタグのhref属性などのリンク先URLに簡単に埋め込める(→テキストリンク系)
・多数の明細中にある各リンクなどに向いている
・抽出や検索など公開性の高い処理に向いている
・ブラウザのURL入力欄から簡単に入力できる
・情報が表に出やすい
・情報を引き継ぎにくい(ただしパラメータ付きURLをそのまま引き継げる)
・ブックマークにパラメータも含めて記録させることができる

$_POST
・form内でsubmitする必要がある(→ボタン系)
・一画面中に一つの(決定)ボタンなどに向いている
・更新など公開性の低い処理に向いている
・情報を非常に引き継ぎにくい(hidden属性で伝言していかねばならない)

$_SESSION
・PHPプログラム内でしか設定できない
・ログイン情報など気密性の高い処理に向いている
・情報を引き継ぎやすい
・その反面、情報を適宜クリアする必要(ゴミの掃除)が発生する

          ┌─────┬─────┬─────┐
          │  $_GET   │  $_POST  │$_SESSION │
          ├─────┼─────┼─────┤
入力容易性│    ○    │    △    │    △    │
          ├─────┼─────┼─────┤
隠蔽性    │    △    │    ○    │    ○    │
          ├─────┼─────┼─────┤
情報持続性│    △    │    ×    │    ○    │
          └─────┴─────┴─────┘
分類:PHP
PHP/GETにGET
2011年09月04日
┌──────────────────────────────────────┐
│<form method="post" action="a.php?b=c">                      →「a.php?b=c」│
└──────────────────────────────────────┘
formのaction属性で指定するURLにGETパラメータを付加した場合
POSTの場合は、GETパラメータが引き継がれる。

しかし、GETの場合はクリアされてしまう。
┌──────────────────────────────────────┐
│<form method="get" action="a.php?b=c">                           →「a.php」│
└──────────────────────────────────────┘
(雪だるま式に)GET転がしができるかと思ったら、大間違い。
POSTではうまくいってもGETに変えたらハマってしまうってことがあるので要注意。

回避策としては「<input type="hidden"~」に切り換える。
┌──────────────────────────────────────┐
│<form method="get" action="a.php">                           →「a.php?b=c」│
│<input type="hidden" name="b" value="c">                                    │
└──────────────────────────────────────┘
分類:PHP、注意
PHP/submitボタンのタイトルをGETパラメータから除外する方法
2011年09月03日
formでGET送信(<form method="get")する場合、
以下のようにsubmitボタンのタイトルが長かったりすると、
┌──────────────────────────────────────┐
│<input type="submit" name="submit" value="とっても長いボタン名"/>           │
└──────────────────────────────────────┘

URL上に以下のように、その長いタイトルがエンコードされ埋め込まれてしまい
邪魔だと思ったことはありませんか?
┌──────────────────────────────────────┐
│….php?…&submit=%E3%81%A8%E3%81%A3%E3%81%A6%E3%82%82%E9%95%B7%E3%81%84%E3…│
└──────────────────────────────────────┘

解決方法はname属性をなくすことです。
┌──────────────────────────────────────┐
│<input type="submit" value="とっても長いボタン名"/>                         │
└──────────────────────────────────────┘

URL上から「submit=」自体がなくなります。

っていうか、元々が(他からコピペしてきたため)
name属性の意味を考えてない単純ミスなんですけどね。
分類:PHP
前へ 1 … 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 次へ