MW211 EXIT

devlog
CSS/リンクの点線囲みを表示させない
2011年11月14日
Firefoxとかで、リンクみたいな文字を選択すると、点線の囲いが出る時がある。
その回避方法。
┌──────────────────────────────────────┐
│a {                                                                         │
│  outline:none;                                                             │
│}                                                                           │
└──────────────────────────────────────┘
「outline」属性を「none」にしてあげればよい。
分類:CSS
PHP/多次元配列の値を収集
2011年11月13日
多次元配列の値のみをまとめて一次元配列として取り出す方法はないものか?
最終的には「implode()」とかで、CSV形式で一列にしたりしたい。
ってことで、そんな関数がないかと探しているが見当たらないので
関数を作ってしまうことにした。

ふたパターンつくってしまった(結果は同じ)。
┌──────────────────────────────────────┐
│function getValueInArray($array) {                                          │
│  static $return = array();                                                 │
│  foreach($array as $value) {                                               │
│    if (is_array($value)) {                                                 │
│      getValueInArray($value);                                              │
│    } else {                                                                │
│      $return[] = $value;                                                   │
│    }                                                                       │
│  }                                                                         │
│  return $return;                                                           │
│}                                                                           │
├──────────────────────────────────────┤
│function getValueInArray($array) {                                          │
│  $return = array();                                                        │
│  foreach($array as $value) {                                               │
│    if (is_array($value)) {                                                 │
│      $return = array_merge($return, getValueInArray($value));              │
│    } else {                                                                │
│      $return[] = $value;                                                   │
│    }                                                                       │
│  }                                                                         │
│  return $return;                                                           │
│}                                                                           │
└──────────────────────────────────────┘

例えば以下のような多次元配列を投入すると、
┌──────────────────────────────────────┐
│$array = array('a',                                                         │
│               'B' => array('ba', 'bb'),                                    │
│               'C' => array('CA' => array('caa')));                         │
├──────────────────────────────────────┤
│├a        ←これと                                                         │
│├B                                                                         │
││├ba     ←これと                                                         │
││└bb     ←これと                                                         │
│└C                                                                         │
│  └CA                                                                      │
│    └caa  ←これを採取する                                                 │
└──────────────────────────────────────┘
以下のような結果となる(print_r()で出力)
┌──────────────────────────────────────┐
│Array ( [0] => a [1] => ba [2] => bb [3] => caa )                           │
└──────────────────────────────────────┘
分類:PHP配列
HTML/POSTのサブミットボタンいろいろ
2011年11月12日
基本的なサブミットボタンはこれ。
┌──────────────────────────────────────┐
│<input type="submit" name="command" value="実行"/>                          │
└──────────────────────────────────────┘

ボタンにJavaScriptを付加して、サブミットボタンにするには、
以下の二通りの方法がある。
┌──────────────────────────────────────┐
│<input type="button" onclick="this.form.submit();" value="実行">            │
├──────────────────────────────────────┤
│<input type="button" onclick="submit(this.form);"  value="実行">            │
└──────────────────────────────────────┘
ただし、ボタンなのでvalue値はPOSTパラメータとして渡せない。
つまり、上記二つに「name="command"」を追記しても、
「POST['command']」では値を拾えない。
最初のサブミットのやつだと「POST['command']」は「実行」という値になる。

では、ボタンではなくリンク文字にサブミットを埋め込む場合は?
┌──────────────────────────────────────┐
│<a href="javascript:void(0);" onclick="submit(this.form);">実行</a>         │
└──────────────────────────────────────┘
「javascript:void(0);」によって、リンクを無効にして(飛ばないようにして)、
onclickでさきほどのようにサブミットしてしまう。

ちなみに以下も同じかと思いきや、ダメだった。
┌──────────────────────────────────────┐
│<a href="javascript:void(0);" onclick="this.form.submit();">実行</a>        │
└──────────────────────────────────────┘

