質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

13059閲覧

ファイルの書き込みでデータの一部分だけ上書きする方法(PHP)

mochio_o7

総合スコア17

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/08/31 00:56

編集2017/09/21 05:14

こんにちは。

今回質問したいのは、題名通り、PHPにてファイルの書き込みでデータの一部だけを上書きする方法です。

sample.txtというファイルがあるとします。
1<>あき<>あいうえお<>2017年08月31日 09:22:10
2<>まみ<>かきくけこ<>2017年08月31日 09:23:14
3<>もも<>さしすせそ<>2017年08月31日 09:23:23
4<>まみ<>たちつてと<>2017年08月31日 09:42:42
5<>さわ<>なにぬねの<>2017年08月31日 09:43:46
6<>みき<>はひふへほ<>2017年08月31日 09:43:57

これの2行目だけ変えたい、上書きしたいといった場合どんな関数を使ったらよいのかわかりません、

一応、自分で調べて行ってみた内容としましては、fseekでファイルポインタを移動する。
コードとしては、以下のようにしまいた。
ちなみに、簡易掲示板を作成中です。
また、上書きしたい番号を入力する欄を作っていて、その上書きしたい番号とexplodeで取得した投稿番号とを比較して、イコール時に送信された値を上書きするという形です。

また、1行ずつfgetsで読み込み、ファイルにfwriteで書き出すといったこともしてみましたが、できませんでした、

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2017/08/31 01:09 編集

「掲示板編集機能」についての質問をされていて(https://teratail.com/questions/88967 など)調べてみるとのことでしたが、調べてみた結果分からなかったということでしょうか?「どこまで理解している」「どのような内容を調べた」を書かないと回答が最初からとなってしまうかもしれませんので、これまでの関連質問を引き合いに出しつつ少し経緯も質問本文に書かれたほうが良いかと思います。
mochio_o7

2017/08/31 01:13

アドバイスありがとござます。自分で調べ、何度か試したところやはりうまくいかず質問することにしました。本文に追加します!!
m.ts10806

2017/08/31 01:51

括弧の開始と終了が分かりにくくなるため(よく閉じ忘れでシンタックスエラーがおきる)、インデントはきちんとつけられることを強く推奨します。自動でフォーマットしてくれるエディターもあるのでご活用ください。
mochio_o7

2017/08/31 02:00

ありがとうございます。エディター探してみます!!
guest

回答3

0

いちおう、fopen()でファイルハンドルを取得→fseek()でポインタを移動→fwrite()でポインタ位置に書き込み、のようにすることで、「途中だけ上書き」ということはできます。

ただ、よほど大きなテキストでなければ「全部読み込み→PHPで目的の部分を書き換え→全部書き出し」のほうがプログラム的にも楽だと思います。

さらに、このような一定の構造を持ったデータは、(規模が大きくなるような場合は特に)データベースに収めたほうがいいかもしれません。SQLiteであればサーバを用意する必要もないので手軽に始められます。

投稿2017/08/31 01:07

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mochio_o7

2017/08/31 01:25

回答ありがとうございます。 データベースに収めることもできるのですね!SQLiteは初めて聞いたので調べてみたいと思います。
guest

0

ベストアンサー

最近このテキストフォーマットと同様の質問が多数寄せられていますが、学校か何かの課題なんでしょうかね。

質問の件ですが、fseekしてfwriteすれば確かに上書きは可能です。
可能ですが、その行とまったく同じ長さのデータを書き込まなければいけません。

例えば、以下のデータが格納されているとして、

1<>あき<>あいうえお<>2017年08月31日 09:22:10
2<>まみ<>かきくけこ<>2017年08月31日 09:23:14
3<>もも<>さしすせそ<>2017年08月31日 09:23:23

2行目を元のデータよりも短い次のようなデータで書こうとすると、

2<>まみ<>がぎぐ<>2017年08月31日 09:23:14

恐らくこうなってしまうでしょう。

1<>あき<>あいうえお<>2017年08月31日 09:22:10
2<>まみ<>がぎぐ<>2017年08月31日 09:23:143:14 ← 元のデータが文末に残る
3<>もも<>さしすせそ<>2017年08月31日 09:23:23

逆に長いデータの場合

2<>まみ<>がぎぐげごがぎ<>2017年08月31日 09:23:14

1<>あき<>あいうえお<>2017年08月31日 09:22:10
2<>まみ<>がぎぐげごがぎ<>2017年08月31日 09:23:14
も<>さしすせそ<>2017年08月31日 09:23:23 ← 次行の先頭データが消える

といわけで、可変長のテキストファイルを対象にした場合、fseek&fwriteでの上書き処理はおすすめできません。
一般的には、別ファイルに新しいファイルとして書きだしたあと、元のファイルを削除、そして新しいファイルを元のファイルにリネームという流れになります。
ただし、PHPの場合、file関数などでファイルの中身を全て変数に取り込むことができるので、変数を対象に更新した後、元のファイルに丸ごと上書きという処理も可能です。
その場合、書き出しに失敗するとデータを全て失うというリスクがありますが、学校の課題であればそこまで言及されないかもしれません。

投稿2017/08/31 01:39

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

トリッキーなやり方ですが、これでも同じことができます。
fopen(), fwrite(), fclose()を勉強する課題でしたらよろしくないです。

php

1$filePath = '/path/to/kadai.txt'; 2 3$name = ''; 4$comment = ''; 5$time = strftime('%Y年%m月%d %H:%M:%S'); //ローケルを考慮 6 7!empty($_POST['name']) && $name = $_POST['name']; 8!empty($_POST['comment']) && $comment = $_POST['comment']; 9 10if (file_exists($filePath)) { 11 $text = file_get_contents($filePath); 12 $lines = explode("\n", $text); 13 14 // 2行目:$lines[1] 上書き 15 $lines[1] = '2<>'.$name.'<>'.$comment.'<>'.$time; 16 17 // 全文字列書き込み 18 file_put_contents($filePath, implode("\n", $lines)); 19}

投稿2017/08/31 06:10

Tomak

総合スコア1652

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問