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

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

詳細はこちら
PHP

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

Q&A

1回答

1185閲覧

簡易掲示板でテキストに投稿内容を保存したい

MakotoIshizawa

総合スコア32

PHP

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

0グッド

0クリップ

投稿2020/01/06 07:37

PHP5.2.4(指定による)
掲示板を作る課題に取り組んでいます。

#背景
以前作ったテキスト保存の掲示板が何かタイプしてしまったのか動作しなくなり、MySQL版のときのように投稿機能だけを取り出して修正をしています。

##試したこと
検索機能を使い変数などのタイプミスがないか調べました。
スペースを可視化し、半角と全角がわかるようにしています。
コピペで取り出したので、余計な要素を削除しました。
各変数を見るとフォームのデータは送信出来ているようです。
fopen,fwrite,の使い方を検索し調べました。
正常に動作していたときのコードを書この質問からコピペし変数名を一致させ試しましたがちゃんと動作しませんでした。

##本題
別の部分が邪魔しているのでしょうか?

###全体のコード

php

1<?php 2session_start(); 3//投稿部分 4$file_name = "keijiban.txt"; //保存するファイル 5$date = date( "Y-m-d H:i" ); //投稿日時 6$delimiter = "<>"; //区切り文字 7$name = ( string )filter_input( INPUT_POST, "name" ); //post送信された投稿者の名前の文字列 8$comment = ( string )filter_input( INPUT_POST, "comment" ); //post送信されたコメントの文字列 9$post_password = ( int )filter_input( INPUT_POST, "post_password" ); //post送信された投稿用パスワード 10$search = array( "\r\n", "\r", "\n", "<>" ); //置き換え時の検索文字 11$replace = array( "<<改行1>>", "<<改行2>>", "<<改行3>>", "&lt;&gt;" ); //置き換える文字 12$replace_name = str_replace( $search, $replace, $name ); //置き換えられた名前 13$replace_comment = str_replace( $search, $replace, $comment ); //置き換えられたコメント 14//投稿番号の定義 15if ( is_file( $file_name ) ) { //ファイルが存在する時 16 //最後の行にプラス1 17 $rows = file( $file_name ); //ファイルを配列として読み込む 18 $lastline = $rows[ count( $rows ) - 1 ]; //行を0からcountするから-1する 19 $num = explode( $delimiter, $lastline ); //区切り文字で分割 20 $lastnum = $num[ 0 ] + 1; //分割した配列から番号だけ取り出し+1 21} else { //ファイルが無かった場合変数の定義を1とする 22 $lastnum = 1; 23} 24//書き込み内容 25$save = implode( $delimiter, array( $lastnum, $replace_name, $replace_comment, $date, $post_password, "\r\n" ) ); //区切り文字を各変数に挿入して保存 26//投稿する 27if ( !empty( $name ) && !empty( $comment ) && !empty( $post_password ) ) { //もし、名前とコメントとパスワードがpost送信された時 28 $fp = fopen( $file_name, "ab" ); //追記・バイナリモードでファイルを開く 29 if ( flock( $fp, LOCK_EX ) ) { //排他ロックできたら 30 fwrite( $fp, $save ); //指定したファイルに書き込み 31 $post_message = "投稿されました"; 32 } else { 33 $post_message = "投稿に失敗しました"; 34 } 35 flock( $fp, LOCK_UN ); //ロックを外す 36 fclose( $fp ); //ファイルを閉じる 37 $_SESSION[ 'post_message' ] = $post_message; 38 /*header( 'Location: toko_text.php', true, 303 ); //二重投稿防止のリダイレクト 39 exit;*/ 40} 41?> 42<!doctype html> 43<html lang="ja"> 44<head> 45<meta charset="utf-8"> 46<title>投稿テキスト版</title> 47<style> 48.akaji { 49 color: red; 50} 51</style> 52</head> 53 54<body> 55<?php 56echo "file_name:"; 57var_dump( $file_name ); 58echo "<br>"; 59echo "save:"; 60var_dump( $save ); 61echo "<br>"; 62echo "lastnum:"; 63var_dump( $lastnum ); 64echo "<br>"; 65echo "name:"; 66var_dump( $name ); 67echo "<br>"; 68echo "comment:"; 69var_dump( $comment ); 70echo "<br>"; 71echo "post_password:"; 72var_dump( $post_password ); 73echo "<br>"; 74echo "post_message:"; 75var_dump( $post_message ); 76echo "<br>"; 77echo "post_message(session):"; 78var_dump( $_SESSION[ "post_message" ] ); 79echo "<br>"; 80?> 81<hr> 82<!--投稿フォーム--> 83<form method="post"> 84 <div> 85 <label for="name">お名前<span class="akaji">【必須】</span></label> 86 <?php 87 if ( isset( $_SESSION[ "post_message" ] ) ) { 88 echo $_SESSION[ "post_message" ]; 89 } 90 ?> 91 <br> 92 <input type="text" name="name" required > 93 <br> 94 </div> 95 <div> 96 <label for="comment">コメント<span class="akaji">【必須】</span></label> 97 <br> 98 <textarea name="comment" cols="30" rows="3" required></textarea> 99 <br> 100 </div> 101 <div> 102 <label for="post_password">パスワード<span class="akaji">【必須】</span></label> 103 <br> 104 <input type="password" name="post_password" required> 105 <br> 106 </div> 107 <input type="submit" value='投稿' > 108</form> 109<?php 110$file_name = "keijiban.txt"; 111$search = array( "<<改行1>>", "<<改行2>>", "<<改行3>>", "&lt;&gt;", ); //置き換え時の検索文字 112$replace = array( "\r\n", "\r", "\n", "<>", ); //置き換える文字 113//XSS対策 114function h( $str ) { 115 return nl2br( htmlspecialchars( $str, ENT_QUOTES, 'UTF-8' ) ); 116} 117//投稿一覧 118if ( !empty( $file_name ) ) { 119 $rows = file( $file_name ); 120 foreach ( $rows as $row ) { 121 $select = explode( $delimiter, $row ); 122 $select = str_replace( $search, $replace, $select ); 123 echo h( $select[ 0 ] ) . "<br>";//番号の表示 124 echo h( $select[ 1 ] ) . "<br>";//名前の表示 125 echo h( $select[ 2 ] ) . "<br>";//コメントの表示 126 echo h( $select[ 3 ] ) . "<br>";//日時の表示 127 } 128} else { 129 echo "<p>投稿はまだありません</p>"; 130} 131?> 132</body> 133</html>

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

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

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

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

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