------------------------------------
【追記】
「onclick="submit(this.form);"」でも
場所によってうまくいかないことがあった。
formにidをつけて「$('id').submit();」みたいな方が確実なようだ。
※「function $(inId) {return document.getElementById(inId);}」付きでね
------------------------------------

なにもリンクにこだわらなくてもいい、文字をリンクに偽装してしまえばいいのでは
…というのであればこれ(あ、文字色がどうにもならないか)。
┌──────────────────────────────────────┐
│<span style="cursor:pointer;text-decoration:underline;"                       
                                      onclick="submit(this.form);">実行</span>│
└──────────────────────────────────────┘

他にもいろいろあって、他の回でもリンクでサブミットはとりあげているから
そのうちまとめられるといいですね。
分類:HTML
PDO/件数を取得する方法
2011年11月11日
「SELECT 列 FROM 表 WHERE 条件;」みたいな元SQL文があるとして、
その件数を取得したい場合がある。

ま、単純にはこんな感じで囲ってやれば、
たいていの場合は対応できる(元SQLにDISTINCTとかが絡んでてもOK)のだけど…。
┌──────────────────────────────────────┐
│SELECT COUNT(*) FROM (SELECT 列 FROM 表 WHERE 条件) AS dummy;               │
└──────────────────────────────────────┘

でも、単に件数を取得するだけのためにいちいちSQL文を作成したくはない。
そんなのPDOでなんとかしてくれないの、ってことで代替案。
#例によって「$sth->execute();」の直後の処理って想定でお話を進めます

Countというキーワードを元に「columnCount()」ってメソッドにぶち当たったのだが
これは単にSELECT文に指定した列数を取得するっていう、畑違いのメソッドだった。

さて、気を取り直して大本命の「rowCount()」ってメソッド。
┌──────────────────────────────────────┐
│$count = $sth->rowCount();                                                  │
└──────────────────────────────────────┘
でもこれって、「INSERT、UPDATE、DELETE」といった更新系処理の実行件数であり
「SELECT」の件数としてはあいまいな感じの扱いなのだ。
#どうやら、読み込み完了前に件数を算定する恐れがあるっぽいみたい

ま、信頼性が低いのであれば致し方ない。
ってことで、結論としては「fetchAll()」メソッドで全件取得しちゃって、
「count()」関数で数えちゃえばってことになりました。
┌──────────────────────────────────────┐
│$count = count($sth->fetchAll());                                           │
└──────────────────────────────────────┘
これでもコーディング量的には前出の「rowCount()」メソッドと比べても
そんなに大差ないのでいいのではないでしょうか
分類:PDO
JavaScript/POSTの飛び先を変える方法
2011年11月10日
┌──────────────────────────────────────┐
│<form method="post" action="aaaa.php">                                      │
│:                                                                          │
│<input type="submit" value="実行"/>                                         │
│</form>                                                                     │
└──────────────────────────────────────┘
上記のような配置で、submitボタン(実行ボタン)を押すと、「aaaa.php」に飛ぶが
「bbbb.php」に飛ばしたい場合の方法。

以下のようにonclickイベントで、「action」の内容を書き換えてあげればよい。
┌──────────────────────────────────────┐
│<form method="post" action="aaaa.php">                                      │
│:                                                                          │
│<input type="submit" value="実行" onclick="this.form.action='bbbb.php';"/>  │
│</form>                                                                     │
└──────────────────────────────────────┘
分類:JavaScript
PDO/fetch()とfetchAll()
2011年11月09日
PDOには、「fetch()」という一件だけ読み込むメソッドと
「fetchAll()」という一気に全件読み込むメソッドがある。

で、以下はほぼ等価(「foreach()」の「$row」を「&$row」にすれば尚更)
┌──────────────────────────────────────┐
│while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {                              │
│  :                                                                        │
│}                                                                           │
├──────────────────────────────────────┤
│foreach ($sth->fetchAll(PDO::FETCH_ASSOC) as $row) {                        │
│  :                                                                        │
│}                                                                           │
└──────────────────────────────────────┘
#前提条件とかはあんまり気にせず「$sth->execute();」とかを
  実行した直後だと思ってください。

