データベースの内容をphp出力し、ブラウザで表示するプログラムを作ってます - PHPプロ!Q&A掲示板

3439

  • 0P

データベースの内容をphp出力し、ブラウザで表示するプログラムを作ってます

質問日時 / 2011年10月21日 13:03 (最終編集:10月21日 16:53)    回答数 / 10件

Questioner:  secretbase  このエントリーをはてなブックマークに追加 

キーワード / xml    jQuery    MySQL   

サーバ側でデータベース(MySQL)の内容をphpでxml形式で出力し、クライアントであるブラウザ上で読み込んで表示するというプログラムを作っています。出力する内容は緯度、経度、文字列の組み合わせからなるレコードです。ブラウザ側はxmlデータから読み取った緯度、経度からGoogleMap上でその座標にマーカーを設置し、文字列を情報ウィンドウで表示します。その際xmlの読み込みとしてjqueryというJavascriptのライブラリを使用しています。

しかし、xmlの読み込みには成功するのですが、タグの読み込みが成功していないのかマーカーを設置することができません。また、一度xmlファイルに出力し、そのxmlファイルを直接読み込んだ場合はマーカーの設置に成功しています。ブラウザはfirefoxを用いてローカルで動作させています(ローカルだとfirefoxしかうまくいかないようなので)。文字コードのせいかと疑って色々試してみたのですがやはりうまくいきません。散々調べたのですが原因が分からないのでご意見いただけると幸いです。

以下プログラム

phpプログラム↓ 
  1. <?php
  2.  
  3. $dom = new DomDocument('1.0');  // DOMを作成
  4. $dom->encoding = "UTF-8"// 文字コードをUTF-8に
  5. $dom->formatOutput = true// 出力XMLを整形(改行,タブ)する
  6.  
  7. $link = mysql_connect('localhost''root''***');
  8. if (!$link) {
  9.     die('接続失敗です。'.mysql_error());
  10. }
  11.  
  12. $db_selected = mysql_select_db('twitter'$link);
  13. if (!$db_selected){
  14.     die('データベース選択失敗です。'.mysql_error());
  15. }
  16.  
  17. mysql_set_charset('sjis');
  18.  
  19. $result = mysql_query('SELECT status,X(location) as lng,Y(location) as lat FROM newstatusstream where 1');
  20. if (!$result) {
  21.     die('クエリーが失敗しました。'.mysql_error());
  22. }
  23.  
  24. $Markers = $dom->appendChild($dom->createElement('Markers'));
  25.  
  26. header("Content-Type: text/xml; charset=UTF-8");
  27.  
  28. while ($row = mysql_fetch_assoc($result)) {
  29.     $marker$Markers->appendChild($dom->createElement('marker'));
  30.  
  31.     $lat$marker->appendChild($dom->createElement('lat'));
  32.     $lat->appendChild($dom->createTextNode(mb_convert_encoding($row["lat"],"UTF-8","Shift-Jis")));
  33.  
  34.     $lng$marker->appendChild($dom->createElement('lng'));
  35.     $lng->appendChild($dom->createTextNode(mb_convert_encoding($row["lng"],"UTF-8","Shift-Jis")));
  36.  
  37.     $status$marker->appendChild($dom->createElement('status'));
  38.     $status->appendChild($dom->createTextNode(mb_convert_encoding($row["status"],"UTF-8","Shift-Jis")));
  39.  
  40.  
  41. }
  42.  
  43. echo $xml =$dom->saveXML();
  44.  
  45. $close_flag = mysql_close($link);
  46.  
  47. ?>

出力するxmlの内容↓(一度xmlファイルで出力し、内容が正しいことを確認済み)

