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); ?>
回答を見る
  • ベストアンサー

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

csvを使用したデータバインド(JavascriptとPHPについて質問) お世話になります。教えてください<m(__)m> 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

  • phpでcsvデータをランダム表示について

    下記はcsvデータをランダムに1つだけ抽出するphpのプログラムですが、1度表示したデータに色をつけるとか、表示させない方法はありますか? <!doctype html> <html> <head> <meta charset="UTF-8"> <title>無題ドキュメント</title> </head> <body> <?php // 抽出数 $count = 1; $list = array(); // 読み込みCSVファイル $lines = file('test.csv'); shuffle($lines); foreach ($lines as $line) { if ( ! in_array($line, $list)) { array_push($list, $line); if (count($list) >= $count) { break; } } } // CSVファイルに出力 $file = fopen('test2.csv', 'w'); foreach ($list as $l) { echo $l.'<br>'; if ($file) { fputs($file, $l); } } fclose($file); ?> </body> </html>

    • ベストアンサー
    • PHP
  • 【PHP】CSVファイルの特定行を書き出す

    PHPでCSVファイルを読み込み、特定行のみを別のCSVファイルに書き出したいと思います。 作りたいものは、 http://example.com/file.php?repert=5 とすると、「002.csvファイルの5行目のみ」を「003.csv」に書き込むというものです。 下記で作りましたが、 Parse error: syntax error, unexpected end of file in C:\xampp\htdocs\file.php on line 32 になります。 指摘された32行は ?> の行です。 ググると改行コードのトラブルのようでしたのでCR+LF CR LF と試しましたが、改善されません。 どこが不味いかご教示戴けませんでしょうか? 宜しくお願い致します。 <?php $repeat = $_GET['repert']; $inFile = '002.csv'; // 抽出元ファイル $outFile = '003.csv'; // 結果ファイル $inFp = fopen($inFile, 'rb'); $outFp = fopen($outFile, 'w'); while ($data = fgetcsv($fp, 10000)) { if ($count == $repeat) { { $outLineArray = array( 0 => $data[0], 1 => $data[1], 2 => $data[2] ); fputs($outFp, implode(",", $outLineArray) . ""); } } fclose($inFp); fclose($outFp); exit(); ?>

    • 締切済み
    • PHP
  • 行数が30万件ほどあるCSVから、PHP経由でMysqlにデータを投入

    行数が30万件ほどあるCSVから、PHP経由でMysqlにデータを投入しようとしています。 2000件ごとにファイルを分割し、再度各ファイルを読み込みなおして、insertしようと考えました。 ところが、ファイル分割で2000件ごとに区切った場合、最後の2000件に満たない端数分をファイルに落とす方法がわかりません。 どなたか教えていただけないでしょうか。 ※かなり冗長な書き方をしているかと思いますので、改善点等あればご指摘いただければ幸いです。 以下サンプルコード------------------------------------------------------ $count = "0"; $max = "2000"; //ファイルあたりの行数 $file_count = "0"; //ファイル名につける連番 $RF = fopen( "base_file.csv", "r") or die("ファイルが開けません"); while (($data = fgetcsv($RF)) !== false) { if($count < $max){ //順番を入れ替えたり、データをいじるかもしれないのでsprintf $lines.= sprintf("%s,%s,%s,%s,%s,%s,%s\n", $data[0], $data[1], $data[2], str_replace(" "," ",$data[3]), //全角スペースを半角に変換 $data[4], $data[5], $data[6] ); } if($count == $max){ //ファイル名生成 $fileno = zerofill($file_count); $filename = "./files/datafile_".$fileno.".dat"; $WF = fopen($filename, "w"); fputs($WF, $lines); fclose($WF); //書き込みデータを空にする $lines = ""; $file_count++; $count = "0"; } $count++; } fclose($RF); //ファイル名の連番を0で埋める function zerofill($val){ if($val < 100){ if($val < 10){ $ret = "0".$val; } $ret = "00".$val; } return $ret; }

    • ベストアンサー
    • PHP
  • JS(ajax)でphp(csv)の読み込み

    こんにちは。 Javascriptのご教授お願いしたく、書き込みました。 今JavascriptでAjaxを使って、CSVを読み込むPHPを実行しています。 PHPでは、CSVを読み込み(readcsv.php)、その結果を別のファイル(alert.html)に受け渡しています。 問題が、読み込んでいるJavascript側でもデータを一つ一つ取得したいですが、 方法が分かりません。ご教授お願いします。 構成 : alert.html(Javascript), readcsv.php, test.csv コード構成 : -------------------------------------------------------------------------- alert.html <script type="text/javascript"> $.ajax({ type: "POST", url: "readcsv.php", success: function(printString) { alert(printString); --> ここをどうするべきか悩んでいます。 }, error:function(){ alert("error"); } } ); </script> ------------------------------------------------------------------------------- readcsv.php <?php $filename = "test.csv"; $row = 1; $rowS = 1; if (($handle = fopen($filename, "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, "*")) !== FALSE) { $num = count($data); $row++; for ($c=0; $c < $num; $c++) { $String = explode(",", $data[$c]); foreach ($String as $AllString) { echo $AllString."\n"; } echo "\n"; } } fclose($handle); } ?> ---------------------------------------------------------------------------- test.csv 1,2,3,4,6,8*9,1,2,3,5,7,2,1,3,5*7,2,1,2,3,5,7,2*1,5,3 ---> 数字の羅列(コンマ区切り) ---------------------------------------------------------------------------- です。 一番問題になっているところは、 alert.html の alertのところで、 readcsv.php から受け取った値を一つ一つ変数に格納したいところです。 ご教授お願いします。

  • PHPでCSVをへんしゅうするには?

    CSVで編集をする際の動作にどうしても詰まってしまい困っています。 いろんなことを試したのですがうまくいきません。 追加と削除ができなので、それを合体すれば出来るのかなって思ったのですが、 ファイルの中身が消えてしまって、先に進まない状態なのです。 // 変更 if(isset($_POST["submit_upd"])){ // 押下したボタン番号を取得 $upd = isset($_POST["sbumit_upd_del"])? $_POST["sbumit_upd_del"]: ""; // POSTされたデータを取得 $number = $_POST["number"]; $category = htmlspecialchars($_POST["category"], ENT_QUOTES); $dating = htmlspecialchars($_POST["dating"], ENT_QUOTES); //csvファイルに書き込み $data_all = @file($filecsv); $file_csv = @fopen($filecsv, "w"); flock($file_csv,2); for($i=0; $i<count($data_all);$i++){ $data_array = explode(",", $data_all[$i]); if($data_array[0] != $upd){ //csvファイルに書き込み $current = @file_get_contents($filecsv); $current .= "$number,$category,$dating\n"; file_put_contents($filecsv, $current); } } flock($file_csv,3); fclose($file_csv); unset ($data_all); header("Location: index.php"); exit; }

    • ベストアンサー
    • PHP
  • PHP配列をJavaScriptに渡したい

    全くの初心者です。 PHPファイルのなかで外部のテキストファイルから読み込んだデータ$listをJavaScriptの配列に変換したいのですが、分かりません。よろしくお願いします。 JavaScriptが外部のデータを読み込めないなら、いったんPHPでオプションメニューに書き込んだあと、これをJSで配列に取り込むことも考えたのですが、これもオプションメニューの各アイテムをどうしたら読み取れるのかが分かりませんのであきらめたしだいです。 <?php $file = fopen("GermJ.txt","r"); $list = file('GermJ.txt'); fclose($file);  $max=count($list); ?> <SCRIPT type="text/javascript"> <!-- var jsArray; // グローバル宣言 function Arraycreate() {  jsArray = new Array($max);  //$max をこうすることは可能ですか?  for (i = 0; i <= $max-1; i++) { jsArray = $list[i];???????? (分かりません) } } // --> </SCRIPT>

    • ベストアンサー
    • PHP
  • CSVファイルの最終行のデータを取り出したい

    PHPでCSVファイルのデータを取り込もうとしています。 全てのデータを表示させるのであれば、「while」などを使って書くのが一般的かと思うのですが、 最終行のデータ(「,」で区切られた最も左のフィールド)だけを取り出したいので、 以下のように書いてみました。 <?php $file = fopen("hoge.csv","a+"); $nakami = fgetcsv ($file, 1000, ","); echo $nakami[0]; fclose($file); ?> 「fopen」のmodeについて、「r」にすれば先頭から読み込まれ、 「a+」もしくは「ab+」ならばファイルの終わりにポインタが来る・・・ と色々なマニュアルに書かれていましたので、上記のようにしてみたのですが、 $nakami[0]で表示されるのは、1行目の最左列のデータになってしまいます。 1)このやり方(modeの設定)では最終行のデータ取得は不可能なのか 2)どのようなやり方なら最終行のデータ(のみ)は取得できるのか お知恵をお借りできれば幸いです。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • phpでcsvの文字化けを直す方法が知りたい!

    <?php /* 配列の作成 */ $array = array($name, $telephone, $email); /* ファイルポインタをオープン */ $file = fopen("information.csv", "a"); /* CSVファイルを配列へ */ if( $file ){ var_dump( fputcsv($file, $array) ); } /* ファイルポインタをクローズ */ fclose($file); ?> 上記のように記載した時、windowsのchromeでみると文字化けしてしまいます。 どのような記述をすれば、文字化けしないか教えてください。

    • ベストアンサー
    • PHP
  • PHPでCSVの一部の行を編集したい

    掲示板の管理画面の様な感じで、 PHPでCSVファイル内の一行を編集するフォームを作りたいと思っています。 フォームには新規投稿と、編集用のボタンがあり、 編集用で送られてきたものを受け取るPHPプログラムは以下の通りです。 if($mode == "edit"){ foreach($csv as $val){ list($li_id, $li_date, $li_comment) = split("\t",$val); $fp = fopen(csv' , 'w'); if($li_id == $info_no){ $csv[$li_id] = "$li_id\t$date_y/$date_m/$date_d\t$comment\t\n"; }else{ $csv[$li_id] = "$li_id\t$li_date\t$li_comment\t\n"; } } $fp = fopen('csv' , 'w'); fputs ($fp, $csv[$li_id]); for ($i=0; $i<1000; $i++){ fputs ( $fp,$csv[$i]); } fclose($fp); } としたのですが、うまくいきませんでした。 なぜか、編集した文章と、最後に新規で追記した文章が追加されてしまいます・・・・。 「あいうえお」を新規で追記した後、 1. あいうえお 2. かきくけこ 3. さしすせそ 4. たちつてと の2を編集すると 1.あいうえお 1.あいうえお 2.かきくけこ(編集した) 3.さしすせそ 4.たちつてと となってしまいます。。。。 新規で追記されたものがない場合は 空行が追記されてしまいます。 いろいろ試行錯誤したのですが、さっぱりわかりません。 教えて下さい。

    • 締切済み
    • PHP
  • PHPによる行データのアップダウン

    PHPによる行データのアップダウン フォームからデータ行をGETした内容をアップダウンさせたいのですが、どうにも入れ替えができません。 プログラムコードのアドバイスをください。 *ログファイルの中(data.dat) ゴリラ チューリップ ばなな ストロベリー ペンギン <?php $data = "data.dat"; function row_up() { $lines = @file($data); $lines[$ont] = $lines[$_GET[row]]; //自分 $lines[$_GET[row]] = $lines[$_GET[row]-1]; //前の人 $fp = fopen($data,"w"); rewind($fp); for($i=0;$i<count($lines);$i++) { if($lines[$i] == $lines[$_GET[row]]){ fputs($fp,$lines[$_GET[row]]); } elseif($lines[$i] == $lines[$ont]){ fputs($fp,$lines[$ont]); } fputs($fp,$lines[$i]); } fclose($fp); } function row_down() { $lines = @file($data); $lines[$ont] = $lines[$_GET[row]]; //自分 $lines[$_GET[row]] = $lines[$_GET[row]+1]; //次の人 $fp = fopen($data,"w"); rewind($fp); for($i=0;$i<count($lines);$i++) { if($lines[$i] == $lines[$ont]){ fputs($fp,$lines[$ont]); } elseif($lines[$i] == $lines[$_GET[row]]){ fputs($fp,$lines[$_GET[row]]); } fputs($fp,$lines[$i]); } fclose($fp); } switch($_GET[mode]) { case up: row_up(); break; case down: row_down(); break; default: break; } ?>

    • ベストアンサー
    • PHP

専門家に質問してみよう