• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:csvを使用したデータバインド(JavascriptとPHPについて質)

csvを使用したデータバインド(JavascriptとPHPについて質問)

このQ&Aのポイント
  • 1ページ内でJavascriptで抽出ワードを入力・抽出し、表示された一覧のデータをcsvで保存できるようにしたいのですが、抽出から保存の間でデータが引き継ぐにはどうしたら良いのでしょうか。
  • http://www.makoto3.net/document/databind/smp021.htmlに
  • <?php #Header("Content-type: application/x-csv; charset=Shift_JIS"); tmpfname = tempnam("C:\xampp\htdocs\testdir", "file.csv"); handle = fopen(tmpfname, "w"); fwrite(handle, "writing to tempfile"); fclose(handle); # CSVファイルに書き込み wcsv_file = "data.csv"; wopen = fopen(wcsv_file, "w") or die("wエラー:ファイルを開けません"); #wcsv_file = "data.csv"; # 書き込みと改行 #fputs(wopen, trim(write_value)); #fputs(wopen, "\r\n"); fclose(wopen); unlink(tmpfname); ?>

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

  • ベストアンサー
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.3

全部文字コードをUTF-8にそろえれば、文字化けせず、下のサンプル で望みどおりの機能は出来ました。 (古いIEは無視です。IE7とIE8のみです。) function XmlSend(){ var xmlstr = document.getElementById("table1").outerHTML; var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = handler; xmlhttp.open("POST", "/php/reciveXML.php",true); xmlhttp.setRequestHeader("Content-Type","text/xml"); xmlhttp.setRequestHeader("charset","UTF-8"); xmlhttp.send(xmlstr); function handler(){ if (xmlhttp.readyState == 4) { if (xmlhttp.status == 200) { window.alert("CSVを書き込みました。"); } else { window.alert("通信エラーが発生しました。"); } } } } PHPのコード(reciveXML.php)は <?php mb_internal_encoding("UTF-8"); $wopen = fopen("../temp/data.csv","w") or die("wエラー:ファイルを開けません"); $postdata = $HTTP_RAW_POST_DATA; $dom = new DOMDocument(); @$dom->loadHTML($postdata); $xpath = new DOMXPath($dom); $query = "/descendant::tr"; $entries = $xpath->query($query); foreach($entries as $entry){ $write_value = ""; $tds=$entry->getElementsByTagName("td"); for ($i = 0; $i < $tds->length-1; $i++) { $write_value = $write_value.mb_convert_encoding($tds->item($i)->textContent,"ISO-8859-1","UTF-8").","; } $write_value = $write_value.mb_convert_encoding($tds->item($tds->length-1)->textContent,"ISO-8859-1","UTF-8")."\n\r"; fwrite($wopen,$write_value); } fclose($wopen); ?>

haruka-00
質問者

お礼

yyr446さん何度もありがとうございますm(__)m 感謝!感謝!です。 自分がどれだけ勉強不足か改めて実感です。 これで、やってみます!!! 本当にありがとうございました。

その他の回答 (2)

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.2

とりあえず、IEに特化したSCRIPTですが、 ↓のfunctionでPHPに絞り込んだ<TR>要素の中身が送信できました。 <button onclick="XmlSend();">送信</button> function XmlSend(){  var tr=document.getElementById("table1").getElementsByTagName("tr");  var data = document.createElement('data');  for(var i=0;i<tr.length;i++){   data.appendChild(tr[i].cloneNode(true));  }  var xmlstr = "<?xml version='1.0' encoding='utf-8' ?>"+data.outerHTML;  var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");  xmlhttp.onreadystatechange = handler;  xmlhttp.open("POST", "/php/reciveXML.php",true);  xmlhttp.setRequestHeader("Content-Type","text/xml");  xmlhttp.setRequestHeader("charset","Shift-Jis");  xmlhttp.send(xmlstr);  function handler(){   if (xmlhttp.readyState == 4) {    if (xmlhttp.status == 200) { /* デバッグ用    window.alert(xmlhttp.responseText);    document.getElementById("debug").innerHTML=xmlhttp.responseText; */    } else {    window.alert("通信エラーが発生しました。");    }   }  } } PHP側は、未完成ですが <?php mb_internal_encoding("UTF-8"); //$postdata = file_get_contents("php://input"); $postdata = $HTTP_RAW_POST_DATA; $dom = new DOMDocument(); @$dom->loadHTML($postdata); $dom->normalize(); $xpath = new DOMXPath($dom); $query = '//tr'; $entries = $xpath->query($query); /*デバッグ用 foreach($entries as $entry){ print_r($entry->textContent); } */ ?> でも、見事に文字化けしてしまいました。 PHPの処理がまずいみたいです。 PHPも、もっと研究しなきゃ....

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

 javascriptとPHPは、別のタイミングで、別の場所で動いています。 従ってページ内で直接データを受け渡しする事は出来ません。 どうしても、送信といった処理が必要になります。 javascript(HTMLページ)から、PHPにデータを引き渡す方法は、 現状HTTPプロトコルのPOST、GETしかありません。 (※将来HTML5のWebSocketを各ブラウザーが実装すれば、この手の処理は  多少楽になりそうですが) つまり、フォームでサブミットするか、XmlHttpRequestで非同期通信する しかありません。しかしデータベースオブジェクトをそのまま送信する ことは出来ないので、フィルタリングしたデータを文字列にシリアライズ して送信し、PHP側がアンシリアライズしてパースする必要があります。 (XmlHttpRequestの場合、データをXML形式で送信出来るので、今回の ケースでは、多少楽できるかも)  ご提示のjavascriptはもろにIEに特化したMs Jscriptですね。どうしても これを使いたいなら、ページ内にボタンを儲け、そのクリックでその時に 表示されてる<table id="table1">にDOM APIやHtmlTableインターフェース でアクセスして、<tr>要素を取得して、XMLとしてXmlHttpRequestを使って、 別途作成しておいたPHPプログラムにPOSTリクエストし、PHPプログラムは 受信したデータをXMLオブジェクトなりDOMオブジェクトなりに突っ込んで (この時、文字コード、に注意)各<TD>の値を取得して、ご提示のPHPのス クリプトでcsv形式でファイルに書き込めばよいかと思います。  私なら、最初からIEのデータバインドなんか使いません。PHPとJavascript とAJAX通信で作れます。

関連するQ&A