phpファイルとは別に、テキストファイルを同じディレクトリに作っています。
削除までは問題なく動作しましたが、編集機能(keijiban.txtから投稿番号を、編集番号としてPOSTでそれぞれ取得したものを比較して一致したときargs[2]に編集内容をPOSTしたコメントを上書き、file_put_contentsでテキストファイルに上書き)を作成したのですが、編集ボタンを押すと投稿が1〜3個しか表示されなくなりました。また再読み込みをすると同じ現象が起きます。
どこをどのように書き換えるべきでしょうか。アドバイスをよろしくお願いします。
今度こそソースコードをバッククオートで囲みました。度々申し訳ございません。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>掲示板</title>
</head>
<body>
<form action=keijiban.php method="post">
名前:<br />
<input type="text" name="name" size="30" value="" /><br />
コメント:<br />
<textarea name="comment" cols="30" rows="5"></textarea><br />
<br />
<input type="submit" value=“投稿” />
<br />
<br />
削除する投稿番号:
<input type="number" name= "delete" value=""><br />
編集する投稿番号:
<input type="number" name= "change" value=""><br />
編集内容:<br />
<textarea name="change_comment" cols="30" rows="5"></textarea><br />
<input type="submit" value=“編集” />
<br />
<br />
<br />
<br />
</form>
<?php
function dispKekka($var, $var_kata){
print('変数に格納されている値は'.$var.'です<br>');
print('変数の型は'.$var_kata.'です<br><br>');
}
function comment_change($change_number,$change_comment){
$array = file("keijiban.txt");
for($num = 0; $num < count($array); ++$num){;
$args = explode("<>",$array[$num]);
if( "{".$change_number."}" == $args[0]){
$args[2] = "{".$_POST["change_comment"]."}";
return $args[2];
}
}
}
$fpr = fopen("keijiban.txt","r");
for($num = 0;fgets($fpr);$num++);
$num_ = $num+1;
fclose($fpr);
date_default_timezone_set('Japan');
if($num == 0){
if(isset($_POST["name"]) and isset($_POST["comment"])){
if($_POST["name"] != "" and $_POST["comment"]){
$fpw = fopen("keijiban.txt","w");
fwrite($fpw,"{1}"."<>{");
fwrite($fpw,$_POST["name"]."}<>{");
fwrite($fpw,$_POST["comment"]."}<>{");
fwrite($fpw,date('Y年m月d日 H時i分s秒')."}\n");
fclose($fpw);
}
}
}
else{
if(isset($_POST["name"]) and isset($_POST["comment"])){
if($_POST["name"] != "" and $_POST["comment"]){
$fpa = fopen("keijiban.txt","a");
fwrite($fpa,"{".$num_."}<>{");
fwrite($fpa,$_POST["name"]."}<>{");
fwrite($fpa,$_POST["comment"]."}<>{");
fwrite($fpa,date('Y年m月d日 H時i分s秒')."}\n");
fclose($fpa);
}
}
}
if(isset($_POST["delete"]) and $_POST["delete"] != ""){
echo("削除する投稿番号が入力されました。".$_POST["delete"]."<br />\n");
$del = intval($_POST["delete"]) - 1;
$file = file('keijiban.txt');
unset($file[$del]);
file_put_contents('keijiban.txt', $file);
}
$file = "keijiban.txt";
$array = file($file);
for($num = 0; $num < count($array); ++$num){
$args = explode("<>",$array[$num]);
$new_num = $num + 1;
$array = file($file);
$args[0] = "{".$new_num."}";
if($_POST["change"] != ""){
if("{".$_POST["change"]."}" == $args[0]){
$args[2] = comment_change($_POST["change"],$_POST["change_comment"]);
file_put_contents("keijiban.txt",$args);
}
}
echo("投稿番号".$args[0]."<br />\n");
echo("投稿者".$args[1]."<br />\n");
echo("コメント".$args[2]."<br />\n");
echo("投稿日時".$args[3]."<br />\n<br />\n");
}
?>
</body>
</html>
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+3
投稿番号の管理をどう捉えるか、整理したほうがいいかもしれません。
for($num = 0; $num < count($array); ++$num){
でループを回す場合、
$numは0から始まり$array-1
で終わりますが、
keijiban.txtに記録している投稿番号は削除すると歯抜けになるので、
$new_num = $num + 1;
としてあと$args[0] = "{".$new_num."}";
としているので、
ファイル上の投稿番号とズレます。
歯抜けさせないために番号を振り直すとすると、
誰かが画面を開きっぱなしにしている最中に他の人が投稿を削除すると、
例えば本来削除したい5番の投稿が実は他人によって既に4番になっていて、
6番がずれて5番になってしまっているのを削除してしまう、
みたいな挙動をします。
ループカウンタの$num由来で投稿番号を作らないようにして、
ファイルに記録してある投稿番号を改ざんしないようにするだけで、
動きそうな気がします。
あと細かいこととして、andとorは&&
と||
の方がいいです。
使い方によっては意図しない挙動を誘発します。
PHP/andと&&など比較演算子の違い - TOBY SOFT wiki
PHPのand,or演算子の使い道を考えてみる | WEB EGG
さらに細かいこととして、
$args = explode("<>",$array[$num]);
を
list($post_num, $post_user, $post_comment, $post_date) = explode("<>", $array[$num]);
みたいにすると、可読性が高まって混乱を防げます。
ここはこうすると破壊せずに済むかもよ。
if($_POST["change"] != ""){
if("{".$_POST["change"]."}" == $args[0]){
$args[2] = comment_change($_POST["change"],$_POST["change_comment"]);
$array[$num] = implode("<>", $args);
file_put_contents("keijiban.txt",implode("", $array));
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.10%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
退会済みユーザー
2017/02/15 00:50
https://teratail.com/questions/41441
kei344
2017/02/15 11:53
'''(カンマ3つ)ではなく ```(バッククオート3つ)です。記入エリアの右部分あたりにリアルタイムに結果が表示されていると思うので、そこを見ながら調整してください。
m6u
2017/02/15 12:05
バッククオートは、Shift+@ね。Shift+7じゃないよ。