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

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

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

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

Q&A

解決済

2回答

806閲覧

簡易掲示板の編集フォームで、一行だけ差し替える方法がわかりません。

KZKKZ_ZKY

総合スコア5

PHP

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

0グッド

0クリップ

投稿2019/08/26 07:53

編集フォームで入力された数字と、投稿番号が一致したときに差し替えをしたいです。
過去の質問は読み漁りましたが、解決に至らなかったので何方か助言していただけると助かります。

PHP

1<!DOCTYPE html> 2<html lang="en" dir="ltr"> 3 <head> 4 <meta charset="utf-8"> 5 <title>簡易掲示板</title> 6 </head> 7 <body> 8 9 <!--取り出し--> 10 <?php 11 $filename = "mission_3-1.txt"; 12 13 if(!empty($_POST["edit"])){ 14 15 $editline = file($filename); 16 $edit = $_POST["edit"]; 17 18 foreach($editline as $ccc){ 19 $data3 = explode(" ",$ccc); 20 if($data3[0] == $edit){ 21 $namae_e = $data3[1]; 22 $message_e = $data3[2]; 23 } 24 } 25 } 26 ?> 27 28 <!--投稿フォーム--> 29 <form action="mission_3-4.php" method="post"> 30 31 <!--編集番号--> 32 <input type="text" name="number" value="<?php 33 if(!empty($_POST["edit"])){ 34 echo $edit; 35 } ?>"> 36 37 <!--上書き--> 38 <?php 39 $filename = "mission_3-1.txt"; 40 41 if(!empty($_POST["edit"])){ 42 43 $editline2 = file($filename); 44 $edit2 = $_POST["edit"]; 45 $fp5 = fopen($filename,"w"); 46 47 foreach($editline2 as $ddd){ 48 $data4 = explode(" ",$ddd); 49 50 if($data4[0] == $edit2){ 51 52 $namae_e = $data4[1]; 53 $message_e = $data4[2]; 54 55 }else{ 56 fwrite( $fp5 , $ddd ); 57 } 58 } 59 fclose( $fp5 ); 60 } 61 ?> 62 63 <p>名前: 64 <input type="text" name="name" value="<?php 65 if(!empty($_POST["edit"])){ 66 echo $namae_e; 67 } ?>"></p> 68 69 <p>投稿内容:<textarea name="comment"><?php if(!empty($_POST["edit"])){ 70 echo $message_e; 71 }?></textarea></p> 72 73 <button type = "submit">送信</button> 74 75 </form> 76 <br> 77 78 <!--削除フォーム--> 79 <form action="mission_3-4.php" method="post"> 80 <p>投稿番号:<input type="text" name="delete"></p> 81 <button type = "submit">削除</button> 82 </form> 83 <br> 84 85 <!--編集フォーム--> 86 <form action="mission_3-4.php" method="post"> 87 <p>投稿番号:<input type="text" name="edit"></p> 88 <button type = "submit">編集</button> 89 </form> 90 91 <?php 92 93 $date = date("Y/m/d H:i:s"); 94 $filename = "mission_3-1.txt"; 95 //$count = count( file($filename) ); 96 97 if(!empty($_POST["name"])&&!empty($_POST["comment"])&&empty($_POST["edit"])){ 98 //投稿機能 99 100 $namae = $_POST["name"]; 101 $message = $_POST["comment"]; 102 103 $toukou = (sizeof(file($filename))+1)."<>".$namae."<>".$message."<>".$date; 104 105 $fp = fopen($filename, "a" ); 106 $keijiban = explode("<>",$toukou); 107 $string = implode(" ",$keijiban); 108 109 fwrite( $fp , "$string\r\n" ); 110 fclose( $fp ); 111 112 }elseif(!empty($_POST["delete"])){ 113 //削除機能 114 115 $delline = file($filename); 116 $delete = $_POST["delete"]; 117 $fp2 = fopen($filename,"w"); 118 fclose( $fp2 ); 119 $fp3 = fopen($filename,"a"); 120 121 if(!empty($filename)){ 122 foreach($delline as $bbb){ 123 $data2 = explode(" ",$bbb); 124 if($data2[0] !== $delete){ 125 fwrite( $fp3 , $bbb ); 126 } 127 } 128 } 129 fclose( $fp3 ); 130 } 131 132 //表示機能 133 $ret_array = file($filename); 134 foreach($ret_array as $aaa){ 135 echo $aaa; 136 echo "<br>"; 137 } 138 139 ?> 140 141 </body> 142 143</html>

僕が考えでは、この部分で一行だけ差し替えようとしています。↓

PHP

1<!--上書き--> 2 <?php 3 $filename = "mission_3-1.txt"; 4 5 if(!empty($_POST["edit"])){ 6 7 $editline2 = file($filename); 8 $edit2 = $_POST["edit"]; 9 $fp5 = fopen($filename,"w"); 10 11 foreach($editline2 as $ddd){ 12 $data4 = explode(" ",$ddd); 13 14 if($data4[0] == $edit2){ 15 16 $namae_e = $data4[1]; 17 $message_e = $data4[2]; 18 19 }else{ 20 fwrite( $fp5 , $ddd ); 21 } 22 } 23 fclose( $fp5 ); 24 } 25 ?>

編集フォームで数字を入力されたときに、同じ投稿番号の名前と内容を投稿フォームに表示させることは成功しています。

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

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

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

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

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

guest

回答2

0

  • データを送る
  • ロックする
  • 全体を読んで変数(or配列)に受ける
  • 合致するかチェック
  • 合致したら当該箇所を書き換える/合致しないなら最後に追加
  • 全体を書き換える
  • ロックをはずす

投稿2019/08/26 07:56

yambejp

総合スコア114829

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

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

KZKKZ_ZKY

2019/08/26 08:17

すみません、ロックするとはどういうことでしょうか…?
yambejp

2019/08/26 08:19

ファイル編集するときはロック処理が必須です Aさんが読んで編集して書き込む途中に Bさんが読んで編集するとAさんの書き込みはなくなってしまいます https://www.php.net/manual/ja/function.flock.php
KZKKZ_ZKY

2019/08/26 09:54

マニュアルまで送って頂きありがとうございます。 ロックの意味理解できました。 参考にしてやってみます。
guest

0

ベストアンサー

text ファイルベースの掲示板の作り方は以下を参考にすると良いですよ。
【PHP初心者向け】セキュアな掲示板を最小構成から作る

本件のスクリプトで気になる箇所を羅列しておきますね。

・empty の利用には注意が必要。
PHP 型の比較表
0 の場合、意図した動作にならないです。

$editline2 = file($filename)$fp5 = fopen($filename,"w")
一度読み込んだ後、再度オープンしてます。排他制御を考えてうまく処理しないといけないです。

・foreach($editline2 as $ddd) → if → fwrite
なんとなくやりたいことは分かりますが、意図した動作になっていないです。
ファイルベースの処理の場合、全体を読み込む→読み込んだデータの該当箇所を差し替える→全体を書き込む。といった処理をするのが一般的です。

下2つは、yambejp さんとかぶってますが参考まで^^

投稿2019/08/26 09:46

編集2019/08/26 09:54
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

KZKKZ_ZKY

2019/08/26 09:50

ご丁寧にありがとうございます。 参考にしてやってみます!
退会済みユーザー

退会済みユーザー

2019/08/26 12:29 編集

ファイルベースの処理は、web サービスと相性が良くないので、適当に排他処理学んだらさっさとデータベースで処理する方向に切り替えると良いですよ。 *正直、php でファイルを扱うケースは稀ですw
KZKKZ_ZKY

2019/08/26 12:27

一応この作業を終えた次の課題が、データベースとの連携になっています!
KZKKZ_ZKY

2019/08/27 14:26

もし答えていただけたら嬉しいのですが、『読み込んだデータの該当箇所を差し替える』の方法を教えていただけないでしょうか。
退会済みユーザー

退会済みユーザー

2019/08/27 17:55

yambejp さんの回答がまんまそれですよ。 ・合致するかチェック ・合致したら当該箇所を書き換える/合致しないなら最後に追加 が、質問箇所に該当します。 あまりきれいな実装ではないですが、以下のようにすると理解しやすいコードになるとか。 ・配列としてデータを持っているなら foreach でループ ・ループ内で、条件と合致するか確認→合致箇所のインデックスを変数に保管。 ・ループ終了後、合致箇所があれば、インデックスを元にデータを差し替え ・無ければ、データの最後に追加
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問