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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

1回答

5344閲覧

PHP、掲示板の削除機能実装をしたいです

aiued

総合スコア5

PHP

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2020/01/11 03:41

編集2020/01/11 13:11

前提・実現したいこと

プログラミング勉強を始めました、未熟者ながらどうぞよろしくお願いいたします。

PHPの掲示板の削除機能を実装したいです…!

様々なサイトを確認し、参考し、流れは何となくわかりましたがうまく実装することが出来ません。
初歩的なミスがあると思います、しかしどうしても力不足の為解決できないため。ご教授頂けないかと
相談を投稿しました。

発生している問題・エラーメッセージ

最初からこのような表示が出ます。 Parse error: syntax error, unexpected '}' in /public_html/rensyuuyou.php on line 98

該当のソースコード

fclose($fp)

試したこと

<head> <meta charset="utf-8"> </head> <body> <form method="post" action="rensyuuyou.php"> <input type="text" name="name" placeholder="名前"> <br> <input type="text" name="comment" placeholder="コメント"> <input type="submit"> <br> </form> <form method="post" action="rensyuuyou.php"> <input type="txet" name="delete" placeholder="削除番号"> <input type="submit" value="削除"> </form> <?php if( !empty($_POST["comment"])){ $name = $_POST["name"]; $comment = $_POST["comment"]; if( $_POST["comment"] == "完成"){ echo"おめでとう"."<br>"; }else{ echo $_POST["comment"] ."を受け付けました。"."<br>"; } $filename = "rensyuuyou.txt"; $fp = fopen($filename, "a"); if (file_exists($filename)) { $count = count(file($filename))+1; } else { $count = 1; } fwrite($fp, "$count"."\t"); fwrite($fp, "$name"."\t"); fwrite($fp, "$comment"."\t"); fwrite($fp,date("Y年m月d日 h時i分")."\n"); fclose($fp); $lines = file($filename); $line = explode(",", $filename); foreach((array)$lines as $line){ echo $line."<br>"; } } ?> <?php if(isset($_POST["delete"])){ $filename = "rensyuuyou.txt"; $file = file($filename); $fp = fopen($filename, "w"); $delete = $_POST["delete"]; for($j = 0; $j<count($file); $j++){ $delDate = explode(",",$file[$j]); if($delDate[0] ==$delete){ array_splice($file,$j,1); } fwrite($fp, "$count"."\t"); fwrite($fp, "$name"."\t"); fwrite($fp, "$comment"."\t"); fwrite($fp,date("Y年m月d日 h時i分")."\n"); } fclose($fp) } ?> </body> </html>

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/01/11 03:47

インデントを合わせてください、IDEを使ってみてください。 大抵これで解決します。
m.ts10806

2020/01/11 03:47 編集

コードはマークダウンのcode機能を利用してご提示ください。
aiued

2020/01/11 12:24

確認するのが遅くなりました、編集依頼、回答にてコメント下さりありがとうございます。 まず、コード?の挿入の編集を行いました。今からインデントリなどや、初心者向けのサイトなどを見て取り組んでみたいと思います!(返信の投稿の使い方間違ってたらごめんなさい)
guest

回答1

0

ベストアンサー

前提として、下記のようなPHP初心者向けの記事は読んでおいた方が良いです。
※具体的な指南というより注意喚起、環境整備です。

あと、PHPに限らずですが、必ずできるようになるべきなのは

です。初心者が遭遇する問題のほとんどはこの3つをきちんとすれば解決します。
初心者の段階でよくおきるのは今回のような「構文エラー」ですね。
あと変数とか配列の定義に関わるもの。
エラーを読んでコードとあてはめれば大抵解決します。

そして、構文エラーであれば「構文チェック機能があるエディタ」を導入すれば実行しなくても教えてくれます。

下記はIDEの1つであるEclipseの例(エディタ部分のみ)
イメージ説明
※HTMLの構文チェックもしてくれます。上の方でおかしいところがありますので導入して検証してみてください。

ここからは「デバッグ」ですが。まずフォーマットをかけましょう。
IDEであればフォーマット機能も備わっています。

以下はフォーマット機能をつかった状態。

php

