PHPでCSVを編集する方法

このQ&Aのポイント
  • PHPでCSVを編集する方法について困っています。CSV編集の際にうまくいかず、追加と削除ができない状況です。
  • ファイルの中身が消えてしまうため、CSVの編集が進められません。
  • CSV編集に関する問題を解決するための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
  • 回答数1
  • ありがとう数0

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

どういう「編集」になっているのかさっぱりわかりませんが、例えば行単位の編集になっていれば(テキストファイルですから)一気に当該行だけ書き替えることは出来ません。 ・元ファイルをfile()で全部読み込んで、配列の所定の行を編集した内容で置き換えてから  まとめて書き出す ・元ファイルを読みながら別ファイルに書き出す(所定の行は読み込んだ内容でなく編集した  内容を書き出す)。終わったら別ファイルを元ファイルに上書き。 などの手法があります。 提示されたソースでは、fileで読み込んで順次処理しているようですが、所定の行以外のときに(ファイル全体を読み書きする)file_get_contents/file_put_ccontentsという意味不明な処理をしています。これは一体どういう意図でしょうか? http://php.net/manual/ja/function.file-get-contents.php http://php.net/manual/ja/function.file-put-contents.php なお「CSV」である以上、explodeやimplodeで処理すべきではありません(カンマで分割/連結するだけというのはダメです)。 (e.g.) $data = @file($filecsv); // 全体を読み込む $fh = @fopen($filecsv, "w"); // 書き込み用ハンドル foreach ($data as $val) { $array = str_getcsv($val); // CSVの行を分割 if($array[0] != $upd){ fputs($fh, $val); // $valの最後に改行があるのでそのまま } else { fputcsv($fh, array($number,$category,$dating)); // fputcsvが改行を自動付与 } fclose($fh);

owo0223
質問者

補足

回答有難う御座います。 大体の構造は、少し理解できたのですが、 phpのバージョンが5.2.4でstr_getcsv関数が5.3.xからみたいなので、代わりになる槍かを自分なりに検索したのですが、うまく組めませんでした。

