MW211 EXIT

devlog
PHP/配列の件数を指定しての抽出
2011年12月08日
┌──────────────────────────────────────┐
│$array = array(1, 2, 3, 4, 5);                                              │
└──────────────────────────────────────┘
上記みたいな配列があって、先頭から 3件だけ抽出したい場合、どうするか?

┌──────────────────────────────────────┐
│$result = array();                                                          │
│for ($i = 0; $ < 3; $i++) {                                                 │
│  $result[$i] = $array[$i];                                                 │
│}                                                                           │
└──────────────────────────────────────┘
こんな感じ?

いやいや一発でできるんです。
┌──────────────────────────────────────┐
│$result = array_slice($array, 0, 3);                                        │
└──────────────────────────────────────┘

すごいぞ、「array_slice()」!

ちなみに、元の配列に3件以上なくても(エラーなく)動作してくれます
#この場合、当然ながら元の配列と結果は同じになりますね
やっぱりすごいぞ、「array_slice()」!
分類:PHP配列
JSON/配列
2011年12月07日
JSONで配列を扱う時は
┌──────────────────────────────────────┐
│{"a[0]":"a","a[1]":"b","a[2]":"c"}                                          │
└──────────────────────────────────────┘
…なんかじゃなくて(でもいいけど)、

こう!
┌──────────────────────────────────────┐
│{"a":["a","b","c"]}                                                         │
└──────────────────────────────────────┘
分類:JSON
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
PHP/PEARのArchive_Zip(2)
2011年12月03日
実行ファイル(例えば「index.php」など)から、
配下をすべてディレクトリごとまとめてくれるので、便利といえば便利なのだが、
途中に余計なパスが混じってると余計だ
┌──────────────────────────────────────┐
│├index.php                                                                 │
│└余計なディレクトリ                                                        │
│  └余計なディレクトリ                                                      │
│    └(ここから)圧縮したいディレクトリ                                      │
│      └サブディレクトリ                                                    │
│        └data.dat                                                          │
└──────────────────────────────────────┘
圧縮したいディレクトリ以降のみを圧縮したい場合、どうすればいいのか?

答えは簡単。
そこへ移動してから、create()メソッドを実行してあげればよい。

移動する方法とは?
チェンジディレクトリ(chdir)だ。
いわゆるコンソールで打つコマンドだが、PHPでも関数として実行することができる。

こんな感じ。
┌──────────────────────────────────────┐
│chdir(圧縮したいディレクトリ);                                              │
└──────────────────────────────────────┘
分類:PEAR
PHP/PEARのArchive_Zip(1)
2011年12月02日
現時点ではベータ版なので仕様がよくわからない。

判明していること。
create()メソッドで指定できるのは、ローカルファイルのみ。
URI指定じゃ無理みたい。
×$newArchiveZip->create('http://…/ooo1.htm');

なので、URI指定の場合はローカルにもってくる必要がある。
┌──────────────────────────────────────┐
│if (!file_exists($ディレクトリパス)) {                                      │
│  mkdir($ディレクトリパス);                                                 │
│}                                                                           │
└──────────────────────────────────────┘
まずは、こんな感じでディレクトリを再現してあげて
┌──────────────────────────────────────┐
│if ($handle = fopen($コピー元, 'rb')) {                                     │
│  $content = stream_get_contents($handle);                                  │
│  fclose($handle);                                                          │
│  file_put_contents($コピー先, $content);                                   │
│}                                                                           │
└──────────────────────────────────────┘
こんな感じで、コピーする(この時、コピー元がURIになる)。
その結果を、create()で圧縮してあげればよい。
分類:PEAR
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 2 3 次へ