1<head> 2 3<meta charset="utf-8"> 4</head> 5 6<body> 7 8 <form method="post" action="rensyuuyou.php"> 9 <input type="text" name="name" placeholder="名前"> <br> <input 10 type="text" name="comment" placeholder="コメント"> <input type="submit"> 11 <br> 12 </form> 13 14 <form method="post" action="rensyuuyou.php"> 15 <input type="txet" name="delete" placeholder="削除番号"> <input 16 type="submit" value="削除"> 17 18 </form> 19<?php 20if (! empty($_POST["comment"])) { 21 22 $name = $_POST["name"]; 23 $comment = $_POST["comment"]; 24 25 if ($_POST["comment"] == "完成") { 26 echo "おめでとう" . "<br>"; 27 } else { 28 echo $_POST["comment"] . "を受け付けました。" . "<br>"; 29 } 30 31 $filename = "rensyuuyou.txt"; 32 $fp = fopen($filename, "a"); 33 34 if (file_exists($filename)) { 35 $count = count(file($filename)) + 1; 36 } else { 37 $count = 1; 38 } 39 40 fwrite($fp, "$count" . "\t"); 41 fwrite($fp, "$name" . "\t"); 42 fwrite($fp, "$comment" . "\t"); 43 fwrite($fp, date("Y年m月d日 h時i分") . "\n"); 44 fclose($fp); 45 46 $lines = file($filename); 47 $line = explode(",", $filename); 48 49 foreach ((array) $lines as $line) { 50 51 echo $line . "<br>"; 52 } 53} 54 55?> 56 57<?php 58 59if (isset($_POST["delete"])) { 60 $filename = "rensyuuyou.txt"; 61 $file = file($filename); 62 $fp = fopen($filename, "w"); 63 64 $delete = $_POST["delete"]; 65 for ($j = 0; $j < count($file); $j ++) { 66 $delDate = explode(",", $file[$j]); 67 68 if ($delDate[0] == $delete) { 69 array_splice($file, $j, 1); 70 } 71 fwrite($fp, "$count" . "\t"); 72 fwrite($fp, "$name" . "\t"); 73 fwrite($fp, "$comment" . "\t"); 74 fwrite($fp, date("Y年m月d日 h時i分") . "\n"); 75 } 76 77 fclose($fp) 78} 79 80?> 81 82</body> 83</html>

エラーを直してくれるわけではないのでエラーは出ます。

でもこれで読みやすくなりましたね。

構文エラーの基本は「エラーが出ている行数前後を見ること」です。

php

1 2 fclose($fp) 3} 4

明らかにおかしいところが1点あるのですが、ここで「公式マニュアルを確認する」という原点に立ち返ってPHPマニュアルを確認します。

色々調べ方はありますが、基本文法から探します。

すると下記に辿り着きます。

命令の分離

PHP でもステートメントを区切りにはセミコロンが必要と なります。PHP コードブロックの終了タグには自動的にセミコロンが含まれていると 認識されます。

ということで、「命令の区切りなのに;がない」ということでエラーになっているわけですね。

エラー文:Parse error: syntax error, unexpected '}' in

解析エラー:構文エラー、予期しない「}」

「予期しない」が分かりづらいかもしれませんが、PHPの構文的には「本来fclose()は終わってないといけないはずなのに}が出てきた」という解釈として「予期しない」と指摘していると思ってください。


ただし、もちろん、エラー自体の解決と、実現したいことの実装は一致しません。エラーなおしたからって想定通りに動くとは限りません。

あとはデバッグなどを駆使しながら追っていくことになるでしょう。

でも幾つか注意しておいた方がいいですね。

  • 何かのテキストの丸写しかもしれないけど、ファイル名や変数名などの「名称」はなるべく意味を持させた方が良い。

例えばrensyuuyouというファイル名が散見されますが、その名前で役割が分かるかどうか?考えてみてください。本当に「練習用」だとしても、です。

たぶん他にもエラーあります(PHP実行が不可能ではないけど)。 $_POSTがどのように定義されるのか?おさえておいてください。

  • 仕様をしっかり決めているか?

今の作りだと、1234とデータがあって4が削除されると次にデータが登録されると4になります。一言掲示板とかならまだ良いのかもしれませんけど、サーバーサイドの言語なので「情報の共有」があり得ます。
「コメントがつけられる掲示板」となるとこの作りではマズいです。

  • テキストベースでデータを扱うより、やはりデータベースにすべきでは
  • XSS対策も考慮しておいた方が良い。
  • $filename = "rensyuuyou.txt"; これ何回も出す意味がない。それなら冒頭で定数定義しておいて使った方が。
  • file()の返り値はarray or falseだけどキャスト(array)で対処するのは悪手だと思う。

それならfileの返り値を見てforeachに投入するかどうか判断すべき。

他にもないわけではないですが、大きいところも細かいところも言いだせばきりがないので、この辺で。
(最初の記事2つの考え方を導入できればほぼ解決できると思います)

大事なこと

割と「なんだそんなことだったのか」ということが原因のことって本当に多いです。
今回もおそらくそうですし、今後もそういうことって出てきます。

ちなみに私が今回のような回答をしたのは今回が初めてではありません。
探せばきっと同じような回答をしている質問が幾つも出てきます。

つまり「探せばどこかにある」ということになります。

直接解決の糸口とはならなくとも、気づきやヒントを得られるような回答になっているはず。
既にコメントで「インデント揃えてIDEを導入すれば大抵解決する」といった主旨のものがついています。
まさにその通りで、「実行しなくても構文エラーくらいは気づけるような環境づくり」ってエンジニアには非常に大事な準備だったりします。
質問しなくても自分で解決できればそれが最も早いわけです。質問する時間が勿体ないと思えたら、自ら「なんだそんなことだったのか」が気づけるようになっていると思います。

投稿2020/01/11 04:26

編集2020/01/11 04:34
m.ts10806

総合スコア80850

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

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

aiued

2020/01/14 16:59

無事に削除機能をつけることが出来ました! 載せて頂きましたサイト、見て勉強致しました。それにIDEも入れました(しかしまだ使い方がいまいちよくわかっていないのでまた勉強が必要になってくるのですが…) 今見返すとかなりトンチンカンなコードですね…。ご丁寧に本当にありがとうございました…!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問