関連するQ&A

  • php 送信されたフォームについて

    送信されたフォームの受け取る側のソースを書いたのですが、 <?php $i = 0; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; print('正解数'.$i./4'です'); ?> を付け加えるとエラーが表示されます。エラーの対象になっているのは print('正解数'.$i./4'です');らしいのですが、なぜエラーになるのかわかりません 回答お願いします。 以下ソースです。 <html> <head> <title>解答</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <style type=""text/css""> #container{ width:1000 } #main{ width:500px; float:right; } #sidebar{ width:500px; float:left; } </style> </head> <body> <div id="container"> <div id="main"> <p>問題の解答</p> <p>問1</p> <p>(1)(2)(3)(4)</p> <p>問2</p> <p>(1)(2)(3)(4)</p> <p>問2</p> <p>(1)(2)(3)(4)</p> </div> <div id="sidebar"> <p><>あなたの解答<></p> <p>問1</p> <p>(1)<?php print(htmlspecialchars($_POST['kaitouran11'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran12'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran13'], ENT_QUOTES, 'UTF-8')); ?> (4)<?php print(htmlspecialchars($_POST['kaitouran14'], ENT_QUOTES, 'UTF-8')); ?> </p> <p>問2</p> <p>(1)<?php print(htmlspecialchars($_POST['kaitouran21'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran22'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran23'], ENT_QUOTES, 'UTF-8')); ?> (4)<?php print(htmlspecialchars($_POST['kaitouran24'], ENT_QUOTES, 'UTF-8')); ?> </p> <p>問3</p> <p>(1)<?php print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran32'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran33'], ENT_QUOTES, 'UTF-8')); ?> (4)<?php print(htmlspecialchars($_POST['kaitouran34'], ENT_QUOTES, 'UTF-8')); ?> </p> </div> </div> <?php $i = 0; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; print('正解数'.$i./4'です'); ?> </body> </html>

    • 締切済み
    • PHP
  • PHPからMySQLにデータを渡すと文字化け

    PHPからフォームにデータを入れてMySQLに渡すとどうしても文字化けをしてしまいます。 MySQLはEUCらしいのです。 コレが解決すればほぼ完成するのに、最後の最後につまずいてます。 <?php require_once("../mydb_ini.php"); $con_mydb = mysql_connect($MYDBSERVER, $MYDBUSER, $MYDBPASSWARD); $selectmydb = mysql_select_db($MYDBNAME, $con_mydb) or die("失敗です");; $num=0; $mydbsql = "select * from newsline"; $rst = mysql_query($mydbsql, $con_mydb); $num = mysql_affected_rows(); $error = ""; $new_no = ""; $new_category = ""; $new_date = ""; $new_content = ""; $new_url_db = ""; $new_target = ""; $new_disabled = ""; if($_SERVER['REQUEST_METHOD']=="POST"){ if(isset($_POST["submit_add"])){ $new_no = htmlspecialchars($_POST["new_no"], ENT_QUOTES); $new_category = htmlspecialchars($_POST["new_category"], ENT_QUOTES); $new_date = htmlspecialchars($_POST["new_date"], ENT_QUOTES); $new_content = htmlspecialchars($_POST["new_content"], ENT_QUOTES); $new_url_db = htmlspecialchars($_POST["new_url_db"], ENT_QUOTES); $new_target = htmlspecialchars($_POST["new_target"], ENT_QUOTES); $new_disabled = htmlspecialchars($_POST["new_disabled"], ENT_QUOTES); if($error==""){ mb_convert_encoding($content, "EUC-JP"); $mydbsql = "INSERT INTO newsline VALUES('" . $new_no . "','" . $new_category . "', '" . $new_date . "', '" . $new_content . "', '" . $new_url_db . "', '" . $new_target . "', '" . $new_disabled . "')"; $rst = mysql_query($mydbsql, $con_mydb); } } if(isset($_POST["submit_upd"])){ $no = key($_POST[submit_upd]); $category = htmlspecialchars($_POST["category"][$no], ENT_QUOTES); $date = htmlspecialchars($_POST["date"][$no], ENT_QUOTES); $content = htmlspecialchars($_POST["content"][$no], ENT_QUOTES); $url_db = htmlspecialchars($_POST["url_db"][$no], ENT_QUOTES); $target = htmlspecialchars($_POST["target"][$no], ENT_QUOTES); $disabled = htmlspecialchars($_POST["disabled"][$no], ENT_QUOTES); if($error==""){ mb_convert_encoding($content, "EUC-JP"); $mydbsql = "UPDATE newsline SET category='$category', date='$date', content='$content', url_db='$url_db', target='$target', disabled='$disabled' WHERE no=". $no; $rst = mysql_query($mydbsql, $con_mydb); } } if(isset($_POST["submit_del"])){ $no = key($_POST[submit_del]); $mydbsql = "DELETE FROM newsline WHERE no=". $no; $rst = mysql_query($mydbsql, $con_mydb); } if($error==""){ $mydbsql; $new_no = ""; $new_category = ""; $new_date = ""; $new_content = ""; $new_url_db = ""; $new_target = ""; $new_disabled = ""; } } ?>

    • 締切済み
    • PHP
  • PHPでMySQLデータを更新するとエラー

    PHPで作成したプログラムでMySQLにデータを登録しています。 新規にデータの追加はできるのですが、更新するとエラーになります。 スクリプトは if (isset($_POST["submit_upd"])){ $no = key($_POST[submit_upd]); $name = htmlspecialchars($_POST["name"][$no], ENT_QUOTES); $division = htmlspecialchars($_POST["division"][$no], ENT_QUOTES); $email = htmlspecialchars($_POST["email"][$no], ENT_QUOTES); $tel = htmlspecialchars($_POST["tel"][$no], ENT_QUOTES); $group = htmlspecialchars($_POST["group"][$no], ENT_QUOTES); $sql = "UPDATE user SET name='$name',division='$division',email='$email',tel='$tel',group='$group' WHERE no=$no"; $mysql->query($sql); $error = "{$no}番のデータを変更しました"; エラーは(例:4番のデータのグループを3番に変更) 1064:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group='3' WHERE no=4' at line 1 となっています。 以前同じプログラムで下記の質問をして、こちらは解決したのですが 結合していたり、whileループの設定などのせいでgroupの値を上手く得られないのか?と悩んでいます。 http://okwave.jp/qa3972723.html クラスも上記に記載してあります。 まわりに聞ける人が全くおらず困っています。 どうかお力を貸していただければと思いますので よろしくお願いします。

    • ベストアンサー
    • MySQL
  • javascript php フォームについて

    javascriptで作ったフォームをphpに送信したいのですが、上手く送信できません。 どのようにすれば上手く送信することができるでしょうか? 回答お願いします。 javascript側のソース <body> <form name="nform1" method="POST" action="./kaitou1.php" enctype="text/plain"> <p>問1</p> <p> (1)<input type="text" name="kaitouran11" size="20"> (2)<input type="text" name="kaitouran12" size="20"> (3)<input type="text" name="kaitouran13" size="20"> (4)<input type="text" name="kaitouran14" size="20"> </p> </form> <form name="nform2" method="POST" action="./kaitou1.php" enctype="text/plain"> <p>問2</p> <p> (1)<input type="text" name="kaitouran21" size="20"> (2)<input type="text" name="kaitouran22" size="20"> (3)<input type="text" name="kaitouran23" size="20"> (4)<input type="text" name="kaitouran24" size="20"> </p> </form> <form name="nform3" method="POST" action="./kaitou1.php" enctype="text/plain"> <p>問3</p> <p> (1)<input type="text" name="kaitouran31" size="20"> (2)<input type="text" name="kaitouran32" size="20"> (3)<input type="text" name="kaitouran33" size="20"> (4)<input type="text" name="kaitouran34" size="20"> </p> </form> <input type="button" value="送信" onClick="send()"> </body> php側のソース <body> <p>問1</p> <p>(1)<?php print(htmlspecialchars($_POST['kaitouran11'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran12'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran13'], ENT_QUOTES, 'UTF-8')); ?> (4)<?php print(htmlspecialchars($_POST['kaitouran14'], ENT_QUOTES, 'UTF-8')); ?> </p> <p>問2</p> <p>(1)<?php print(htmlspecialchars($_POST['kaitouran21'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran22'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran23'], ENT_QUOTES, 'UTF-8')); ?> (4)<?php print(htmlspecialchars($_POST['kaitouran24'], ENT_QUOTES, 'UTF-8')); ?> </p> <p>問3</p> <p>(1)<?php print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran32'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran33'], ENT_QUOTES, 'UTF-8')); ?> (4)<?php print(htmlspecialchars($_POST['kaitouran34'], ENT_QUOTES, 'UTF-8')); ?> </p> </body>

    • 締切済み
    • PHP
  • 変数 php

    スーパーグローバル変数はそのままでは文字列扱いにならないのでしょうか? 下記のように書くと 「htmlspecialchars()は第一引数は文字列である必要があります。」と出てしまいます。 str_replace("たいとる",htmlspecialchars($_POST['title'] ,ENT_QUOTES),$files); 以下の構文(sql)は動きませんでした。 $stmt="select * from $_POST['title'] "; 両方とも、変数に置き換えて再度書き直すと正常に動きました。 例、 $title=$_POST['title']; str_replace("たいとる",htmlspecialchars($title,ENT_QUOTES),$files);

    • ベストアンサー
    • PHP
  • POSTされたデータをそのまま変数名にするような・・・

    お世話になります。 タイトルのとおりなのですが、POSTされたデータをそのまま変数名にするような便利な方法はないでしょうか。 $name=htmlspecialchars($_POST["name"], ENT_QUOTES, $code); $email=htmlspecialchars($_POST["email"], ENT_QUOTES, $code); ・ ・ ・ をたくさんあるので簡単にできないかなーと思ったんですが、何か良い方法がありましたら教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP CSV 出力

    失礼します。 現在PHPで指定したパスに置いてあるCSVを出力したいのですが、 CSVは出力できているのですが、HTMLが先頭に入ってしまいます。 htmlファイルに設置したボタンに対して phpファイルで処理をしています。 どこかおかしい部分があればご教授頂きたいです。 HTMLファイル <?php $self = $_SERVER["SCRIPT_NAME"]; ?> <form method='POST' action='<?php $self ?>'> <input type='submit' value='CSV出力' name='get_csv'> </form> PHPファイル function This_Month(){ $filepath = 'hoge.csv'; //ダウンロードしたいファイルパス $filename = 'test.csv'; //ダウンロードした際のファイル名 if(!file_exists($filepath)){ die("Error:File(".$filepath.") does not exist"); } //オープンできるか確認 if(!($fp = fopen($filepath,"r"))) { die("Error:Cannot open the file(".$filepath.")"); } fclose($fp); //ファイルサイズの確認 if(($content_length = filesize($filepath)) == 0){ die("Error:File size is 0.(".$filepath.")"); } //ファイルの処理方法 header('Content-Disposition: attachement; filename="'.$filename.'"'); //ファイルタイプ指定 header('Content-Type: application/octet-stream'); header('Content-Transfer-Encoding:binary'); //ファイルサイズ header('Content-Length: '.filesize($filepath)); mb_convert_encoding($filepath,'utf-8','shift-jis'); readfile($filepath); exit(); } //ボタンに合わせて条件を変えていく if(isset($_POST["get_csv"])){ //ユーザーから来たデータをエスケープする $csv_output = htmlspecialchars($_POST["get_csv"], ENT_QUOTES, "UTF-8"); switch ($csv_output) { case "CSV出力": ”This_Month();  break; default: echo "エラー"; exit; } }

    • ベストアンサー
    • PHP
  • PHP 送信されたフォームについて

    HTMLから送信されたフォームがうまくうけとれないので質問させていただきます。 HTML側でチェックボックスを用いてphp側に送ったところうまく結果が反映されません。 HTML側で以下のソースを書き <input type="checkbox" name="kaitouran321" value="a">a <input type="checkbox" name="kaitouran322" value="b">b <input type="checkbox" name="kaitouran323" value="c">c php側で <?php print(htmlspecialchars($_POST['kaitouran321'], ENT_QUOTES, 'UTF-8')); ?> <?php print(htmlspecialchars($_POST['kaitouran322'], ENT_QUOTES, 'UTF-8')); ?> <?php print(htmlspecialchars($_POST['kaitouran323'], ENT_QUOTES, 'UTF-8')); ?> および <?php if($_POST['kaitouran321'] == 'a' && $_POST['kaitouran322'] == 'b' && $_POST['kaitouran323'] == 'c') ?> $i++; と書きました。htmlキャラはしっかり受け取ってくれるのですが、if文で書いた方は反応してくれません(iが+1されない)。選択肢がひとつの時、if文は反応するので条件の書き方がおかしいのでしょうか? 回答お願いします。

    • 締切済み
    • PHP
  • CSVを使ったパスワード変更処理について

    CSVを使ったパスワード変更処理について 以下のソースをどういじれば変更が可能か申し訳御座いませんが、 どなたか分かるかたご教授願いますでしょうか? $post = $_POST; $org_file=fopen("logindata.csv","r"); $tmp_file=fopen("guest.tmp","w+"); flock($org_file,LOCK_SH); flock($tmp_file,LOCK_EX); $line =date("Ymd-H:i:s").","; $line.=$_POST['mail'].","; $line.=$_POST['pw2'].","; fputs($tmp_file,$line."\n"); while($row=fgets($org_file,1024)){ if($temp[1]==$post['mail'] && $temp[2]==$post['pw']){ } else{ fputs($tmp_file,$row); } } flock($tmp_file,LOCK_UN); flock($org_file,LOCK_UN); fclose($tmp_file); fclose($org_file); unlink("logindata.csv"); rename("guest.tmp","logindata.csv"); echo "パスワード変更しました。"; exit;

    • 締切済み
    • PHP
  • PHPでCSVデーターの表示について

    PHPでCSVデーターの表示について 教えてください。PHPでCSVデーターを表示したいのですが一覧表示ではなくテキストをクリックして特定のデーターを表示させようと考えております。 CSVデーターの中身(CSV.csv) 一郎,男,20歳 二郎,男,22歳 一子,女,24歳 二子,女,26歳 --data.php-- <?php $csvFile = 'CSV.csv'; $tempCSV = file_get_contents($csvFile); $tempCSV = mb_convert_encoding($tempCSV,'utf-8','SJIS-win'); $fp = tmpfile(); fwrite($fp,$tempCSV); rewind($fp); setlocale(LC_ALL,'ja_JP.UTF-8'); while ($arr = fgetcsv($fp,1024)) { list ($name,$sex,$age) = $arr; echo '<p>',<a href="01.php">' . $name . '</a>','</p>'; } fclose($fp); function h($string) { return htmlspecialchars($string, ENT_QUOTES); } ?> 一郎をクリックしたら一郎のデーターだけを(01.php)で表示させたいのですがよく分りません。 01.phpは今のところ一覧表示されるものを置いてあります。 --01.php-- <?php $csvFile = 'CSV.csv'; $tempCSV = file_get_contents($csvFile); $tempCSV = mb_convert_encoding($tempCSV,'utf-8','SJIS-win'); $fp = tmpfile(); fwrite($fp,$tempCSV); rewind($fp); setlocale(LC_ALL,'ja_JP.UTF-8'); while ($arr = fgetcsv($fp,1024)) { list ($name,$sex,$age) = $arr; echo '<table border=1>'; echo '<tr>'; echo '<td>','名前','</td>'; echo '<td>'.$name.'</td>'; echo '</tr>'; echo '<tr>'; echo '<td>','性別','</td>'; echo '<td>'.sex.'</td>'; echo '</tr>'; echo '<tr>'; echo '<td>','年齢','</td>'; echo '<td>'.$age.'</td>'; echo '</tr>'; echo '</table>'; } fclose($fp); function h($string) { return htmlspecialchars($string, ENT_QUOTES); } ?> 本を読んだり、ググったりしてヒントになる様な物を探しているのですが中々見つかりません。 初心者で申し訳ありませんが、どなたか教えていただけないでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう