MW211 EXIT

devlog
PHP/name属性のないform部品
2012年02月16日
┌──────────────────────────────────────┐
│<input type="hidden" name="キー" value="値"/>                               │
└──────────────────────────────────────┘
formの中に上記のようなものを定義して(POSTで)submitすると、
飛び先に「$_POST['キー'] = '値'」みたいな情報(POSTパラメータ)が渡される。

以下のようにname属性を定義しないと何も渡されない。
┌──────────────────────────────────────┐
│<input type="hidden" value="値"/>                                           │
└──────────────────────────────────────┘

なので、JavaScriptでいろいろするために以下のようなhidden属性を定義すれば
POSTパラメータに影響を与えることはない。
┌──────────────────────────────────────┐
│<input type="hidden" id="キー" value="値"/>                                 │
└──────────────────────────────────────┘

┌──────────────────────────────────────┐
│<input type="submit" name="submit" value="決定"/>                           │
└──────────────────────────────────────┘
ちなみに、上記のようなsubmitボタンを定義して、押された場合
「$_POST['submit'] = '決定'」みたいな情報が渡されるが、
以下のようにname属性を定義しないと何も渡されない。
┌──────────────────────────────────────┐
│<input type="submit" value="決定"/>                                         │
└──────────────────────────────────────┘
分類:PHP
PHP/アクセス修飾子の組み合わせ(1)
2012年02月15日
継承した時のアクセス修飾子の組み合わせってどうなのかをまとめてみた。

┌──────────────────────────────────────┐
│class 親 {                                                                  │
│  public $a = '親';  ←★                                                   │
│}                                                                           │
├──────────────────────────────────────┤
│class 子 extends 親 {                                                       │
│  public $a = '子';  ←★                                                   │
│  public function method() {                                                │
│    return $this->a;                                                        │
│  }                                                                         │
│}                                                                           │
└──────────────────────────────────────┘
上記のようなクラスで、以下のようにechoした場合、
★の部分のアクセス修飾子の組み合わせで、どうなるのかを調べた。
┌──────────────────────────────────────┐
│$子 = new 子();                                                             │
│echo $子->method();                                                         │
└──────────────────────────────────────┘

結果は以下の通り(×はエラー)。
┌─────┬─────┬─────┬─────┬─────┐
│  親\子  │(定義なし)│ private  │protected │  public  │
├─────┼─────┼─────┼─────┼─────┤
│(定義なし)│    ×    │    子    │    子    │    子    │
├─────┼─────┼─────┼─────┼─────┤
│private   │    ×    │    子    │    子    │    子    │
├─────┼─────┼─────┼─────┼─────┤
│protected │    親    │    ×    │   (子)   │   (子)   │
├─────┼─────┼─────┼─────┼─────┤
│public    │    親    │    ×    │    ×    │   (子)   │
└─────┴─────┴─────┴─────┴─────┘
個人的に一方のみ定義するか、一方はprivateってのが美しい形なのではないかと思う。
よって、イレギュラーだと思うものを括弧書きにした。
これらはいわゆるオーバーライド(問答無用の上書)ってやつだ。
後はエラーになるケースを抑えておきたいところだ。
分類:PHP
PHP/SQLインジェクション対策における%と_
2012年02月14日
LIKE演算子とセットで使うワイルドカードの「%」と「_」。
「'」とかと同じものだから、所定の手続きをとれば上手い具合に
やってくれそうな錯覚におそわれる。

例えば、addslashes()では何もしてくれない。

検索文字中に「%」や「_」が含まれている場合には
自力で「\%」や「\_」にしなきゃならない

「WHERE name LIKE %サクラ\%オー%」みたいになればよい

ついでに「\」も「\\」にしなければならない。
分類:PHP、PDO
PHP/年月日チェック(日付チェック)
2012年01月22日
年月日の妥当性を一発でチェックする関数は「checkdate()」、こんな感じ。
┌──────────────────────────────────────┐
│if (checkdate($月, $日, $年)) {                                             │
│  echo '正しい年月日です';                                                  │
│} else {                                                                    │
│  echo '正しい年月日ではありません';                                        │
│}                                                                           │
└──────────────────────────────────────┘
引数が「月、日、年」の順であることに注意。

また、数値型を想定しているので文字型を引数に指定するとエラー(Warning)となる。
よって、得体のしれないものをチェックしたい場合は、
「intval()」で囲った方がいいかも。
┌──────────────────────────────────────┐
│if (checkdate(intval($?), intval($?), intval($?))) {                     │
│  echo '正しい年月日です';                                                  │
│} else {                                                                    │
│  echo '正しい年月日ではありません';                                        │
│}                                                                           │
└──────────────────────────────────────┘
分類:PHP
PHP/一定期間は不動のランダムな値を得る
2011年12月20日
相場(売値と買値)を疑似ってみる。