<Markers>
<marker>
<lat>35.90713566</lat>
<lng>139.62467867</lng>
<status>今日は家でゆっくりしようとしたのに彼女に捕まった(´Д` )もうやだ</status>
</marker>
<marker>
<lat>35.93664</lat>
<lng>139.7752</lng>
<status>特別支援学校での実習一日目終了。こんなに疲れたのは久々だが充足感で一杯。</status>
</marker>
<marker>
<lat>35.65995282</lat>
<lng>139.66742724</lng>
<status>打ち合わせ (@ 黒川食堂) http://t.co/S8drSLG</status>
</marker>
</Markers>


jqueryを用いてGoogleMapに表示するJavaScriptプログラム一部抜粋↓

  1. function setPointMarker(){
  2.         //XML取得
  3.         $.ajax({
  4.             url: './mysql_output.php',
  5.             type: 'GET',
  6.             dataType: 'xml',
  7.             timeout: 1000,
  8.             error: function(){
  9.                 alert("情報の読み込みに失敗");
  10.             },
  11.             success: function(xml){
  12.               alert("読み込み成功");
  13.                 //帰ってきた地点の数だけループ
  14.  
  15.                 $(xml).find("marker").each(function(){
  16.  
  17.                     var Lat = $("lat",this).text();
  18.                     var Lng = $("lng",this).text();
  19.                     var Status = $("status",this).text();
  20.  
  21.                     //マーカーをセット
  22.                     MarkerSet(Lat,Lng,Status);
  23.                 });
  24.             }
  25.         });
  26.     }

xml形式で出力した場合、読み込み成功のアラートは表示されるのですが、その先が進みません。ちなみにJavaSript側の文字コードはUTF-8になってます。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01shimixファイルにsaveして確認した内容が正しということであ
 ┗A01-1secretbaseすいません。転記ミスです。実際のプログラムは he
  ┗A01-1-1shimixApacheであれば、content-typeをapplication/xmlにし
   ┗A01-1-1-1secretbasecontent-typeをapplication/xmlとし header("Content
    ┗A01-1-1-1-1shimix「saveした内容は問題ない」ということですから、いっ
     ┗A01-1-1-1-1-1secretbasereadfile(saveしたファイル名); とし、上記のプログ
      ┗A01-1-1-1-1-1-1shimixうーん・・。saveとsaveXMLで何か違いますかねぇ。
       ┗A01-1-1-1-1-1-1-1secretbase$dom->saveXML() の場合も $dom->save($filename) の
        ┗A01-1-1-1-1-1-1-1-1shimix>echo $xml= $dom->save($filename) の場合は いや
         ┗A01-1-1-1-1-1-1-1-1-1secretbaseご指摘ありがとうございます。 ご指摘の通り実行し

回答一覧

並び替え:

A01
answerershimix [10月21日 13:33]

ファイルにsaveして確認した内容が正しということであれば、直接ブラウザに返すときの問題はhttpレスポンスヘッダ(Content-type)くらいだと思いますが、

>header("Content-Type: text/xml; charset=charset=UTF-8");

これは転記時のtypoでしょうか?

この意見に回答する

ツリーへ TOPへ

A01-1
replyersecretbase [10月21日 16:51]

すいません。転記ミスです。実際のプログラムは

header("Content-Type: text/xml; charset=UTF-8");

となってます。

また、webサーバはApacheを使用しているのですが、ブラウザにhttp://localhost/mysql_output.phpと入力してphpプログラムの出力結果をブラウザで確認しても、上記のようにファイルに出力した通りの結果が表示されています。

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyershimix [10月21日 18:56]

Apacheであれば、content-typeをapplication/xmlにしてみればどうでしょうか?Apacheは(xmlファイルに対して)こちらを返していると思いますが。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyersecretbase [10月27日 16:26]

content-typeをapplication/xmlとし
header("Content-Type: application/xml; charset=UTF-8")
としたところ、やはりマーカーの設置はできませんでした。

お手数申し訳ありません。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1
replyershimix [10月27日 16:35]

「saveした内容は問題ない」ということですから、いったんsaveして

  readfile(saveしたファイル名);

で出力したらどうなりますか?

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1
replyersecretbase [10月28日 10:52]

readfile(saveしたファイル名);
とし、上記のプログラムのechoをコメントアウトたところ、echoで出力したのと同様に正しくブラウザに表示されました。

また、先ほど気づいたのですが、saveしたxmlファイルを手動で編集した後に読み込む場合、メモ帳で編集する場合は通常と変わらずマーカーを設置できるのですが、ワードパッドで開いて編集したところ、文字を加えた場合も、もともとある文字を一部削除しただけの場合もxmlファイルは読み込むのですがマーカーを設置できなくなりました。今回問題となっている症状と全く同じ症状になったのですが、何か関係があるのでしょうか?

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1
replyershimix [10月28日 11:16]

うーん・・。saveとsaveXMLで何か違いますかねぇ。

  1. <?php
  2.   :
  3.   :
  4. print "length-1:" . $dom->save('test.xml') . "<br />" . PHP_EOL;
  5. print "length-2:" . strlen($dom->saveXML()) . "<br />" . PHP_EOL;

などとしてみましたが、こちらのテストでは同じ値しか返ってきませんでした。secretbaseさんの環境ではどうですか?

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1-1
replyersecretbase [10月28日 15:33]

$dom->saveXML() の場合も $dom->save($filename) の場合もxmlファイルは正常に同様のものが出力されましたが、ブラウザに出力する際に、
echo $xml= $dom->saveXML() の場合は正常に出力されましたが、
echo $xml= $dom->save($filename) の場合は

This page contains the following errors:
error on line 1 at column 1: Document is empty
Below is a rendering of the page up to the first error.

というエラーとなり出力できませんでした。

またどちらの方法で出力してもxmlファイルの方はワードパッドで開くと文字化けしているようです。メモ帳で開いて保存するとワードパッドでも文字化けしないようになりました。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1-1-1
replyershimix [10月28日 16:32]

>echo $xml= $dom->save($filename) の場合は

いやs、->save($filenname)の戻り値は「書き込んだ文字数」ですから。xmlとしては不正なのが当然です。

前のレスでの話は、その「文字数」を比較してもらいたかったのです(headerは削除してhtmlとして返すようにして。です)。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1-1-1-1
replyersecretbase [10月28日 17:06]

ご指摘ありがとうございます。

ご指摘の通り実行してみたところどちらの場合も、同様の結果1528が返ってきました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
セッションがいいのか、それともデータベースがいいのか教えて下さい。
 このエントリーをはてなブックマークに追加 
A
>ボタンをクリックしたら選んだ商品情報を持っておきたいと思っています。 そのくらいのことならセッションもしくはCookie(期限短め:場合によってはブラウザ閉じるまで)でいいんじゃないですかね。 #わ...

>>続きを読む

一つの目安として、ECサイトの購入情報など絶対に消えてはいけないものはDBに、カートなどの一時的に使用する情報や、ユーザに任意のタイミングで消去されても構わないものはセッションにと使い分けるといいでしょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)