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

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

新規登録して質問してみよう
ただいま回答率
85.50%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

PHP

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1813閲覧

php 掲示板 テキストファイルを読み込み表示する方法

huku

総合スコア18

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

PHP

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/12/24 10:08

編集2019/12/30 12:03

現在、php掲示板を制作しています。
ファイルはindex.php
取り入れたい機能は投稿機能、編集機能、パスワード機能です。
投稿機能の部分で別テキストファイルに、
番号<>名前<>テキスト<>日付<>パスワード
の形で保存、編集することには成功しました。
そしてパスワード以外の部分だけ表示する段階ですが、ここで詰まってしまっています。
先程保存したテキストをexplode関数を使い<>で分裂させ、パスワード以外を表示させるつもりです。しかし、このexplodeがうまく働いていないようで、番号以外うまく読み取ってくれません。
このようになぜエラーなのかはわかっているのですが、対処法がわかりません。
分かる方いましたら助言をお願いしたいです
回答よろしくお願いします。

php

1<?php 2 3 4$file="receive.txt"; 5if (file_exists($file)) { 6 $count = count(file($file))+1; 7} else { 8 $count = 1; 9 } 10$err_msg1 = ""; 11$err_msg2 = ""; 12$err_msg7= ""; 13$message =""; 14$passmessage="";  15$edfile = file('receive.txt'); 16$name=( isset( $_POST["name"] ) === true ) ?$_POST["name"]: ""; 17$text=( isset( $_POST["text"] ) === true ) ?$_POST["text"]: ""; 18$password=( isset( $_POST["password"] ) === true ) ?$_POST["password"]: ""; 19$data=($count."<>".$name."<>".$text."<>" .date('H:i:s')."<>".$password."\n"); 20 21if ( isset($_POST["posting"] ) === true ) { 22 23 if ( $name === "" ) $err_msg1 = "名前を入力してください"; 24 25 if ( $text === "" ) $err_msg2 = "コメントを入力してください"; 26 27 if ( $password === "" ) $err_msg7 = "パスワードを入力してください"; 28 29 30 if( $err_msg1 === "" && $err_msg2 ==="" && $err_msg7 ===""){ 31 $fp = fopen( "receive.txt" ,"a" ); 32 fwrite( $fp , $data); 33 $message ="投稿に成功しました。"; 34 35 } 36 fclose($fp); 37 } 38 39 40 41 42 43 44// 編集フォーム 45 46$err_msg3 = ""; 47$err_msg4 = ""; 48$err_msg5 = ""; 49$err_msg9 = ""; 50$message2 =""; 51$edfile = file('receive.txt'); 52$renum=( isset( $_POST["renum"] ) === true ) ?$_POST["renum"]: ""; 53$rename=( isset( $_POST["rename"] ) === true ) ?$_POST["rename"]: ""; 54$retext=( isset( $_POST["retext"] ) === true ) ?$_POST["retext"]: ""; 55$pass2ed=( isset( $_POST["pass2ed"] ) === true ) ?$_POST["pass2ed"]: ""; 56$redata=($renum."<>".$rename."<>".$retext."<>" .date('H:i:s')."<>".$pass2ed."\n"); 57 58 59 60if ( isset($_POST["edit"] ) === true ) { 61 62 if ( $renum === "" ) $err_msg3 = "番号を入力してください"; 63 64 if ( $rename === "" ) $err_msg4 = "名前を入力してください"; 65 66 if ( $retext === "" ) $err_msg5 = "コメントを入力してください"; 67 68 if ( $pass2ed === "" ) $err_msg9 = "パスワードを入力してください"; 69 70 71 if( $err_msg3 === "" && $err_msg4 === "" && $err_msg5 === "" && $err_msg9 === ""){ 72 $fp = fopen("receive.txt", "w"); 73 for ($i = 0; $i < count($edfile); $i++) { 74 $editraw = explode("<>", $edfile[$i]); 75 76 if ($editraw[0] !== $renum && $editraw[4] !== $pass2ed) { 77 fwrite($fp, $edfile[$i]); 78 } 79 else{ 80 fwrite($fp, $redata); 81 $message2 ="編集に成功しました。"; 82 } 83 } 84 } 85 } 86 87 // 消去フォーム 88 $err_msg6 = ""; 89 $err_msg8 = ""; 90 $delfile = file('receive.txt'); 91 $delete=( isset( $_POST["delete"] ) === true ) ?$_POST["delete"]: ""; 92 $pass3del=( isset( $_POST["pass3del"] ) === true ) ?$_POST["pass3del"]: ""; 93 94 95 if ( isset($_POST["delete"] ) === true ) { 96 97 if ( $delete === "" ) $err_msg6 = "番号を入力してください"; 98 99 if ( $pass3del === "" ) $err_msg8 = "パスワードを入力してください"; 100 101 if( $err_msg6 === "" && $err_msg8 === ""){ 102 $fp = fopen("receive.txt", "w"); 103 for ($i = 0; $i < count($delfile); $i++) { 104 $deldata = explode("<>", $delfile[$i]); 105 if ($deldata[0] !== $delete && $deldata[4] !== $pass3del ) { 106 fwrite($fp, $delfile[$i]); 107 } else { 108 fwrite($fp, "消去しました。\n"); 109 } 110 } 111 } 112 } 113 114 115 116?> 117 118<!DOCTYPE html> 119<html lang="ja"> 120<head> 121<meta charset="UTF-8"> 122<title>掲示板</title> 123 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> 124 <link rel="stylesheet" href="./styles.css" type="text/css"> 125</head> 126<body> 127<h1>掲示板</h1> 128<section> 129 <h2>新規投稿</h2> 130 <form action="index.php" method="post"> 131  名前 : <input type="text" name="name" > <?php echo $err_msg1; ?><br> 132 コメント: <input type="text" name="text" > <?php echo $err_msg2; ?><br> 133 パスワードを設定 <input type="text" name="password" > <?php echo $err_msg7; ?> 134 <input type="submit" value="投稿" name="posting"><br> 135 <?php echo $message; ?> 136 </form> 137 138 139 <h2>投稿編集</h2> 140 <form action="index.php" method="post"> 141 編集番号 <input type="number" name="renum"> <?php echo $err_msg3; ?><br> 142 名前: <input type="text" name="rename" ><?php echo $err_msg4; ?><br> 143 コメント: <input type="text" name="retext" > <?php echo $err_msg5; ?><br> 144 パスワードを入力 <input type="text" name="pass2ed" ><?php echo $err_msg9; ?><br> 145 <input type="submit" value="編集" name="edit"><br> 146 <?php echo $message2; ?> 147 </form> 148 149 150 151 152 <h2>消去</h2> 153 <form action="index.php" method="post"> 154 消去番号 <input type="number" name="delete">     <?php echo $err_msg6; ?><br> 155 パスワードを入力 <input type="text" name="pass3del" > <?php echo $err_msg8; ?><br> 156 <input type="submit" value="消去">  <br> 157 </form> 158 159</section> 160<section> 161 <h2>投稿一覧</h2> 162</section> 163 164<?php 165// 読み込むファイル名の指定 166$file_name = "receive.txt"; 167// ファイルを全て配列に入れる 168$ret_array = file( $file_name ); 169 170// 取得したファイルデータ(配列)を全て表示する 171// $echo_arrays = implode("\n", $ret_array); 172for( $i = 0; $i < count($ret_array); ++$i ) { 173 $echo_array = explode("<>", trim($ret_array[$i])); 174 175// // 配列を順番に表示する 176 echo ( $echo_array[0]."<>".$echo_array[1]."<>".$echo_array[2]."<>".$echo_array[3]."<br />\n" ); 177} 178 179 ?> 180 181 182</body> 183</html>