需給関係の計算とかいろいろやった風にみせて、実は乱数でしたってやつ。
「いろいろやった風」ってのは画面表示にギミックに譲るとして
こちらは乱数の計算に集中するが、
まずは単純に以下のような感じで「1~100」の整数がランダムで取得できる。
┌──────────────────────────────────────┐
│mt_rand(1, 100)                                                             │
└──────────────────────────────────────┘

でも、これだと「いくらで売ってくれる?」って聞いた時、
答えがコロコロ変わる感じだ。
相場っぽくない。

何度も何度も「いくらで売ってくれる?」って尋ねて
うっかり安い価格を相手が言ってきたら即買いみたいな感じになってしまう。

大きな時間軸でみれば実際の株価もそんな感じなのかもしれないが
実際はそんなにコロコロ価格は変わらない。
#失われたうん十年だから問題な訳で、失われた数分だったら
  安値で株を売らずに我慢して持っておくことだって可能だ

ま、それは置いといて、ランダムだけどしばらくの間は同じってのを実現したい。
単純に考えれば一定期間おきに乱数を再計算して更新すればできる。
でもそれだとその値を保持しておく領域が必要だ。

で、乱数ではなくハッシュ。
一日単位でランダムな値を割り当てたい場合はこれ。
┌──────────────────────────────────────┐
│intval(fmod(hexdec(md5(date('Ymd').入力値)), 範囲))                         │
└──────────────────────────────────────┘

例えば、IDの0~9に対して、1~100の範囲で適当な値を与えるとしたら
以下のような感じになる。(画面表示した例)
┌──────────────────────────────────────┐
│for ($id = 0; $id < 10; $id++) {                                            │
│  $result = intval(fmod(hexdec(md5(date('Ymd').$id)), 100)) + 1;            │
│  echo 'id'.$id.'='. $result.'/';                                          │
│}                                                                           │
└──────────────────────────────────────┘
これだと同日中ならIDごとに同じ値となる。

乱数も昔のやつ(?)だと乱数の種を設定しないと、規則性のある乱数、
つまりハッシュっぽくなっていたのだが、
今の乱数は乱数の種の部分もやってくれるので即使える、まさに乱数だ。
その昔N88-BASICをやってた時これがわからずはまってしまった。
ちなみに乱数の種は秒とかころころ変わるものを設定することになるのだけど…、
あれ?なんか似たようなことをしているな…。

最後に注意、これだけだと乱高下必死なので相場としてはもう少し工夫が必要。
分類:PHP
PHP/文字コード自動変換
2011年12月17日
文字コードを変換する関数は「mb_convert_encoding()」。
以下のような感じ「UTF-8←SJIS-win」の方向に変換される。
┌──────────────────────────────────────┐
│$変換後 = mb_convert_encoding($変換前, 'UTF-8', 'SJIS-win');                │
└──────────────────────────────────────┘

これに便利なオプション「auto」ってのがあって、
こんな風に指定してあげると
SJISだろうがEUCだろうがもちろん自身UTF-8も含めてすべてUTF-8に変換してくれる。
#自身UTF-8の場合は変換しないでくれるってことだね、
  とにかくどうあえれ結果はすべてUTF-8になるのだ、便利
┌──────────────────────────────────────┐
│$変換後 = mb_convert_encoding($変換前, 'UTF-8', 'auto');                    │
└──────────────────────────────────────┘

でも、注意しなければならない。
事前に以下の設定を行っておく必要があるのだ。
┌──────────────────────────────────────┐
│mb_language('Japanese');                                                    │
└──────────────────────────────────────┘
これからやる処理は日本語だって宣言しなきゃならないんだね。
これに気がつかないと「auto」オプションなんて使えねぇって勘違いをすることになる。

ちなみに、SJISとUTF-8が混じった文字列みたいなのを変換しようとすると
どっちかが優先されて他方が文字化けしてしまうので注意が必要だ。
分類:PHP
PHP/ファイル一覧
2011年12月06日
あるディレクトリ配下のファイル一覧を取得したい場合には
以下のような感じで取得できる。
┌──────────────────────────────────────┐
│$dir = 'C:\…/data/';                                                       │
│$return = array();                                                          │
│if (is_dir($dir)) {                                                         │
│  if ($handle = opendir($dir)) {                                            │
│    while (false !== ($file = readdir($handle))) {                          │
│      if (!is_dir($dir . $file)) {                                          │
│        $return[] = $file;                                                  │
│      }                                                                     │
│    }                                                                       │
│  }                                                                         │
│  closedir($handle);                                                        │
│}                                                                           │
│print_r($return);                                                           │
└──────────────────────────────────────┘
あくまで、ファイルパスがわかっている場合のお話。
分類:PHP
PHP/Index_of画面の活用
2011年12月05日
「http://…/data/」とかってブラウザから指定した時に
その配下に「index.htm」とかがないと、ファイル一覧が表示される場合がある。
「Index of ~」って画面だ。

これは情報漏洩の元凶みたいなもんで、忌み嫌われている。
ネットで検索しても、表示させない方法ばかりがとりざたされている。

