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

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

ただいまの
回答率

88.92%

編集機能で差し替えをしたいです。

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,654

kaity

score 19

```php

<html> <head> <meta charset="utf-8">   <title>○○</title>  </head>

 <body>

 <?php   $name=$_POST["name"];//コメントフォーム

  $namae=$_POST["namae"];//名前フォーム

  $sakuzyo=$_POST["sakuzyo"];//削除フォーム

  $edit=$_POST["edit"];//編集機能フォーム

  $number=$_POST["number"];//編集番号フォーム

  $date=date('Y年m月d日 H時i分');//日付

  $filename="●●.txt";//テキストファイル

 //投稿機能開始

  if(empty($namae)==false&&empty($name)==false&&!empty($number)==false){//もし$namaeと$nameが空っぽじゃなくて$numberが空っぽなら

  $ret_array=file($filename);//テキストファイルを読み込み

  $d=$ret_array === false ? 1 : count($ret_array)+1;//2-1の要素の数を数える

  $a=$d."<>".$namae."<>".$name."<>".$date;//投稿番号、名前、コメント、日付 

  $fp=fopen($filename,'a+');//読み込みと追加書き込みをする

  fwrite($fp,$a.PHP_EOL);//書き込み処理

  fclose($fp);   }

  //投稿機能終了

  //削除機能開始

  if(empty($sakuzyo)==false){//空っぽじゃなかったら

  $ret_array=file($filename);//テキストファイルを読み込み

  $kakikomi=fopen($filename,'w');//上書き書き込みする

  $kakikomi=fopen($filename,"a");//追加書き込み

  for($i=0; $i<count($ret_array);$i++){//ループ処理

  $ex=explode("<>",$ret_array[$i]);

  if($ex[0]==$sakuzyo){//削除番号と投稿番号一致したら

  continue;//スキップ

 }   fwrite($kakikomi,$ret_array[$i]);//書き込み処理

 }   fclose($kakikomi);

 }

 //削除機能終了

 //編集選択始まり

  if(empty($edit)==false){//$editが空っぽじゃなかったら

  $ret_array=file($filename);//ファイル読み込み

  for($i=0; $i<count($ret_array);$i++){//ループ処理

  $ex=explode("<>",$ret_array[$i]);

  if($edit==$ex[0]){//投稿番号と編集番号が一致したら

      $editbango=$ex[0];

      $editnamae=$ex[1];

      $editname=$ex[2];

  }   }   }
  //編集選択終わり

  //編集機能始まり

  if(empty($number)==false&&empty($namae)==false&&empty($name)==false){//編集機能番号とコメントと名前が空っぽじゃなかったら

  $editel=file($filename);//ファイル読み込み

  $kakikomi=fopen($filename,'w');//上書き書き込み

  $kakikomi=fopen($filename,'a');//追加書き込み

  for($i=0; $i<count($editel);$i++){//ループ処理

  $plode=explode("<>",$editel);

  if($number==$plode[0]){//編集選択フォームと投稿番号が一致したら

  fwrite($kakikomi,$number."<>".$namae."<>".$name."<>".$date);//差し替え

 }//if($number==$ex[0])閉じ

  else{//一致しなかったら

  fwrite($kakikomi, $editel[$i]);//新規投稿

 }//else閉じ

 }//ループ処理閉じ

 fclose($kakikomi);  }//if(empty($sakuzyo)==false&&empty($namae)==false&&empty($name)==false)閉じ

 //編集機能終わり

 ?>

 <form method="POST" action="○○.php">       <input type="text" name="namae" placeholder="名前" value="<?php echo $editnamae;?>"><br>

      <input type="text" name="name" placeholder="コメント" value="<?php echo $editname;?>"><br>

      <input type="text" name="number" value="<?php echo $editbango;?>">       <input type="submit" value="送信"><br>

      <input type="text" name="sakuzyo" placeholder="削除対象番号">       <input type="submit" value="削除"><br>

      <input type="text" name="edit" placeholder="編集対象番号">       <input type="submit" value="編集">

      </form>

<?php

 //表示機能

  $ret_array=file($filename);//テキストファイルを読み込み

  for($i=0; $i<count($ret_array);$i++){//ループ処理

  $ex=explode("<>",$ret_array[$i]);//投稿番号取得、それを読み込んだファイル

  echo $ex[0].$ex[1].$ex[2].$ex[3]."<br>";//分解して投稿番号を取得、表示

  } ?>

</body> </html>

```
簡易掲示板において編集機能をつけていますが、名前 コメント 投稿番号をフォームに表示させた後 編集して差し替えたいのですが 反映されず差し替えができない状態です。よかったらコードミス教えていただけませんか。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m6u

    2018/12/03 21:39 編集

    ``` ←これを書くときは、これのすぐ後ろにコードを書かずに改行してください。まだ余計な記号「> 」が前後についている気がします。

    キャンセル

  • kaity

    2018/12/03 21:39

    了解しましたすみません。

    キャンセル

  • m.ts10806

    2018/12/03 23:14

    投稿前にリアルタイムプレビュー確認してください。

    キャンセル

回答 1

+2

1)

$name=$_POST["name"];//コメントフォーム
$namae=$_POST["namae"];//名前フォーム
$sakuzyo=$_POST["sakuzyo"];//削除フォーム
$edit=$_POST["edit"];//編集機能フォーム
$number=$_POST["number"];//編集番号フォーム


$name$namaeって入力ミスを誘発しやすいから間違えないようネーミングを変えるべき。

2)
PHP: filter_input - Manual関数を使った方が、POSTやGETで受け取ったフォームデータの検証や不正データのフィルターができて便利。
$_GET, $_POST じゃなくて filter_input 使えとのこと - Qiita

3)
いろんな処理の判定のきっかけ、
私ならどのsubmitボタンを押したのかをまず先に判定したいところかな。
編集番号を入力して削除ボタンをクリックしたとき、
編集番号があるからと行って編集の動作をするのが正しいのか、
それとも削除ボタンをクリックしているのに削除番号の入力がないから入力エラとみなすか、
仕様をしっかり決めてほしいところ。

$submit = filter_input(INPUT_POST, 'submit');
switch ($submit) {
  case '送信' : 
    ~
    break;
  case '編集' : 
    ~
    break;
  case '削除' : 
    ~
    break;
  default:  // どのボタンでもない場合  
    ~
}


とか。

4)
$ret_array=file($filename);とか$editel=file($filename);とかあるけど、
PHP: file - Manual
にあるように「file(ファイル名)」ってだけだと、
改行コードで一つ一つの投稿データを分離かけているんなら
配列変数に格納したときに改行コードもついたまま格納されるね。
なのに、
編集機能のところで
fwrite($kakikomi,$number."<>".$namae."<>".$name."<>".$date);//差し替え
って改行コードを補うことをしていない。
ちなみに、日付データに改行コードがつきっぱなしで処理が進むようだが、
htmlコード上で改行コードは無視されるけども
ほんとにそれで大丈夫なのか?
データを区切る記号は必要に応じて適切に省くべきだと思うけども。

5)

  $kakikomi=fopen($filename,'w');//上書き書き込み

  $kakikomi=fopen($filename,'a');//追加書き込み


これ、2つ書く意味あるの?
配列変数に一端格納しているのなら、特に編集機能であれば
ここで追加書き込みはないよね。

6)
explode()が関わる箇所で、変数名を重複させまいと$exをつかったり$plodeを使っているけど、
あとで意味がわからなくなるからちゃんと命名したほうがいい。
そもそも、変数のスコープを理解できていれば、
ブロックの内側で宣言している変数はブロック外に影響することはないので、
実は同じ名前を使っても大丈夫だったりする。
PHP: 変数のスコープ - Manual

読みにくいコードをざっと読んで気づいたところ6点指摘させていただきました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/03 22:24

    読みづらいコード申し訳ありませんでした、、。 これら原因で差し替えなどの不作動が起きてるのでしょうか。

    キャンセル

  • 2018/12/04 10:27

    webブラウザだけ見ずに、apacheのaccess_logやerror_logの点検、
    データファイルの変化にも気を配ってください。
    とくにデータファイルの編集に失敗するとデータ管理の根幹が崩れるので、
    4)と5)に関して改善を図らないと先に進めないものと思われます。
    テストするときはテストする前提になる条件にも気を配ります。
    編集機能や削除機能を試す前のデータファイルをバックアップをとっておき、
    ボタンクリック後にどうなったか、前後比較します。

    キャンセル

  • 2018/12/05 10:14

    ところで、今は何が障害になっていますか? 解決に近づけていますか?

    キャンセル

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る