php

1$file="231536_receive.txt"; 2$count=1; 3$files = file('231536_receive.txt'); 4 5if (file_exists($file)) { 6 // 2ループ処理 7 for ($i=1; $i<count($files); $i++){ 8 $numraw = explode("<>", trim($files[$i])); 9 $numpoint = $numraw[0]; 10 // 最大値より配列の値が大きければ上書きをする 11 if($count <= $numpoint){ 12 $count=$numpoint; 13 $count=++$count; 14 } 15 } 16} else { 17 $count = 1; 18 }

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

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

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

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

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

m.ts10806

2019/12/24 21:16

エラーが出ているのでしたらエラーを提示してください。 また原因がわかっているかのようなコメントですが原因がわかっているのなら対策も決まるのでは? どのように、どこまで理解しているのか具体的に記載してください
m.ts10806

2019/12/30 19:54

エラーが出ているのでしたらエラーを提示してください。 また原因がわかっているかのようなコメントですが原因がわかっているのなら対策も決まるのでは? どのように、どこまで理解しているのか具体的に記載してください
guest

回答2

0

ベストアンサー

こういう、phpコード内に全角空白を放置するようなことはやめような。
全角空白をカラー表示してくれるようなエディタを使えば済む話なんだけど。
イメージ説明


その全角空白を削除すると、次はこれか。
イメージ説明
そもそもデータファイルが存在しないことは想定していないのかもしれないけど、
お粗末ですな。
対策コードを書いてもいいけど、面倒だからカラファイルを置くことにする。


2件、新規投稿を試したんだけど、特にエラーが発生しないんだが。
イメージ説明


編集機能、
パスワードが合わなくても編集できてしまうなぁ。
テストしてる?

で、もうちょっと清書して、たぶんこういう書き方になるはず。

php

1if ( isset($_POST["edit"] ) === true ) { 2 3 if ( $renum === "" ) $err_msg3 = "番号を入力してください"; 4 if ( $rename === "" ) $err_msg4 = "名前を入力してください"; 5 if ( $retext === "" ) $err_msg5 = "コメントを入力してください"; 6 if ( $pass2ed === "" ) $err_msg9 = "パスワードを入力してください"; 7 8 if ( ($err_msg3 === "") && ($err_msg4 === "") && ($err_msg5 === "") && ($err_msg9 === "") ) { 9 $fp = fopen("231536_receive.txt", "w"); 10 for ($i = 0; $i < count($edfile); $i++) { 11 $editraw = explode("<>", trim($edfile[$i])); // <-- trim()をつけないとパスワードに改行コードがツイたまま。 12 13 if ($editraw[0] !== $renum) { 14 fwrite($fp, $edfile[$i]); 15 } 16 else { // <-- 投稿番号と編集番号が一致 17 if ($editraw[4] === $pass2ed){ 18 fwrite($fp, $redata); 19 $message2 = "編集に成功しました。"; 20 } 21 else { 22 fwrite($fp, $edfile[$i]); 23 $message2 = "編集に失敗しました。パスワードが間違っています。"; 24 } 25 } 26 } 27 if ($message2 === '') { 28 $message2 = "編集に失敗しました。編集番号が一致しませんでした。"; 29 } 30 } 31}

編集番号が見つかってパスワードが一致しなかった場合、
編集番号が一致しなかった場合、も考慮する必要があるのではないかと。


名前とかカラで投稿したらエラーになった。
新規投稿の処理を清書するとこうなる:

php

1if ( isset($_POST["posting"] ) === true ) { 2 if ( $name === "" ) $err_msg1 = "名前を入力してください"; 3 if ( $text === "" ) $err_msg2 = "コメントを入力してください"; 4 if ( $password === "" ) $err_msg7 = "パスワードを入力してください"; 5 6 if ( ($err_msg1 === "") && ($err_msg2 === "") && ($err_msg7 === "") ) { 7 $fp = fopen( "231536_receive.txt" ,"a" ); 8 fwrite($fp , $data); 9 $message = "投稿に成功しました。"; 10 fclose($fp); 11 } 12}

ifブロックとかの{~}の対応付けがわかりやすくなるよう、
インデント量を調整しておくこと。


あと、消去フォームで、「消去しました。」をファイルに書き出してどーする。
<>で区切ったデータじゃないものを混在させると、他の処理でエラーになります。

ってことで清書してみた:

php

1// 消去フォーム 2$err_msg6 = ""; 3$err_msg8 = ""; 4$delfile = file('231536_receive.txt'); 5$delete = ( isset( $_POST["delete"] ) === true ) ? $_POST["delete"] : ""; 6$pass3del = ( isset( $_POST["pass3del"] ) === true ) ? $_POST["pass3del"] : ""; 7 8 9if ( isset($_POST["delete"] ) === true ) { 10 if ( $delete === "" ) $err_msg6 = "番号を入力してください"; 11 if ( $pass3del === "" ) $err_msg8 = "パスワードを入力してください"; 12 13 if ( ($err_msg6 === "") && ($err_msg8 === "") ) { 14 $fp = fopen("231536_receive.txt", "w"); 15 for ($i = 0; $i < count($delfile); $i++) { 16 $deldata = explode( "<>", trim($delfile[$i]) ); 17 if ( $deldata[0] !== $delete ) { 18 fwrite($fp, $delfile[$i]); 19 } 20 else { 21 if ($deldata[4] === $pass3del) { 22 $err_msg6 = $delete . "番の消去に成功しました。"; 23 } 24 else { 25 $err_msg8 = $delete . "番の消去に失敗しました。パスワードが間違っています。"; 26 fwrite($fp, $delfile[$i]); 27 } 28 } 29 } 30 if ( ($err_msg6 === '') && ($err_msg8 === '') ) { 31 $err_msg6 = $delete . '番に一致するものを見つけられませんでした。'; 32 } 33 } 34}

消去フォームでもtrim()忘れてたりしてたし。

投稿2019/12/24 10:44

編集2019/12/24 11:28
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

huku

2019/12/30 12:02

非常に細かくありがとうございます! とても助かりました。 しかし、段落数で投稿番号をつけているため、消去した場合、同じ番号がだぶる状態になっています。 そこで、最大値にプラスして投稿番号をつける方法にしようと考え、コードを書いたのですが、なぜか1が二回登場してしまいます。 コードは上に追加いたします。 助言いただけないでしょうか? よろしくお願いします。
guest

0

php

1$file="231536_receive.txt"; 2$files = file('231536_receive.txt'); 3$count=1; 4$fileinside = file_get_contents($file); 5if ($fileinside === "") { 6 $count=1; 7} else { 8 // 2ループ処理 9 for ($i=0; $i<count($files); $i++){ 10 $numraw = explode("<>", trim($files[$i])); 11 $numpoint = $numraw[0]; 12 // 最大値より配列の値が大きければ上書きをする 13 if($count <= $numpoint){ 14 $count= (int)$numpoint+1; 15 } 16 } 17 } 18

このように記述し、表示部分を

php

1$file="231536_receive.txt"; 2 $file_name = "231536_receive.txt"; 3 // ファイルを読み込み変数に格納 4 $fileinside = file_get_contents($file); 5 if ($fileinside === "") { 6 echo "投稿がありません"; 7 } else { 8 // 読み込むファイル名の指定 9 $file_name = "231536_receive.txt"; 10 // ファイルを全て配列に入れる 11 $ret_array = file( $file_name ); 12 13 // 取得したファイルデータ(配列)を全て表示する 14 for( $i = 0; $i < count($ret_array); ++$i ) { 15 $echo_array = explode("<>", $ret_array[$i]); 16 17 // // 配列を順番に表示する 18 echo ( $echo_array[0]."<>".$echo_array[1]."<>".$echo_array[2]."<>".$echo_array[3]."<br />\n" ); 19 } 20 }

このように変更するとうまく動くようになりました。
おそらく表示部分に問題があったものと思われます。
回答くださった方々ありがとうございました。

投稿2020/01/23 09:51

huku

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問