MW211 EXIT

devlog
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
jQuery/Ajax入門(2)前回の訂正
2011年11月30日
自分で自分の一部をリロードする場合、以下のようにと書いたが認識が間違っていた。
┌──────────────────────────────────────┐
│$("#ajax").load("index.php #ajax");                                         │
└──────────────────────────────────────┘

入力側(右の#ajax)はそれ自身を示すが、出力側(左の#ajax)はそれ自身にではなく
それの中身つまり内側に出力するように指示する命令なのだ

つまり、リロードを繰り返していくと、以下のようなイメージとなり
入れ子が重なりブラウザがおかしくなってしまう。
┌──────────────────────────────────────┐
│<div id="ajax">                                                             │
│  <div id="ajax">                                                           │
│    <div id="ajax">                                                         │
│      <div id="ajax">                                                       │
│        :                                                                  │
└──────────────────────────────────────┘

なので、以下のように初期状態で段差をつけて定義してあげて…。
┌──────────────────────────────────────┐
│<div id="ajax_in">                                                          │
│  <div id="ajax_out">                                                       │
└──────────────────────────────────────┘
以下のように、出力側(左)が入力側(右)より一段上になるようしてあげねばならない。
┌──────────────────────────────────────┐
│$("#ajax_in").load("index.php #ajax_out");                                  │
└──────────────────────────────────────┘
こうすれば「#ajax_in」の一段下、つまり「#ajax_out」に
「#ajax_out」が上書されるので想定通りとなる。
分類:jQuery
PDO/SQL発行のまとめ
2011年11月29日
まずは、以下のような感じでオブジェクトを作る。
#「…」の部分は各環境で違うので省略
┌──────────────────────────────────────┐
│$dbh = new PDO(…);                                                         │
└──────────────────────────────────────┘

その後、ざっと以下のような方法がある
┌──────────────────────────────────────┐
│$dbh->exec('DELETE FROM 表;');                                              │
├──────────────────────────────────────┤
│foreach ($dbh->query('SELECT * FROM 表') as $row) {                         │
├──────────────────────────────────────┤
│$sth = $newPDO->prepare('DELETE FROM 表 WHERE ID = :id;');                  │
│$sth->bindValue(':id', $id, PDO::PARAM_INT);                                │
│$sth->execute();                                                            │
├──────────────────────────────────────┤
│$sth = $newPDO->prepare('SELECT * FROM 表 WHERE ID = :id;');                │
│$sth->bindValue(':id', $id, PDO::PARAM_INT);                                │
│$sth->execute();                                                            │
│foreach ($sth->fetchAll(PDO::FETCH_ASSOC) as $row) {                        │
└──────────────────────────────────────┘

まず、exec()メソッド、単純に更新系SQLを実行したい場合にはこちらで。
戻り値は処理結果(何件作用したか)だけなので、SELECT文の参照系SQLには使えない。

参照系SQLの場合は、query()メソッドで。
戻り値に行毎に配列でデータが返ってくる。

SQL文中に変数を使いたい場合は、prepare()メソッドを使う。
これでオブジェクトを作り、bindValue()で変数を指定し、execute()で実行。
fetchAll()を使うとデータを取得できる。(fetch()なら一件ずつ取得)
更新系SQLなら、execute()までで終わり。

ややこしいので、PDOを使うならprepare()メソッドを使う方式に統一して、
気が向いたらショートカット的にexec()やquery()を使うって感じだろうか。
#query()はexec()も兼ねているっぽいけど…
分類:PDO
jQuery/チェックしましたね
2011年11月28日
┌──────────────────────────────────────┐
│if (!$("input:checked[type=checkbox][name^=xxxx]")[0]) {                    │
│  alert("チェックしてください。");                                          │
│  return false;                                                             │
│}                                                                           │
└──────────────────────────────────────┘
先日、チェックしていない時に警告ダイアログを出す方法に触れたが、
逆にチェックした場合に警告を出したいケースもある。
「チェックしたけど、本当に更新していいの?」みたいな確認。

やり方は簡単、先の条件式を反転させるだけ。
┌──────────────────────────────────────┐
│if ($("input:checked[type=checkbox][name^=xxxx]")[0]) {                     │
│  alert("チェックしてください。");                                          │
│  return false;                                                             │
│}                                                                           │
└──────────────────────────────────────┘
分類:jQuery
前へ 1 … 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 … 156 次へ