• ベストアンサー

PHPでcsvファイルデータ内の一行を修正したい

PHP4.3とcsvカンマ区切りのファイルデーターによる簡易会員サイトをつくっています。 複数行にわたってカンマ区切りのデーターがあり、その中のある一行の配列を修正したいのです。 Perlだとpushを使って配列に入れファイルに書き込めばいいのですがPHPではどのようにすればいいのでしょうか? ちなみに以下のように試みているのですがだめなのです。join(): Bad arguments.のエラーがでます。 Perl的なやり方でやってみたのですが。。。 while(($line = fgets($fp))){ list($DATE,$ID,$POINT,$NAME,$EMAIL,$TEL,$PREF,$SEX,$AGE,$blood,$body,$length,$type,$why,$PASS,$PROF,$BOX,$DAY_LIMIT,$A_ID,$MILE_POINT,)= split(",",$line); if($EMAIL == $_POST{"EMAIL"} && $PASS == $_POST{"PASS"}){ $HIT=1; $NOWPOINT=$POINT+$buypoint; $newline= "$DATE,$ID,$NOWPOINT,$NAME,$EMAIL,$TEL,$PREF,$SEX,$AGE,$blood,$body,$length,$type,$why,$PASS,$PROF,$BOX,$DAY_LIMIT,$A_ID,$MILE_POINT,\n"; $NEWSTOCK=join("\n",$newline); } else{ $NEWSTOCK=join("",$line); } } どなたかご教授いただけましたら幸いです。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>array_pushを使うほうがいいのでしょうか? >それともjoinを使うべきなのでしょうか? 望むようにされたらいいと思います。 join の結果は 配列ではなく、文字列です。 質問文の例で言えば $newline を作成した段階で、カンマ区切りの一行分の更新されたデータを作成しているのですから それをあらためてjoin する必要はないように思います。 それを、配列に溜め込んでいって、あとでまとめて出力するのであれば、array_push していけばいいと思います。 PHPの場合、 $array[]="1line"; $array[]="2line"; のように単に添字を指定しないで代入を繰り返せば $array[0]="1line"; $array[1]="1line"; のようになるので、その意味では取り立ててarray_push を使う必要はありません(参考URLにもそう書いてあります) 例えば、 … $NEWSTOCK[]=$newline; } else{ $NEWSTOCK[]=$line; … とでもすればいいんじゃないでしょうか

volvo850love
質問者

お礼

ありがとうございました。 参考にします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2
全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

join の第2引数は配列です。 http://jp.php.net/manual/ja/function.implode.php php での配列へのpush は、array_push です。 http://jp.php.net/manual/ja/function.array-push.php ファイル全体を配列に読み込むには file関数 を使います http://jp.php.net/manual/ja/function.file.php

volvo850love
質問者

お礼

join の第2引数は配列です。 http://jp.php.net/manual/ja/function.implode.php php での配列へのpush は、array_push です。 http://jp.php.net/manual/ja/function.array-push.php array_pushを使うほうがいいのでしょうか? それともjoinをつかうべきなのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • foreachで無限ループ?

    PHPを使って配列をループしています。 以下のようにifとelseをつかってまわすとフリーズしてしまいます。 無限ループになっているのでしょうか? この回避方法をどなたかご教授いただきたくお願いします。 foreach ($lines as $line) { list($DATE,$ID,$POINT,$NAME,$EMAIL,$TEL,$PREF,$SEX,$AGE,$blood,$body,$length,$type,$why,$PASS,$PROF,$BOX,$DAY_LIMIT,$A_ID,$MILE_POINT,)= split(",",$line); if($EMAIL == $_POST{"EMAIL"} && $PASS == $_POST{"PASS"}){print "$line<br>"; $NEWSTOCK .= "$DATE,$ID,$NOWPOINT,$NAME,$EMAIL,$TEL,$PREF,$SEX,$AGE,$blood,$body,$length,$type,$why,$PASS,$PROF,$BOX,$DAY_LIMIT,$A_ID,$MILE_POINT,"; }else{ print "$line<br>"; } }

    • ベストアンサー
    • PHP
  • アクセスではうまく行くのにMYSQLではうまくいきません。

    いつもありがとうございます。初心者です。どうか教えて下さい。 テーブル area フィールド area_id, area_name テーブル pref フィールド pref_id, pref_name, area_id テーブル city フィールド city_id, city_name, pref_id というように3つのテーブルがあり、それぞれarea_id,pref_id,city_id を主キーにして 結合して表示したいのですが、エラーになります。 SQL文は次のように書きました。 SELECT area.area_id, area.area_name, pref.pref_id, pref.ken_name, city.city_id, city.pref_id FROM area INNER JOIN (pref INNER JOIN city ON pref.pref_id = city.pref_id) ON area.area_id = pref.area_id するとエラーメッセージで #1064 - You have an error in your SQL syntax near '(pref INNER JOIN city ON pref.pref_id = city.pref_id) ON area.area_id = pref.are' at line 2 のように表示されます。 マイクロソフトのアクセスですると問題なく表示されるのですが、 MYSQLではうまく行きません。どうか御指導をお願い致します。

    • ベストアンサー
    • MySQL
  • phpでmysqlからの呼び出しについての質問です。

    phpでmysqlからの呼び出しについての質問です。 現在mysqlから下記のように値を呼び出し、age=10の条件にあてはまるものだけを3つまで表示させたいと思っています。 $query = "SELECT id, name, birth, age FROM log WHERE age=10 LIMIT 0 , 3"; $hoge = $db->rowset_assoc($query) or $db->error("Query failed $query".__FILE__.__LINE__); foreach($hoge as $row) { $id= $row['id']; $name= $row['name']; $birth= $row['birth']; } $hoge = array( array("$id","$name","$birth"), array("$id","$name","$birth"), array("$id","$name","$birth"), ); 更新の度にシャッフルさせたいのでarrayを使用しているのですが、 これだと3つとも同じ数値が出てきてしまい困っています。 それぞれの値を取り出し、arrayに入れるにはどのようにすれば良いのでしょうか。 宜しくお願い致します。 大文字小文字の使い方については参考資料そのままに作成しましたので おかしい部分があるかもしれません。

    • ベストアンサー
    • PHP
  • php ログインでセッションが切れる

    PHPでログインする機能があります。 ログインして操作をしていると問題はないのですが、数分(測っていないのですが5分~10分)操作をせず放置しているとログインが切れてしまいます。 セッションの有効期限は24時間にしています。 確認してもセッションの有効期限はログインを行って24時間にちゃんとなっています。 if ($_SERVER['REQUEST_METHOD'] === 'POST') { try { // POSTで受け取ったパラメータを変数として展開 extract(filter_struct_utf8(INPUT_POST, array( 'email' => FILTER_STRUCT_FULL_TRIM, // トリミング 'pass' => '', 'token' => '', ))); // トークンをチェック Token::check($token); // IDをセッションに取得 $_SESSION['id'] = DB::connect()->userlogin($email, $pass); // セッションハイジャック対策 session_regenerate_id(true); // リダイレクト redirect(); } catch (Exception $e) { $errors = exception_to_array($e); } } 『userlogin』の部分 public function userlogin($email, $pass) { // 例外初期化 $e = null; // メールアドレスチェック if ($mail === '') { $e = e('メールアドレスが入力されていません。', $e); } // パスワードチェック if ($password === '') { $e = e('パスワードが入力されていません', $e); } // 1つでも例外が発生していればスローする if ($e) { throw $e; } // プリペアドステートメントを生成 $stmt = $this->pdo->prepare(implode(' ', array( 'SELECT `id`, `pass`', 'FROM `users`', 'WHERE `email` = ?', 'LIMIT 1', ))); // 値をバインドして実行 $stmt->execute(array($email)); // 見つかったかどうかチェック if (!$stmt->rowCount()) { throw e('そのメールアドレスは登録されていません。'); } // パスワード照合 $row = $stmt->fetch(); if ($row['pass'] !== password_hash($pass)) { throw e('パスワードが違います。'); } // IDを返す return (int)$row['id']; } ログイン処理に問題があるのでしょうか? それともサーバー側の設定(php.ini)なども何か設定を行ったほうがよいのでしょうか? 確認すべき点などございましたらアドバイスいただけませんでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 改行すると配列の置換ができない。

    下のような感じで配列の置換をしているんですが、フォームから、改行付のテキストを送るとなぜか書き込む事ができません。誰か助けてください(>_; newtokkiを送っています。 &ReadParse(*in); $newtokki=$in{'newtokki'}; $newtokki=~ s/\r\n/<br>/g; if($in{'mode'} eq "save"){ &save; exit; } sub save { open(FILE, "< ../../home/recdata/data.dat"); @allbody=<FILE>; close(FILE); foreach $line (@allbody){ if ($line =~ /$id/){ if ($line =~ /$mail/){ ($tm,$date1,$date2,$ip,$name1,$name2,$furi1,$furi2,$add1,$add2,$add3,$tel1,$tel2,$tel3,$other1,$other2,$other3,$mail,$age1,$age2,$age3,$sex,$school,$license,$cname,$cy01,$cy02,$cy03,$cy04,$job,$cscale,$cform,$cpost,$cjob,$money,$changetime,$ap01,$ap02,$ap03,$wishmessage,$jobselect,$pr,$point,$keika,$tokki) = split(/\,/,$line); $line =~ s/$explain/$newexplain/; $line =~ s/$point/$newpoint/; $line =~ s/$keika/$newkeika/; $line =~ s/$tokki/$newtokki\n/; } } } open(FILE, "> ../../home/recdata/data.dat"); print FILE @allbody; close(FILE);

  • ec-cubeのphp内の記述

    初めて投函させて頂きます。 PHPに詳しい方、ぜひ教えてください。 私はec-cubeコミュニティーサイトで質問をしながら、現在サイトを構築中です。しかし、スレ立てしてなかなか返信がなかったので、こちらでお伺いさせて頂ければと思いました。 $col = <<< __EOS__ T1.product_id, T1.stock, T1.stock_unlimited, T1.sale_limit, T1.price01, T1.price02, T1.point_rate, T1.product_code, T1.product_class_id, T1.del_flg, T1.product_type_id, T1.down_filename, T1.down_realfilename, T2.class_combination_id, T2.parent_class_combination_id, T2.classcategory_id, T2.level, T3.name AS classcategory_name, T3.rank, T4.name AS class_name, T4.class_id __EOS__; $table = <<< __EOS__ dtb_products_class T1 LEFT JOIN dtb_class_combination T2 ON T1.class_combination_id = T2.class_combination_id LEFT JOIN dtb_classcategory T3 ON T2.classcategory_id = T3.classcategory_id LEFT JOIN dtb_class T4 ON T3.class_id = T4.class_id __EOS__; こういうsql文があり、例えば新しいparent_class_combination_id2というものを追加したい場合、どのように記述を変えたらいいのでしょうか。 自分なりに考えてみましたが、T2以下をそっくりコピーし、parent_class_combination_idを、~~id2に変更すればいいのでしょうか。 また、なにか必要なものがありましたら言って頂ければ準備致します。 どうかよろしくお願い致します。

    • ベストアンサー
    • PHP
  • AndroidアプリからMySQLのデータ取得

    こんにちは。 今、androidの勉強をしながらアプリを作成しています。 androidやjavaの知識レベルは、初心者レベルです。 タイトルにもあるように、AndroidアプリからMySQLのデータ取得方法がわかりません。 今現在、eclipse内のエミュレータではデータの取得と表示はできています。 しかしながら、実機でテストをすると、データが取れていません。 なにぶん初心者なので、どこを見れば良いか、何を設定すれば好いか、いきあたりばったりでテストしています。皆様のアドバイス宜しくお願いします。 【開発環境】 windowsXP eclipse3.5 mysql5.1(ユーザー、IP、ポート、データベース、テーブルなどは設定済み) jdbc5.1(構成パスにJDBCは追加済み) 【ソース一部抜粋】 public class Prof extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Connection conn = null; Statement stmt = null; ResultSet rs = null; setContentView(R.layout.prof); TextView set_NameLabel = (TextView) findViewById(R.id.set_nameLabel); TextView set_oldLabel = (TextView) findViewById(R.id.set_oldLabel); TextView set_jobLabel = (TextView) findViewById(R.id.set_jobLabel); TextView set_addLabel = (TextView) findViewById(R.id.set_addLabel); TextView set_homeLabel = (TextView) findViewById(R.id.set_homeLabel); TextView set_hobbyLabel = (TextView) findViewById(R.id.set_hobbyLabel); TextView set_comentLabel = (TextView) findViewById(R.id.set_comentLabel); try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://10.0.2.2:3306/prof_db","test_01","test_pass"); stmt = conn.createStatement(); rs = stmt.executeQuery("SELECT * FROM my_prof"); rs.next(); set_NameLabel.setText(rs.getString("prof_name")); set_oldLabel.setText(rs.getString("prof_age")); set_jobLabel.setText(rs.getString("prof_occupation")); set_addLabel.setText(rs.getString("prof_address")); set_homeLabel.setText(rs.getString("prof_home")); set_hobbyLabel.setText(rs.getString("prof_hobby")); set_comentLabel.setText(rs.getString("prof_comment")); conn.close(); rs.close(); stmt.close(); } catch (ClassNotFoundException e){ e.printStackTrace(); } catch ( SQLException e) { e.printStackTrace(); }catch (Exception e){ e.printStackTrace(); } } } 何かしらのアドバイス、解決方法、参考HPなど、ご教授宜しくお願いします。

  • テーブル結合の条件指定について

    以下のようなテーブルが3つある場合に2つのテーブルにあるポイントを合計して取得したいと思っています。 ただ、外部結合しているtable_cに条件を与えるとうまく取得できません。 table_cにcdがある場合は条件を指定し、 ない場合は条件を指定しないようにするにはどうすればいいのでしょうか。 【table_a】 id    name ------------------ a1    aaa a2    bbb a3    ccc 【table_b】 b_id     a_id   user_id    point --------------------------------- b1     a1    00001    5 b2     a1    00002    2 b3     a3    00007    10 b4     a2    00356    10 【table_c】 c_id    user_id    cd     bonus_point ------------------------------------------------ c1     00001    cd_1    1 c2     00007    cd_2    1 c3     00356    cd_1    1 SELECT table_b.user_id as user_id , (ifnull(table_b.age_count) + ifnull(table_c.bonus_point, 0)) as total_point FROM table_a INNER JOIN table_b ON (table_b.a_id=table_a.a_id)    LEFT JOIN table_c ON (table_c.user_id=table_b.user_id) WHERE table_c.cd = 'cd_1' ORDER BY total_point desc ■結果 user_id    total_point ----------------------------- 00356     11 00001      6 ■求めたい結果 user_id    total_point ----------------------------- 00356     11 00001      6 00002     2 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • CSVファイルのデータをphpでデータ修正・追加をするには

    現在CSVで作ったファイルを表示させています。CSVデータの修正を簡単WEB上でできるようにしたいと思っていますがどのような方法をとったらよいかわかりません。どなたかヒントで結構ですのでご教授ください。

    • ベストアンサー
    • PHP
  • 掲示板CGIで古い順ではなく新着順で表示させたい

    【CGI名】簡易データベース 【配布先】http://www.rescue.ne.jp/cgi/database/(cgirescue) 仕様では古い順に表示されるのですが、 それを新着順で表示したいのです。 以下の部分を編集すれば良いと思うのですが、どなたかお願いしますm(__)m もし、この部分以外の変更が必要な場合は、大変ご面倒ですが、 上記サイトからダウンロードお願いします。 宜しくお願いします。 foreach $data (@NEW) { ($d,$DATE,$NAME,$EMAIL,$SEX,$AGE,$HANDLE,$PREF,$REM) = split(/\,/,$data); print "<tr>\n"; print "<td nowrap>$DATE</td>\n"; print "<td nowrap>$NAME</td>\n"; print "<td nowrap><a href=\"mailto:$EMAIL\">$EMAIL</a></td>\n"; print "<td nowrap><center>$SEX</center></td>\n"; print "<tdnowrap><center>$AGE</center></td>\n"; print "<td nowrap>$HANDLE</td>\n"; print "<td nowrap>$PREF</td>\n"; print "<td>$REM</td>\n"; print "</tr>\n"; }

    • ベストアンサー
    • CGI