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

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

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

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

Q&A

解決済

1回答

12034閲覧

php 簡易掲示板の編集

bakusoku

総合スコア16

PHP

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

0グッド

0クリップ

投稿2016/11/18 08:14

###実現したいこと
簡易掲示板について。
テキストと送信ボタンがある掲示版を扱います。
フォームを送信すると、別に用意したテキストファイルに内容が保存され、そこから読みだされた内容が画面に出力されます。
さらに、指定した番号のフォームを再度、入力フォームの表示させ、編集し、送信すると、指定番号のテキストが書き換えられる仕組みです。

###発生している問題
hiddenを使って、送信ではなく、編集ということを明らかにしたいのですが、適切な方法が分かりません。
また、フォーム内容を保存しているテキストを再度、送信フォームに出力させる方法が分かりません。

###該当のソースコード

<form action="<?php echo($_SERVER['PHP_SELF']) ?>" method="post"> <table> <tr><td>名前:</td> <td><input type="text" name="name"></td></tr> <tr><td>コメント:</td> <td><textarea name="comment" cols="30" rows="5"></textarea></td></tr> <tr><td><input type="submit" name="submit" value="送信"></td></tr></table> </form> <?php if(isset($_POST["submit"])){ $fp1 = fopen('kadai_2_5.dat','r+'); $num = fgets($fp1); if (empty($num)){ $num =1;} fseek($fp1,0); //これは必要。なければ、1>2>23>2324....と続く。 fputs($fp1,$num + 1); //フォーム内容と送信時間、送信番号をファイルに書き込む。 $timestamp = date("Y/m/d H時i分s秒"); $name = $_POST["name"]; $comment = $_POST["comment"]; $file = "kadai_2_5.txt"; //.txtはフォーム内容 $fp2 = fopen($file, "a+"); fwrite($fp2, "(".$num.")|"."名前:".$name."|コメント: ".$comment."|投稿時間: ".$timestamp.""."\n"); fclose($fp2); fclose($fp1); }?> <!-- ファイルを読み込んで配列に変換、さらにリストに変換して画面表示する。--> <?php // if(isset($_POST["submit"])){ $num_arr = array(); $content = file("kadai_2_5.txt"); foreach ($content as $list) : //リストは送信ファイル一つずつ $parts = explode("|", $list); //partsは送信ファイルの各要素を配列化したもの $parts0 = substr($parts[0], strpos($parts[0], '(') +1, strpos($parts, ')') -1); array_push($num_arr, $parts0); // var_dump($num_arr); ?> <?php foreach ($parts as $part):?><!--ここから再度、サイトに送信ファイルを記入する--> <table><tr> <?php echo $part;?> </tr></table> <?php endforeach; ?> <?php endforeach;?> <form method="post" action="<?php echo($_SERVER['PHP_SELF']) ?>"> <p>-----------------------</p> <p>編集したい番号を、半角数字で入力してください</p> <input type="text" name="edit_num" placeholder="例)1"> <input type="submit" name="edit_btn" value="編集する"> <input type="hidden" name="edit" value="hensyu"> </form> <?php if($_POST["edit_btn"]){ //編集ボタンが押されたら。 if($_POST["edit_num"]){ $edit_num = $_POST["edit_num"]; foreach ($num_arr as $num_ary){ //フォームの番号をループ if($edit_num == $num_ary){ echo "goooooood!!!!!!!!!!"; echo "<input type='text' name='name' value='".$content[$edit_num]."'>"; } } }else { //もし削除番号が入力されていなかったら echo "編集する番号を入力してください!!!!!";} } ?>

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答1

0

ベストアンサー

雑ですが、変更する処理を書いてみたので参考にしてください

php

1<form action="<?php echo($_SERVER['PHP_SELF']) ?>" method="post"> 2 <table> 3 <tr><td>名前:</td> 4 <td><input type="text" name="name"></td></tr> 5 <tr><td>コメント:</td> 6 <td><textarea name="comment" cols="30" rows="5"></textarea></td></tr> 7 <tr><td><input type="submit" name="submit" value="送信"></td></tr></table> 8</form> 9 10<?php 11// 新規追加 (idがない場合) 12if(isset($_POST["submit"]) && !isset($_POST["id"])) { 13 $fp1 = fopen('kadai_2_5.dat','r+'); 14 $num = fgets($fp1); 15 if (empty($num)){$num =1;} 16 fseek($fp1,0); 17 fputs($fp1,$num + 1); 18 fclose($fp1); 19 20 //フォーム内容と送信時間、送信番号をファイルに書き込む。 21 $name = $_POST["name"]; 22 $comment = $_POST["comment"]; 23 $file = "kadai_2_5.txt"; //.txtはフォーム内容 24 $fp2 = fopen($file, "a+"); 25 $timestamp = date("Y/m/d H時i分s秒"); 26 fwrite($fp2, "$num|$name|$comment|$timestamp\n"); 27 fclose($fp2); 28} 29 30// 変更 (idがある場合) 31if(isset($_POST["submit"]) && isset($_POST["id"])) { 32 $contents = file("kadai_2_5.txt"); 33 $fp1 = fopen('kadai_2_5.txt','w'); 34 $edit_num = $_POST["id"]; 35 foreach($contents as $content) { 36 $parts = explode("|", $content); 37 if($parts[0] == $edit_num){ 38 $name = $_POST["name"]; 39 $comment = $_POST["comment"]; 40 $timestamp = date("Y/m/d H時i分s秒"); 41 fwrite($fp1, "$edit_num|$name|$comment|$timestamp\n"); 42 } else { 43 fwrite($fp1, "$content"); 44 } 45 } 46 fclose($fp1); 47} 48 49// 表示 50$contents = file("kadai_2_5.txt"); 51foreach ($contents as $content) { 52 $parts = explode("|", $content); 53 foreach ($parts as $part) { 54 echo "<table><tr>$part</tr></table>"; 55 } 56} 57?> 58 59<p>-----------------------</p> 60<p>編集したい番号を、半角数字で入力してください</p> 61<form method="post" action="<?php echo($_SERVER['PHP_SELF']) ?>"> 62<input type="text" name="edit_num" placeholder="例)1" value="<?= isset($_POST['edit_num']) ? $_POST['edit_num'] : null ?>"> 63 <input type="submit" name="edit_btn" value="編集する"> 64 <input type="hidden" name="edit" value="hensyu"> 65</form> 66 67<?php 68 if(isset($_POST["edit_btn"])){ //編集ボタンが押されたら 69 if($_POST["edit_num"]){ 70 $edit_num = $_POST["edit_num"]; 71 foreach ($contents as $content){ 72 $parts = explode("|", $content); 73 if($parts[0] == $edit_num){ 74?> 75<form action="<?php echo($_SERVER['PHP_SELF']) ?>" method="post"> 76 <input type="hidden" name="id" value="<?= $parts[0] ?>"> 77 <table> 78 <tr><td>名前:</td> 79 <td><input type="text" name="name" value="<?= $parts[1] ?>"></td></tr> 80 <tr><td>コメント:</td> 81 <td><textarea name="comment" cols="30" rows="5"><?= $parts[2] ?></textarea></td></tr> 82 <tr><td><input type="submit" name="submit" value="送信"></td></tr> 83 </table> 84</form> 85<?php 86 } 87 } 88 } else { 89 echo "編集する番号を入力してください!"; 90 } 91 }

主な変更点は以下の通りです。

  • $_POST["edit_num"]の値からデータを探して、編集用フォームを出力する

この時、hiddenなinputでidを設定することで、編集であることを区別しています。

  • $_POST['id']が設定されているかどうかで、追加か編集かを判別して

それぞの処理を実行しています。

  • ファイルに書き出す値に余計な文字をつけるのをやめました。

そうすることで編集フォームにそのまま値が使えるようになります。

コードについて不明な点があれば、コメントください。

投稿2016/11/18 11:47

編集2016/11/18 13:09
popobot

総合スコア6586

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

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

bakusoku

2016/11/21 02:43 編集

丁寧にご回答していただき、ありがとうございます。 希望としてましては、新しく編集フォームを作成するのではなく、編集番号を送信すると、一番上にあるフォームの中に値が自動入力される仕組みにしたいと思っております。 ご指導いただければ幸いです。
popobot

2016/11/22 23:03 編集

私が書いたコードを動かしてみたのでしょうか? そしてどのような仕組みになっているのかよく調べたのでしょうか...。 > 希望としてましては、新しく編集フォームを作成するのではなく、編集番号を送信すると、一番上にあるフォームの中に値が自動入力される仕組みにしたいと思っております。 まずはご自身でやってみたらいかがでしょうか。ここまで動くものがあれば、あとはフォームを共通化するぐらいそんなに難しいことではないと思います。うまくいかないのであれば、どううまく行かなかったか、やってみたコードを記載した上で別途質問すればいいと思います。 teratailは、希望したコードを誰かが書いてくれるサイトではありません。プログラミングでわからないことを回答してくれるサイトです。最後ご自身で内容を精査して、ご自身でプログラミングしてください。
bakusoku

2016/11/23 06:01 編集

いただいたコードはしっかりと読みましたし、それを参考にして、思うコードができるように手を動かしてやりました。 粘り強くやってみます。 ありがとうございます。
popobot

2016/11/23 21:02

粘り強く試行錯誤することは、プログラミング向上のための必要条件だと思うので、ぜひ頑張ってください! どうしてもわからなかれば、試行錯誤したコードを元に別途新しく質問してください。そうすれば自分以外の方も回答してくれるでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問