🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

3331閲覧

php web掲示板で削除機能を実装したい。

blink_program

総合スコア7

PHP

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/10/31 02:18

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
phpでweb掲示板を作っています。
削除機能を実装中に以下のエラーメッセージが発生しました。

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

php掲示板で削除機能を実行したいです。 Notice: Undefined variable: dataFile in /public_html/mission_3-3.php on line 39 Warning: Invalid argument supplied for foreach() in /public_html/mission_3-3.php on line 39

該当のソースコード

php

1<html> 2<body> 3 <form action = "mission_3-3.php" method="post"> 4 名前: 5 <input type="text" name="name"><br/> 6 7 コメント: 8 <input type="text" name="comment"><input type="submit" value="送信" ><br/> 9 10 削除対象番号: 11 <input type="text" name="deleteNo" placeholder="削除対象番号"> 12 <input type="submit" name="delete" value="削除"> 13 </form> 14 15 <?php 16 $filename = "mission_3-3.txt"; 17 if(!empty($_POST["name"])) { 18 19 $fp = fopen($filename,'a'); 20 $dataFile = explode(" ",$filename) ; 21 fwrite($fp,count(file($dataFile[0]))."<>".$_POST["name"]."<>".$_POST["comment"]."<>".date( "Y年m月d日 H:i:s" )); 22 fwrite($fp,"\n"); 23 fclose($fp); 24 } 25 26 27$fp = fopen("mission_3-3.txt", "r"); 28while ($line = fgets($fp)) { 29 $line2 = explode("<>",$line); 30 print_r($line2[0]." ".$line2[1]." ".$line2[2]." ".$line2[3]); 31 print_r("<br>"); 32} 33fclose($fp); 34 35 36$delete = $_POST['deleteNo']; 37if(!empty($delete)){ 38 $fp=fopen($filename,'w'); 39 foreach( $dataFile as $key => $value){ 40 $line = explode("<>",$value); 41 if($line[0] != $delete){ 42 fwrite($fp,$line[0]." ".$line[1]." ".$line[2]." ".$line[3]); 43} 44 45} 46fclose($fp); 47} 48?> 49</table> 50</body> 51</html>

試したこと

配列などがよく分からず躓いています。

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

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/10/31 02:20

出典はどちらのものでしょうか?
guest

回答3

0

基本を確認したければPHPマニュアル

あとエラーは「何が起きたか」「どこがおかしいか」教えてくれるものなので読めば分かることがほとんど。
つまり、読もう。

投稿2019/10/31 02:28

m.ts10806

総合スコア80875

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

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

0

ベストアンサー

if(!empty($_POST["name"])) {のブロック内で
$dataFile = explode(" ",$filename) ;と定義していますが、
このifの条件に当てはまらない場合には$dataFileは未定義となります。
そのために表示されているエラーと考えられます。

対策としては、if()ブロックの外で$dataFileを定義すればよいです。

それはそれとして。
あれこれおかしなところがあるので順に。

php

1 $filename = 'mission_3-3.txt'; 2 if (!empty($_POST['name'])) { 3 $fp = fopen($filename, 'a'); 4 $dataFile = explode(' ', $filename); 5 fwrite($fp, count(file($dataFile[0])).'<>'.$_POST['name'].'<>'.$_POST['comment'].'<>'.date('Y年m月d日 H:i:s')); 6 fwrite($fp, "\n"); 7 fclose($fp); 8 }

投稿を受け付けてデータファイルに記録する箇所だと推察するのだけど、
投稿番号の発番アルゴリズムが雑すぎて困る。

投稿を削除できる機能を追加する前提で、投稿データをどう管理するかを整理すると、
投稿データに削除フラグの項目をもたせて、通常は「未削除」削除されたら「削除済」を示すデータを記録する【論理削除】の方法もあるが、
投稿データから抹消して残さない【物理削除】の方法があるわけ。こっちだろう。

物理削除を繰り返すと、投稿番号が途中削除によって抜けることも出てくるわけで、
投稿データの読み込んだ行数を元にうっかり発番すると番号が重複することもある。
例を挙げると、1,2,3,4,5とあるところで、3を削除すると1,2,4,5になるが、
次の投稿番号は行数を元にすると5になってしまって重複してしまう、など。

物理削除で管理する場合は、必ず投稿データの各行を検索して、投稿番号の最大値+1を求めて使うのが原則になる。
やり方はいろいろあるけど、例えば、
投稿データを行単位で一旦配列に持たせて、
foreach()ループでその配列を1行ずつ、
投稿番号箇所を切り出して最大値を調べるのが無難だろうか。
投稿データが何千行などになったらもたないかもしれないが、
学習用途としては十分なのではないかと。
机上でバッグのみで動かしてないけど、こんな雰囲気。

php

1$max_no = 0; 2$dat = file($filename); 3foreach ($dat as $line) { 4 list($no, $name, $comment, $date) = explode("<>", $line); 5 if ($max_no > intval($no)) { 6 $max_no = intval($no); 7 } 8} 9$max_no += 1; // 次の投稿番号

投稿の追加はファイルへの「追加書き出し」でもいいし、
せっかく配列に格納したのなら、配列末尾に追加したものをファイルに書き出すのもいい。

それと、投稿の追加や削除に関して、$_POSTを検証をもう少し丁寧にやりたい。
名前、コメント、削除対象番号、
それぞれどういう入力を許可・許容するのかをはっきりさせておきたい。
名前だけ入力があってコメントがカラだった場合、
$_POST['comment']は未定義になるため、
未定義の変数を参照したりするとNotice: Undefined index: comment in $_POSTなんてエラー表示が起こりうる。
投稿の追加をするには、名前とコメントの入力が必須、
であるならば、
if (isset($_POST['name']) && isset($_POST['comment']) {
みたいになるだろうか。
なお、変数の存在確認にはempty()を使ってはならない。isset()推奨。
PHP isset, empty, is_null の違い早見表 - Qiita
文字列"0"をempty("0")はtrue判定してしまうため。

ひとまず。

投稿2019/10/31 02:22

編集2019/10/31 03:19
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

1ファイルで管理しているなら考え方はこう

  1. ファイルを開く
  2. ファイルをロック
  3. 全データを読み込む
  4. 合致するレコードを削除
  5. 全データを書き込む
  6. ファイルロックを外す
  7. ファイルを閉じる

投稿2019/10/31 03:22

yambejp

総合スコア116661

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問