表示させない方法は、「.htaccess」に以下を記述して、そのフォルダに置けばよい。
┌──────────────────────────────────────┐
│Options -Indexes                                                            │
└──────────────────────────────────────┘
たぶん、「htpd.conf」とかに設定した方がいいのだろうけど、まずはここまで。

では、これを表示させたい場合は?(あまのじゃく!)
┌──────────────────────────────────────┐
│Options +Indexes                                                            │
└──────────────────────────────────────┘
記述をこう書き換えればよい(「-」が「+」になっただけ)。

さて、表示させてどうするの?
ま、PHPでhtmファイル一覧でも取得してみるか。(対象が「http://…/data/」の場合)
┌──────────────────────────────────────┐
│$dir = 'http://…/data/';                                                   │
│$return = array();                                                          │
│$source_list = @file($dir);                                                 │
│if ($source_list) {                                                         │
│  foreach ($source_list as $value) {                                        │
│    if (preg_match('/\.htm\"/', $value)) {                                  │
│      $file = trim(preg_replace('/^.*href\=\"|\.htm\".*$/', '', $value))    │
│            . '.htm';                                                       │
│      $return[] = $file;                                                    │
│    }                                                                       │
│  }                                                                         │
│}                                                                           │
│print_r($return);                                                           │
└──────────────────────────────────────┘
ま、他にバリエーションはありそうだけど…。

「Index of ~」画面の仕様も明確じゃないし、
そもそもセキュリティ的に?なので、お遊び程度に。
分類:PHP
PHP/他のPHPの表示結果を取り込む
2011年12月04日
「a,b,c」とかいう文字列を結果として返却するCGI(xxxx.cgi)があったとして
これを呼び出して、配列に格納するのは以下でできる。
┌──────────────────────────────────────┐
│$配列 = explode(',', file_get_contents('xxxx.cgi'));                        │
└──────────────────────────────────────┘
file_get_contents()ってかなり便利だ。

これを疑似的にテストしようとして、
CGIの代わりに以下のような疑似PHP(dummy.php)を作成してみた。
┌──────────────────────────────────────┐
│<?php                                                                       │
│echo <<<___HTML___                                                          │
│a,b,c                                                                       │
│                                                                            │
│___HTML___;                                                                 │
│──────────────────────────────────────│
│$配列 = explode(',', file_get_contents('dummy.php'));                       │
└──────────────────────────────────────┘
ところが、file_get_contents()で参照した時点で、「a,b,c」以外に
「<?php」やら「echo」やら「___HTML___」やら
ソース全部をひっぱてきてしまうため、頓挫してしまった。

ソースの中身じゃなく表示結果だけを取得できないものか。
ということでその方法。
┌──────────────────────────────────────┐
│ob_start();                                                                 │
│include('dummy.php');                                                       │
│$out = ob_get_contents();                                                   │
│ob_end_clean();                                                             │
│$配列 = explode(',', $out);                                                 │
└──────────────────────────────────────┘
他PHPの処理結果を取得するのって、こんな感じなんだね。
分類:PHP
MySQL/文字コード設定UTF-8
2011年12月01日
MySQLで、HTML側もDB側も「UTF-8」に統一されている環境なのに、
insertやupdateした時に、日本語文字が「????」とかに文字化けすることがある。

文字コードの設定が不完全だかららしい。
その設定方法にはいくつかある。
┌──────────────────────────────────────┐
│(1) mysql_set_charset('utf8');                                              │
├──────────────────────────────────────┤
│(2) $dbh->exec('SET CHARACTER SET utf8;');                                  │
├──────────────────────────────────────┤
│(3) $dbh->exec('SET NAMES utf8;');                                          │
└──────────────────────────────────────┘

最新でもっとも安全な策は(1)。
最新の環境であれば、(1)で解決。

…だが、PDOとは相性がよろしくないみたい(設定方法の問題か?)。
それと、PHPやMySQLのバージョンが古いと使えない。

ということで、(2)。(ま、これでいいんじゃないかな(本当か?))

(3)も結構有名だが、セキュリティ的にちょっと問題があるらしい。
いってみれば全体的に足並みを揃えての変更(設定)ではないため、
一部でボロが出てしまう恐れがある(つまり脆弱性)みたいなのだ。
但し、Shift-JIS系での話なのでUTF-8では気にしなくてもいいかも。
#ただ、UTF-8にしようとしてるけど環境がShift-JIS系とかいう場合に
  問題なのだろうか、よくわからない

もう少し勉強します。。。

なぜ、この問題にぶち当たったかというと、データベースの設定で
照合順序を「utf8_general_ci」にせず、デフォルトにしていたため、
DB側が「UTF-8」に統一されていなかった(らしい)というオチだったのだが。

このように前提条件が狂っている中だと、(2)を設定すると更新が文字化けして
逆に設定しないと参照が文字化けするという進退窮まることになってしまう。
基本は大事だね。
分類:PHP、MySQL
前へ 1 … 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 次へ