こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHP+MySQLでXMLを作成し、それをいくつか連結したものを返す方

PHP+MySQLでXMLを作成し、それをいくつか連結したものを返す方法を教えてください。

HTML
↓(1)httpリクエスト,パラメータ
(2)main.php(XML化メイン処理) XMLデータ送信→ HTML
↑ ↑ ↑
↓ ↓ ↓
(3)xml_1.php xml_2.php xml_3.php(XML生成子処理)
↑ ↑ ↑
↓ ↓ ↓
DB


(2)main.phpでHTMLから受け取ったコマンドを元に生成するXMLの取得を振り分ける。(switch文)
(3)各phpでDBからデータを取得しXML形式にする。
(4)main.phpでそれぞれのXMLを連結し送信。

というのがやりたいことなんですけど、
・SQLからデータを取得し、XMLにする方法
・メイン処理でそれぞれを連結する方法
がわかりません。

main.php
<?php
function xml_main($cmd, &$xml ){

global $log4php,$con,$debugMode;
$result = false;
$dbErrMsg;

// DB Open
openDb();
dbErr();

// log4phpオブジェクト
//$log4php = new log4php('log4php_xml.properties');
// トランザクション開始
mysql_query('BEGIN');
$log4php->debug('トランザクション開始');
/*
try{

// 文字コード変換(ujis=EUC-JP)
// TIPS デフォルトの文字コードがEUCだった場合は以下の二行を削除してください。
$sql = "SET NAMES utf8";
$result = @mysql_query($sql);

}
*/
// XML Header生成

// コマンド毎の呼び出し
switch($cmd){
case 0:
xml_1.phpとxml_2.phpで生成したxmlを連結
break;
case 1:
xml_1.phpとxml_3.phpで生成したxmlを連結
break;
case 2:
xml_2.phpとxml_3.phpで生成したxmlを連結
break;
default:
break;
}

// XML基本情報タグ生成


// XML Footer生成


// DB Close
closeDB();
}
?>

xml_1.php
<?php
function xml_1($id,$member,$msg,&$xml){
//DBからデータを取得

//xmlを作成

}
?>

という感じでやろうとしてるんですが。

xml_1.php xml_2.phpで文字列をreturnしてmain.phpでSimpleXMLで連結させるというのも方法として書いてあったんですが、
具体的なやり方がわかりません。

環境はPHP5.1 MySQL5です。

投稿日時 - 2010-09-26 01:43:18

QNo.6208326

すぐに回答ほしいです

質問者が選んだベストアンサー

結局データベースから投げられたものを、連想配列で取得してきたものを、一度XMLに変換してからXMLデータを連結させるって言うのは、効率悪い気がします。

・それぞれのデータをとりあえず連想配列で取得してきて、配列から一括でXMLに変換する
・それぞれのデータを一本のSQLで取得(JOINしたりUNIONしたり?)してきてそれをXMLにする

といったどっちかの実装をしたほうが良いのではないでしょうか。

という前置きを置きつつ、SimpleXMLでの、XMLデータの作成方法ですが、
<?php

//連想配列でデータベースから値が入ってきている。
$db_data = array(
array('name'=>'tarou', 'age'=>'22', 'mail'=>'hoge@foo.bar'),
array('name'=>'hanako', 'age'=>'41', 'mail'=>'test@example.com'),
);

//オブジェクトを作成
$root = new SimpleXMLElement('<root></root>');

foreach($db_data as $data){

$record = $root->addChild('rec'); //rootにrecordタグを挿入

$record->addChild('name', $data['name']); //recordタグにフィールド要素を挿入
$record->addChild('age', $data['age']); //同上
$record->addChild('mail', $data['mail']); //同上
}

echo $root->asXML();
?>

とすればとりあえずXML文書が作成出来ます。

すでにある二つのXML文書を読んできて連結させる方法に関しても、
結局SimpleXMLに読み込んで、foreachなどで要素ごとにグルグル回して取得してきて、
上記と同様なメソッドを使って新しいXMLに対して再投入する必要があります。
文字列のある部分とある部分をまとめて取得して、連結させる、という実装が出来るようには作られていないと思います。

投稿日時 - 2010-09-26 02:21:50

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

> ・SQLからデータを取得し、XMLにする方法
[PHP]
$implementation = new DOMImplementation;
$doc = $implementation->createDocument(NAMESPACE, 'records');
$doc->encoding = 'UTF-8';
$root = $doc->documentElement;

$result = mysql_query('SELECT * FROM `table name`', $dbh);
$records = mysql_fetch_assoc($result);

while ($row = mysql_fetch_assoc($result)) {
$record = $root->appendChild($doc->createElementNS(NAMESPACE, 'record'));
foreach ($row as $key => $value) {
$e = $record->appendChild($doc->createElementNS(NAMESPACE, $key));
$e->appendChild($doc->createTextNode($value));
}
}
[/PHP]
はじめから XML に保存しておけば、面倒なことをする必要もない。

>・メイン処理でそれぞれを連結する方法
どうやって連結するのかが指定されていない。だからこそ XSL を使う。
単純に取り込むだけなら XInclude を使ってもいい。

ちなみに、global で書けるものは、大体引数で渡すことができる。
どこで使われて、どこで変化するか分からないものを平気で使えるのか理解できない。

ついでに、@ でエラーを消してしまえる神経も理解できない。
NOTICE や STRICT がうっとおしいなら、出力を切っておけばいい。

まぁ、自分には関係ない。

投稿日時 - 2010-09-26 03:02:23

お礼

globalなどは他の処理をしているphpからコピペした際に消し忘れてたみたいです、すいません。

それと、回答いただいたのにポイント振り忘れてたみたいです。申し訳ないです。

投稿日時 - 2010-09-28 14:53:15

あなたにオススメの質問