m.ts10806

2020/01/06 07:40

「動かない」は何が起きているのでしょうか。 エラー表示ONにして確認してみてください。
MakotoIshizawa

2020/01/06 07:43

失礼しました。 エラー表示をonにするのを忘れていました。 あと、textファイルを変えることで解決しました。 解決しました。
guest

回答1

0

別のページとtextファイルを共有していたんですが、もしやそれがいけないのかと思い新たにtextファイルを作成したらうまくいきました。

投稿2020/01/06 07:44

MakotoIshizawa

総合スコア32

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

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

m.ts10806

2020/01/06 07:47

えーと、同時に開こうとしていたということでしょうか。きちんとfclose()してますしクローズを待ってから開くはずなんですけど。 「なんだかわからないけど解決できた」という状態だとよくないと思ってのコメントです。 (解決したこと自体は喜ばしいことです)
MakotoIshizawa

2020/01/06 07:53

すみません。 そうですよね。 なんだかわからないけど解決したんです。 これを解決するには何が必要でしょうか。 エラー表示するようにini_set('display_errors', 1);を入れましたが、何もエラーがありません。
MakotoIshizawa

2020/01/06 09:50

https://norm-nois.com/blog/archives/1826 パーミッションのエラーが出たので確認してみると644になっていました。 以前は777で使えていたのに変更が出来ませんでした。 所有者のせいで変更できないと記事を見て確認してみると、このファイルだけ48になっていました。
m.ts10806

2020/01/06 10:22

644だとPHP実行ユーザー(ここではサーバー上のユーザーなのでブラウザ実行している人ではありません)は読み書き可なのでいけそうには思います。
MakotoIshizawa

2020/01/08 07:29

そうなんですね。 今、またアクセスしてみるとエラーが出ませんでした。 何故、テキストファィルを変えると投稿できるのか謎のままです。 再度、テキストファィルを変えて見ましたが正常に投稿されました。 もとのテキストファイルではやはり投稿できません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問