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

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

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

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

Q&A

解決済

1回答

7242閲覧

PHPで簡易掲示板を作っています。削除フォーム内のexplodeの中に何の変数を入れていいかわかりません。

KZKKZ_ZKY

総合スコア5

PHP

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

0グッド

0クリップ

投稿2019/08/14 05:54

編集2019/08/14 07:29

前提・実現したいこと

PHPで簡易掲示板を作成しています。
削除フォームで受け取った数値と、配列の[0]が同じ時にその行を削除(その行だけ隠す)ようにしたいです。

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

Warning: fwrite(): supplied resource is not a valid stream resource in /public_html/mission_3-3.php on line 49 Warning: fclose(): supplied resource is not a valid stream resource in /public_html/mission_3-3.php on line 50 mission_3-1.txt

該当のソースコード

PHP

1<!DOCTYPE html> 2<html lang="en" dir="ltr"> 3 <head> 4 <meta charset="utf-8"> 5 <title>簡易掲示板</title> 6 </head> 7 <body> 8 9 <form action="mission_3-3.php" method="post"> 10 <input type="text" name="name"> 11 <textarea name="comment" rows="8" cols="80"></textarea> 12 <button type = "submit">送信</button> 13 </form> 14 <br> 15 <form action="mission_3-3.php" method="post"> 16 <input type="text" name="delete"> 17 <button type = "submit">削除</button> 18 </form> 19 20 <?php 21 22 $date = date("Y/m/d H:i:s"); 23 $filename = "mission_3-1.txt"; 24 $count = count( file($filename) ); 25 $fp = fopen($filename, "a" ); 26 27 if(!empty($_POST["name"])&&!empty($_POST["comment"])){ 28 29 $namae = $_POST["name"]; 30 $message = $_POST["comment"]; 31 32 $toukou = $count."<>".$namae."<>".$message."<>".$date; 33 34 $keijiban = explode("<>",$toukou); 35 $string = implode(" ",$keijiban); 36 37 fwrite( $fp , "$string\r\n" ); 38 fclose( $fp ); 39 40 }elseif(!empty($_POST["delete"])){ 41 42 $delete = $_POST["delete"]; 43 $fp2 = fopen($filename,'w'); 44 45 ** for($i = 0; $i <= $count; $i++){ 46 $data2 = explode("<>",$filename); 47 48 if($data2[0] != $delete){ 49 fwrite( $fp2 , "$filename\r\n" ); 50 fclose( $fp2 ); 51 } 52 }** 53 } 54 $ret_array = file($filename); 55 foreach($ret_array as $aaa){ 56 echo $aaa; 57 echo "<br>"; 58 } 59 60 ?> 61 62 </body> 63 64</html> 65ボールドテキスト 66

試したこと

過去の質問は大体読み漁ったはずですが解決できませんでした。
配列を入れるとエラーが出てしまうことはわかったのですが、
を受け取るif文の変数を使うことができないので困りました。(グローバル変数というのも使ってみましたあうまくいきませんでした。)

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

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

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

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

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

m.ts10806

2019/08/14 05:56

エラーで調べたり試したことはありませんか? また「PHP 簡易掲示板」はteratailにも幾度となく質問が挙げられています。 おおよそファイル名なども同じなので参考先(書籍でしょうか)も同じと思われますし、過去質問は参考になるのでは?(まず過去質問を参考にしてもらいたいです)
KZKKZ_ZKY

2019/08/14 06:01

かなりの質問を読み漁っても解決できなかったため質問させていただきました。 タイトルの変更に対する助言ありがとうございます。
m.ts10806

2019/08/14 06:02

質問は編集できますので適宜調整いただければと。 「質問を読み漁った」ことがわかるように、確認した質問のURL等も追記しておいていただければと思います(代表的なもので結構です)
KZKKZ_ZKY

2019/08/14 07:30

編集フォームを探すのに時間がかかってしまいましたが、変更できました。 質問自体初めてで不慣れで申し訳ないです。
guest

回答1

0

ベストアンサー

とりあえず、ソースを見る限り色々問題を含んでいますが、勉強中ということなので、とりあえずエラーと質問のexplodeへの値のセットについて書きますね。

1.エラーについて
エラー内容からすると、fwrite、fcloseを行う際に使用している$fpに何も入っていない、つまり43行目にあるfopenで失敗しているようです。

「w」オプションでfopenをする場合、失敗する理由は該当ファイルの作成権限またはアクセス権限が無い場合が多いかと思いますので、まずはphpファイルがあるディレクトリのパーミッションを見て、phpでのファイル作成権限があるかどうかを確認してみてください。

また、プログラムを書く際に、何らかのメソッドを使用して値を取得した場合、成功しているか同化のチェックを行うようにした方が良いです。fopenの場合は$fpに失敗した際の値(false)が入っていないかどうかのチェックですね。

php

1if($fp !== false){ 2--成功時の実行内容 3}

また、このプログラムだと、25行目と43行目で同じファイルを別々のモードで開いているので余分なリソースが発生しています。
表示(読み込み)、書き込み、削除で別々のモードで開く必要があるのであればif等で分岐した中に記述した方が良いかと思います。

2.削除処理内の変数について

多分やりたいことは、指定された番号(deleteにセットされていると想定)と一致する行のデータを見つけて消す…という事だと思いますので、

php

1$hoge = file($filename);

と書くことで、現在保存されているデータが格納された変数$hoge(名前は適当に変えてください)を作成します。

この変数をforやforeachでループ処理させることで処理を行ってみてください。

php

1for($i = 0; $i < $count; $++){ 2 $data2 = explode("<>", $hoge[$i]); 3 4 // 具体的な処理 5}

または

php

1foreach($hoge as $fuga){ 2 $data2 = explode("<>", $fuga); 3 4 // 具体的な処理 5}

投稿2019/08/14 07:55

45_Shingo

総合スコア177

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

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

KZKKZ_ZKY

2019/08/14 15:25

的確な回答ありがとうございます。 Notice: Array to string conversion in /public_html/mission_3-3.php on line 51 Warning: fwrite(): supplied resource is not a valid stream resource in /public_html/mission_3-3.php on line 51 Warning: fclose(): supplied resource is not a valid stream resource in /public_html/mission_3-3.php on line 52 変更したのですが、またもやこのようなエラーが出てしまいました。 explodeしても配列というあつかいになってしまうのですね。 そこを解決できるように頑張ろうと思います。 質問に答えていただきありがとうございました!
45_Shingo

2019/08/27 03:08

すみません、しばらく見れてなかったので回答が遅くなりました。 explodeはそもそも配列を生成するための関数です。 $hoge = explode("デリミタ",$fuga); とすることで、デリミタ(1文字ではなく文字列でもOK)で$fugaを分割し、$fuga内にデリミタが存在しない場合でも配列で返し、$hogeに格納します。ですので、$hogeは常に配列として生成されるので、その後の処理も配列として扱うようにしましょう。 また、引数として渡した$huga自体が変更されるわけではなく、分割されたものが返され、それを別の変数にセットする…という動作であることも重要です。 上記エラーは回答の1に書いているようにfopenが失敗しているために発生しています。 ファイルが正常に生成できているかをまず先にチェックした方が良いですね。 FTP等でサーバーに接続し、パーミッション(アクセス許可)を確認してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問