該当全件を読み込んで処理をするというのは結構多発する処理なので
どっちにするか悩むところかも。

ただ後者だと、以下みたいに関数化(メソッド化)して分離できるからいいかも。
┌──────────────────────────────────────┐
│function get() {                                                            │
│  :                                                                        │
│  return $sth->fetchAll(PDO::FETCH_ASSOC);                                  │
│}                                                                           │
│- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - │
│foreach ($this->get() as $row) {                                            │
│  :                                                                        │
│}                                                                           │
└──────────────────────────────────────┘

たいていは「fetch()」的な関数(「mysql_fetch_assoc()」とか)から
入る(経験する)ので、「fetchAll()」は上級編なのかも。
分類:PDO
MVC第03回/「index.php」を窓口にする(補足2)
2011年11月08日
「index.php」の横(同一フォルダ)に「.htaccess」を置き、以下のように記述する。
┌──────────────────────────────────────┐
│# 設定                                                                      │
│RewriteEngine On                                                            │
│RewriteBase /mvc/                                                           │
│RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php                          │
└──────────────────────────────────────┘
ってことで、とりえあず動くのだが、Apacheの「htpd.conf」に
設定してしまった方が処理速度が速いので、
本番的な場合はこちらに移行した方がよさそう。
#いろいろ微調整できるから、テスト段階では「.htaccess」のままでもいいかも

で、「htpd.conf」の中身だが、以下のような感じでディレクトリ毎に
セクションが分かれているので、
影響を及ぼしたいディレクトリに以下のように記述(転記)する。
┌──────────────────────────────────────┐
│<Directory "C:/xampp/htdocs">                                               │
│:                                                                          │
│<IfModule mod_rewrite.c>                                                    │
│  RewriteEngine On                                                          │
│  RewriteBase /mvc/                                                         │
│  RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php                        │
│</IfModule>                                                                 │
│</Directory>                                                                │
└──────────────────────────────────────┘
上記は「C:\xampp\htdocs」にあった「.htaccess」と同等の動きになるよう
「htpd.conf」を設定する場合(これが有効になればこの「.htaccess」は不要)。

あ、ちなみに「htpd.conf」で以下が有効になっているので、確認してみるといいかも。
┌──────────────────────────────────────┐
│LoadModule rewrite_module modules/mod_rewrite.so                            │
└──────────────────────────────────────┘
分類:MVC
jQuery/チェックボックスの必ずチェックチェック
2011年11月07日
チェックボックスのある画面で、どれかにチェックしてくれないと困るので
JavaScriptでエラーメッセージを出してガードする場面がある。

┌──────────────────────────────────────┐
│var check_flag = false;                                                     │
│var inputs = document.getElementsByTagName("input");                        │
│for (var i = 0; i < inputs.length; i++) {                                   │
│  if (inputs.item(i).type == "checkbox") {                                  │
│    if (inputs.item(i).getAttribute("checked")) {                           │
│      check_flag = true;                                                    │
│    }                                                                       │
│  }                                                                         │
│}                                                                           │
│if (!check_flag) {                                                          │
│  alert("チェックしてください。");                                          │
│  return false;                                                             │
│}                                                                           │
└──────────────────────────────────────┘
ま、こんな感じで、inputタグのcheckboxを全検索して、
フラグを使って判別したりする。

これがjQueryだとかなり簡単

inputタグ全部をチェックする場合(一応、例として)。
┌──────────────────────────────────────┐
│if (!$("input:checked")[0]) {                                               │
│  alert("チェックしてください。");                                          │
│  return false;                                                             │
│}                                                                           │
└──────────────────────────────────────┘

