IT's AGENT
PDO & XML
Bottom

結果セットをXMLとして利用する。

PHPからMySQLを利用する方法はいくつか紹介されている。細かいことは理解していないが、PDOを使うのが良いらしい。

PDOで得た結果セットを利用するのに、FETCH_CLASSでフェッチしてクラスとして取得するのが最も効率的とのこと。
確かにそんな感じだが、少し難しくてうまく行かなかった。

XMLをPHP内で作成し、そこに結果セットを落とし込む方法が紹介されていたので実行してみた。
おそらくクラスの場合もそんな感じだと思う。

PDOでSQLを実行すると、PDOStatementのインスタンスという形で結果が得られる。
これはTraversableなのでフェッチせずに、そのままforeachで回せるらしい。なのでそのままXMLに落とし込む。
(素のままなので速そう、と勝手に思っている。)

XMLで結果セットを保持できれば、都度都度にSQLを発行してしまう場合や、結果に対してさらに絞り込みをしたい場合などで、SQLの発行回数を抑えることができる。

例えば、カレンダー表示のページで、テーブルなりDIVのブロックなりでカレンダーを整形していく中で、該当する日付のデータをDBから取得する場合、 日付の数だけSQLを発行するような作りになってしまった。1日について何種類かのデータを取得していたので負荷が高かった。

必要な数だけまとめてデータを取得して、それぞれを結果セットとしてXMLで保持しておけば、XPATHによる抽出も可能だし、表示の処理はXMLを回せば良い感じ。負荷も軽くなる。
非接続状態と言う感じ。体感速度もかなり速い。

VisualStudioのデータセットはこんな感じなんだなと思った。


// データベースへ接続
$dbh = new PDO($host, $user, $pass);
$dbh->query('SET NAMES utf8');
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

//SQL発行
$sql = "SELECT s_ID, s_d, s_title, s_place, FROM s_cld WHERE s_y = '$year' AND s_m = '$month' ORDER BY s_d, s_ID ";
$sth = $dbh->prepare($sql);
//$sthとしてPDOStatementのインスタンス取得
$sth->execute();

//DOMの作成
$dom=new DomDocument('1.0','UTF-8');
//ルートノード
$clds=$dom->appendChild($dom->createElement('clds'));
//結果ループで子ノード作成
foreach ($sth as $dat) {
  $cld=$clds->appendChild($dom->createElement('cld'));
//項目落とし込み
  $cld->appendChild($dom->createElement('ID',$dat['s_ID']));
  $cld->appendChild($dom->createElement('dd',$dat['s_d']));
  $cld->appendChild($dom->createElement('title',$dat['s_title']));
  $cld->appendChild($dom->createElement('place',$dat['s_place']));
}

//クリアしておく
$dat=null;
$sth=null;
$dbh=null;

//DOM整形(なくてもよい?)
$dom->formatOutput = true;
//XMLとして読み込み
$xmlData= simplexml_import_dom($dom);

……………カレンダーの整形など……………

//XPATHで抽出($iは日付)
if (count($xmlData->xpath('/clds/cld[dd="'.$i.'"]'))== 0) {
   ………その日のデータがない処理…………………
}else{
//XMLのループ処理
  foreach($xmlData->xpath('/clds/cld[dd="'.$i.'"]') as $dat){
    …………………………

Topへ
by IT's AGENT