フォームからPOSTされた値をXMLへ書き込むプログラムの問題

このQ&Aのポイント
  • 「あ」を入力するとなにも書き込まれません。1日調べても原因がわからず、解決策を教えていただけないでしょうか。
  • Windows2008サーバ、php5.3.2、IIS7.0を使用している環境で、フォームからPOSTされた値をXMLへ書き込むプログラムが正常に動作しない問題があります。
  • DOMDocumentクラスを使用してXMLへの書き込みを試みたが、文字コードの変換などの処理が必要ないか確認する必要があります。
回答を見る
  • ベストアンサー

フォームからPOSTされた値をXMLへ書き込むプログラムなのですが、「

フォームからPOSTされた値をXMLへ書き込むプログラムなのですが、「あ」を入力するとなにも書き込まれません。 「あ」以外は正常に書き込めるようです。 1日調べてみたのですが、どうしてもわかりません。 教えていただけないでしょうか。 情報が足りないようでしたら出させていただきますのでどうかよろしくお願いします。 $dom = new DomDocument('1.0','utf-8'); $dom->load($FilePath); $data = $dom->documentElement->parentNode->firstChild->appendChild($dom->createElement('data')); $testnode = $data->appendChild($dom->createElement('test')); $testtxt = mb_convert_encoding($_POST['test'],'utf-8','sjis'); $testnode->appendChild($dom->createTextNode($testtxt)); 環境 Windows2008サーバ php5.3.2 IIS7.0

  • PHP
  • 回答数2
  • ありがとう数5

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

  • ベストアンサー
回答No.1

XAMPPの5.2.3ですが、提示されているプログラムで正常に「あ」が書き込めるようです。 とりあえず確認事項として、 ・HTML(フォーム)は、SJISで記述されているか ・XMLファイルのヘッダには「<?xml version="1.0" encoding="utf-8"?>」が含まれているか(utf-8が重要) ・XMLファイルはUTF-8で記述されているか ・XMLファイルを作成時にBOM付にしていないか(これは微妙) ・$_POST['test']は$testtxtに挿入する前に何かエスケープ処理とかで文字を変えていないか(サンプル中のmb_convert_encoding以外に、という意味で、提示されているプログラムのほかの場所で。) といったあたりチェックしてみてください。

ik140_o
質問者

お礼

hogehoge78さんのおっしゃるとおりエスケープ処理でした。 エスケープ処理の文字が文字化けしていたことが原因です。 ファイルコピーした時におきかわってしまったのかもしれません。 書いてないところまで推測してもらってもうしわけないです。 ほんとうに助かりました。ありがとうございます。

その他の回答 (1)

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.2

>> 1 に同感。 とりあえず、文字コード。XML の宣言、ヘッダのメディアタイプの指定も。を確認してみてください。 PHP の DOM 君は文字コードが違っていてもそれなりに処理してくれるので。 >> documentElement->parentNode どうでもいいけど、ルートの親って何?

ik140_o
質問者

お礼

ご回答ありがとうございます。 >>PHP の DOM 君は文字コードが違っていてもそれなりに処理してくれるので。 そうなんですか、あまり知識がないもので参考になります。 >>どうでもいいけど、ルートの親って何? ごめんなさい間違えました。

関連するQ&A

  • xmlファイルが生成されない

    <?php //DomDocumentを呼び出す $dom = new DomDocument('1.0','UTF-8'); //要素ノード[document]を追加 $document = $dom->appendChild($dom->createElement('document')); //新しい要素をdocumentの子要素として挿入する $document->appendChild($dom->createElement('name','名前です')); $document->appendChild($dom->createElement('text','テキストです。')); //字下げや空白を考慮してきれいに整形した出力を行う $dom->formatOutput = true; //同階層にtest.xmlとして保存 $dom->save('test.xml'); //出力 echo $dom->saveXML(); ?> のように、同じディレクトリ内にXMLファイルを生成するphpプログラムを作成してみたのですが、 ブラウザからこのPHPファイルにアクセスしてもXMLファイルが作られません。どうすれば良いのでしょうか。 なにかphp,apache等の設定をしてないからでしょうか。 よろしくお願いします。

    • 締切済み
    • PHP
  • XMLの子要素追加の順番について

    PHP板が見つからなかったのでここに・・・ $dom = new DOMDocument(); $dom->formatOutput = true; $dom->load("test.xml"); で読み込み $child = $parent->appendChild($dom->createElement('child')); $child->appendChild($dom->createCDATASection($_POST['post'])); このように追加を行った場合 XMLには、追加されますが上から順番に追加されていきます。 <parent> <child>追加1</child> <child>追加2</child> <child>追加3</child> <parent> 下記のように先頭に追加する場合はどのようにすればいいのでしょうか? <parent> <child>追加3</child> <child>追加2</child> <child>追加1</child> <parent> ご回答のほどよろしくお願いします。

    • ベストアンサー
    • PHP
  • XML DOMについて

    JavaScriptでDOMを使用して、xmlhttp.sendで指定のPHPファイルに送信しましたが、 PHP側で値を取得できません。 (PHP Ver.5.3.0) 以下、JavaScript var UserID="abc"; var Password="abc"; var xmlDoc = new ActiveXObject("Microsoft.XMLDom"); xmlDoc.appendChild(xmlDoc.createProcessingInstruction("xml","version=\"1.0\"")); var root = xmlDoc.createElement("xDoc"); xmlDoc.documentElement=root; var node_Item = xmlDoc.createElement("Command"); root.appendChild(node_Item); var node_UserID = xmlDoc.createElement("UserID"); node_UserID.appendChild(xmlDoc.createTextNode(UserID)), node_Item.appendChild(node_UserID); var node_Password = xmlDoc.createElement("Password"); node_Password.appendChild(xmlDoc.createTextNode(MDString(Password))), node_Item.appendChild(node_Password); var node_Sufix = xmlDoc.createElement("Sufix"); node_Sufix.appendChild(xmlDoc.createTextNode(Sufix)), node_Item.appendChild(node_Sufix); var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); xmlhttp.open("post",topURL("main/Log.php"),false); xmlhttp.send(xmlDoc); 以下、Log.php <?php session_start(); $DEBUG_MODE=false; $xmlLogQ=$_SERVER['DOCUMENT_ROOT']."/test/temp/Request.xml"; $xml = new DOMDocument(); $xml->async=false; if (!$DEBUG_MODE) { if ($XML_LOG) { $xml->save($xmlLogQ); } } else { if ($XML_LOG) { $xml->load($xmlLogQ); } } $doc=$xml->documentElement; if ($xml->parseError.errorCode==0) { $xml = $node=$doc->selectSingleNode("Command/UserID"); if (!($node==null)) { $UserID=$node->text; $node=null; } $node=$doc->selectSingleNode("Command/Sufix"); if (!($node==null)) { $Sufix=$node->text; $node=null; } $node=$doc->selectSingleNode("Command/Password"); if (!($node==null)) { $Password=$node->text; $node=null; } } ?> 保存したXML上、<?xml version="1.0"?>以降書き込みできてません。 どの部分がおかしいか不明の為、申し訳ないですがご教授お願いします。

    • ベストアンサー
    • PHP
  • VBSでXMLを操作したい

    現在Webアプリケーションの簡単なものを作成しています。 データベースはXMLで出来上がっているのでそれを使いたいのですが、入力フォームに入れてもらったデータをXMLに変換してXMLデータベースに追加、保存しようと思います。 一応フォームに入力したものをXMLデータとして出力までは考えられたのですが、既存のXMLを読み出す方法と追加する方法、保存する方法がよくわかりません。 よろしくお願いいたします。 <html> <head> <title>入力フォーム</title> <script type="text/vbscript"> <!-- Option Explicit dim xmldoc Sub window_onload() set xmldoc=createObject("MSXML2.DOMDocument") xmldoc.async=False xmldoc.loadXML("<?xml version='1.0'?><全体/>") End Sub Sub makeXml() dim myInfoElement,myDataElement,myDataText dim ret1,ret2,ret3,ret4 set ret1=xmldoc.createTextNode(vbCRLf) xmldoc.documentElement.appendChild(ret1) set myInfoElement=xmldoc.createElement("名簿") set ret2=xmldoc.createTextNode(vbCRLf) myInfoElement.appendChild(ret2) set myDataElement=xmldoc.createElement("名前") set myDataText=xmldoc.createTextNode(myForm.myName.value) myDataElement.SetAttribute "年",myForm.myAge.Value myDataElement.appendChild(myDataText) myInfoElement.appendChild(myDataElement) set ret3=xmldoc.createTextNode(vbCRLf) myInfoElement.appendChild(ret3) xmldoc.documentElement.appendChild(myInfoElement) set ret4=xmldoc.createTextNode(vbCRLf) xmldoc.documentElement.appendChild(ret4) myForm.xmlSource.value=xmldoc.xml End Sub --> </script> </head> <body> <form name="myForm"> 名前:<input type="text" size="30" name="myName"><br> 年:<input type="text" size="10" name="myAge"> <button onClick="makeXml()">XMLの作成</button><br> <textarea name="xmlSource" cols="60" rows="15"></textarea> </form> </body> </html>

  • phpでxmlが動かない macOsXLion

    phpでxmlの練習をしてるんですが全く動作しません。なんででしょうか? コードを次に書きます。 <?php $doc = new DOMDocument; // DOMDocumentのインスタンス生成 $root = $doc->createElement("cars");  // root要素を作成する $doc->appendChild($root); // docの子としてrootを追加する $elm1 = $doc->createElement("car"); // car要素を作成する $root->appendChild($elm1); // car要素をrootの子として追加する $txt1 = $doc->createTextNode("スポーツカー"); // テキストノードを作成する $elm1->appendChild($txt1); // テキストノードをテキスト要素としてelm1の子として追加する $elm2 = $doc->createElement("car"); // car要素を作成する $root->appendChild($elm2); // rootの子としてcar要素を追加する $txt2 = $doc->createTextNode("トラック"); // テキストノードを作成する $elm2->appendChild(txt2); // elm2にtxt2を追加する print $doc->saveXML(); ?> よろしくお願いします。

    • ベストアンサー
    • PHP
  • XMLでこんなの作りたい。

    [ 環境 ] OS:WindowsXP Pro PHP:5.3.1 Apache:2.2.14 DBServer:SQLServer2005 EXPRESS [ 質問 ] DB側データ row,level,level_name 0,level1,root 1,level2,admin という様なデータをXMLにて以下の様な表示にしたい。 <?xml version="1.0" encoding="UTF-8" ?> <result> <row row="0"> <level>level1</level> <level_name>root</level_name> </row> <row row="1"> <level>level2</level> <level_name>admin</level_name> </row> </result> この場合、以下のソースをどの様に変更したら良いか アドバイスを頂けたらと思います。 <?php // SQLServerとの接続 require("connect-sqlserver.php"); // XML 生成 $dom = new DOMDocument("1.0"); $node = $dom->createElement("result"); $parnode = $dom->appendChild($node); // MSSQLSERVR への接続セット $db = mssql_connect($server, $userid, $passwd); mssql_select_db($dbName, $db); // [SYSW_LEVEL]テーブルからフィールド情報取得 $query = "SELECT * FROM SYSW_LEVEL"; $res = mssql_query($query, $db); header("Content-type: text/xml"); // XMLへフィールドの値を渡す while ($row = mssql_fetch_assoc($res)) { $node = $dom->createElement("row"); $newnode = $parnode->appendChild($node); $newnode->setAttribute("level", $row['LVL_LEVEL']); $newnode->setAttribute("level_name", mb_convert_encoding($row['LVL_LEVELNAME'],'UTF-8','CP932')); } $dom->encoding="UTF-8"; echo $dom->saveXML(); ?> 以上、よろしくお願い致します。

    • 締切済み
    • PHP
  • xml中の特殊文字処理について

    phpを使ってxmlを書き出すプログラムを書いたのですがどうしても解決できなくて困っています。具体的な内容は以下のとおりです。 $url = $root->appendChild($dom->createElement('url')); $text = $dom->createTextNode($T_url); $text = $url->appendChild($text); やりたいことは 変数$T_url に 「&」(本来は小文字です。)が含まれた場合そのままxmlに書いて表示させたいですが書き出したxmlをみると「&amp;」という文字列に置き換えて書き出されるのです。 変数$T_urlの内容そのまま書き出したいですがいい方法があればご教授ください。

    • 締切済み
    • PHP
  • XML DOM ルートノード直下に子ノードを持つノードを追加

    XML DOMを利用して、XMLファイルにデータを追加するPHPを書いています。 リファレンス等を参照して、追加は出来るようになったのですが ルートノードが増えていってしまいます。 ::::::::::::::::::::::::::::::::::::::::::::::::::::: define("XMLFILE", "○○.xml"); header("Content-Type: text/html; charset=UTF-8"); $doc = new DOMDocument("1.0","UTF-8"); $doc->formatOutput = TRUE; $doc->load(XMLFILE) or die("ファイルを読み込めません\n"); $record = $doc->createElement("record"); $date = $doc->createElement("date","日付サンプル"); $title = $doc->createElement("title","タイトルサンプル"); $paragraph = $doc->createElement("paragraph","パラグラフ"); $number = $doc->createAttribute("number"); $number->value ="004"; $doc->appendChild($record); $record->appendChild($number); $record->appendChild($date); $record->appendChild($title); $record->appendChild($paragraph); print htmlspecialchars($doc->saveXML(), ENT_NOQUOTES); $doc->save(XMLFILE) or die("ファイルを保存できません。"); :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: どのようにすれば、ルートノードの下に新規ノードが入ってくれるのでしょうか。 どなたか教えて頂けるととても嬉しいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • borderの指定方法

    var tbl = document.createElement("table"); var tbd = document.createElement("tbody"); var tr = document.createElement("tr"); var td = document.createElement("td"); td.appendChild(document.createTextNode("テストテーブル")); tr.appendChild(td); tbd.appendChild(tr); tbl.appendChild(tbd); DOMで書いたテーブルのTD要素のボーダーの指定方法で、下線だけ表示しないで枠をつけたいのですが、どのようにすればよいのでしょうか? どなたか教えてください。 よろしくお願いします。

  • 二つの XML 文書を結合する方法は?

    DOM で XML 文書を結合する例を探していたら、下記のものが見つかりました。 http://www.atmarkit.co.jp/fxml/askxmlexpert/020merge/merge_sample.html これを参考に、PHP5 でテストするために、下記のスクリプトを作成しました。 <?php $r1 = new DomDocument; $r1->loadXML("<Items><Item>a</Item></Items>"); $r1rt = $r1->documentElement; $r2 = new DomDocument; $r2->loadXML("<Item>b</Item>"); $r2rt = $r2->documentElement; $r1rt->insertBefore($r2rt,null); $r1->encoding = "utf-8"; print $r1->saveXML(); ?> このスクリプトを実行すると、insertBefore のところで例外が発生しエラーになってしまいます。何が悪いのでしょうか? 最終的にやりたいのは XML 文書を結合するということなので、DOM にはこだわりません。何か良い方法があれば、お知恵をお貸し下さい。

    • 締切済み
    • XML

専門家に質問してみよう