inputタグのcheckboxを全部チェックする場合(最初の例と同等、これでも十分か)。
┌──────────────────────────────────────┐
│if (!$("input:checked[type=checkbox]")[0]) {                                │
│  alert("チェックしてください。");                                          │
│  return false;                                                             │
│}                                                                           │
└──────────────────────────────────────┘

さらにname属性が「xxxx~」に絞り込む場合。
#「xxxx1、xxxx2…」「xxxx_1、xxxx_2…」、「xxxx[]」とかが該当
┌──────────────────────────────────────┐
│if (!$("input:checked[type=checkbox][name^=xxxx]")[0]) {                    │
│  alert("チェックしてください。");                                          │
│  return false;                                                             │
│}                                                                           │
└──────────────────────────────────────┘
これでも、かなり簡素にできる。
分類:jQuery
PHP/正規表現の置換で文字列を除去(抽出)
2011年11月06日
「preg_replace()」は正規表現が使える便利な置換関数だ。

例えば「ABCDE」という文字列があったとして、
「B」より前を除去したい場合は「^.*B」を
「」(空文字)に置換するように指定すればよい。
┌──────────────────────────────────────┐
│preg_replace('/^.*B/', '', 'ABCDE');                               →「CDE」│
└──────────────────────────────────────┘
「^」は先頭を表し、「.*」は一種のワイルドカードみたいなものだ

一方、「D」より後を除去したい場合は、「D.*$」を「」に置換だ
┌──────────────────────────────────────┐
│preg_replace('/D.*$/', '', 'ABCDE');                               →「ABC」│
└──────────────────────────────────────┘
「$」は末尾を表す

では、この二つを同時に行い「C」のみを抽出したい場合には?
一時変数を使って順番に二段階で処理すればできそうだが(実際にできるが)
なんと、一発でできてしまう。
┌──────────────────────────────────────┐
│preg_replace('/^.*B|D.*$/', '', 'ABCDE');                            →「C」│
└──────────────────────────────────────┘
「|」は「or」みたいなもんで、前出の二つのいずれかに該当したものを
一気に処理してくれる。
もちろん「|」の前後を入れ替え可能、結果は同じだ。
┌──────────────────────────────────────┐
│preg_replace('/D.*$|^.*B/', '', 'ABCDE');                            →「C」│
└──────────────────────────────────────┘

では、互いの領域まで侵犯する入れ子状態の置換はどうなるのだろうか?
「A~D」と「B~E」を同時に置換で除去してしまう。
ってことで「BCD」が両方でかぶってる場合だ。

こんな感じの結果だった。
┌──────────────────────────────────────┐
│preg_replace('/^.*D|B.*$/', '', 'ABCDE');                            →「E」│
└──────────────────────────────────────┘
「ABCDE」─(「A~D」を置換」)→「E」─(「B」がみつからず置換できず)→「E」
…ってな感じだろうか。

それじゃ、「|」の前後を逆にしたらどうだろう?
「ABCDE」─(「B~E」を置換」)→「A」─(「D」がみつからず置換できず)→「A」
…かと思いきや
┌──────────────────────────────────────┐
│preg_replace('/B.*$|^.*D/', '', 'ABCDE');                            →「E」│
└──────────────────────────────────────┘
で、変わらず。

文字列の先頭から処理していくのが原則みたいだ。
分類:PHP
JavaScript/JavaScipt中のタグ
2011年11月05日
┌──────────────────────────────────────┐
│var a = "<span>" + "a" + "</span>";                                         │
└──────────────────────────────────────┘
JavaScript中で文字結合でタグなんかを作る場合には、
終了タグの「</」を「<\/」にしてあげた方がいいみたい。
┌──────────────────────────────────────┐
│var a = "<span>" + "a" + "<\/span>";                                        │
└──────────────────────────────────────┘

ちなみに「<input~/>」みたいな自己完結型の場合、「\」はいらないみたい。
「</」ってのがよろしくないのかも。

「Firefox Html Validator」に注意されてしまった(エラーではない)。
分類:JavaScript
前へ 1 … 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 次へ