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

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

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

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

Q&A

解決済

1回答

1658閲覧

phpのファイル書き込みについて

kazoogon

総合スコア281

PHP

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

0グッド

0クリップ

投稿2016/11/12 16:42

さきほどphpで簡単な掲示板を作ってみたのですが、今度は違う書き方(簡単に)を自分なりに書いてみましたがうまくいきません。どこがどういけないのでしょうか?
今はファイルの書き込みですでにつまずいています。

<?php $bbs='bbs.txt'; if($_SERVER['REQUEST_METHOD']==='POST'){ $name=$_POST['name']; $comment=$_POST['comment']; $lenname=mb_strlen($name,'utf-8'); $lencomment=mb_strlen($comment,'utf-8'); if($name||$comment===" "){ echo '記入されてません'; }else if($lenname>20){ echo '*名前は20文字以内'; }else if($lencomment>120){ echo '*コメントは120文字文字以内'; }else{ fwrite(bbs.txt,date('M月d日 H:i:s').' '.$name.' '.$comment."\n"); } } ?> <form action="bbs.txt" method="POST"> <p>名前</p> <p><input type="text" name="name"></p> <p>コメント</p> <p><textarea name="comment"></textarea></p> <p><input type="submit" value="送信!"></p> </form>

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

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

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

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

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

guest

回答1

0

ベストアンサー

期待されているであろう挙動になるよう修正いたしました。

php

1 2<?php 3// index.php として保存 4 5date_default_timezone_set("asia/Tokyo"); // タイムゾーン設定 6 7$bbs='bbs.txt'; 8 9 if($_SERVER['REQUEST_METHOD'] === 'POST'){ 10 $name = $_POST['name']; 11 $comment = $_POST['comment']; 12 13 $lenname = mb_strlen($name,'utf-8'); 14 $lencomment = mb_strlen($comment,'utf-8'); 15 16 if($name === "" || $comment=== ""){ // $nameが空 または $commentが空 17 echo '記入されてません'; 18 }else if($lenname>20){ 19 echo '*名前は20文字以内'; 20 }else if($lencomment>120){ 21 echo '*コメントは120文字文字以内'; 22 }else{ 23 // ファイルを開いて、書き込んで、閉じる一連の動作をしてくれる (fwriteは書き込みのみ) 24 file_put_contents($bbs, date('m月d日 H:i:s'). ' '.$name.' '.$comment."\n", FILE_APPEND); 25 } 26 } 27?> 28 29<!-- submitボタンを押すと、actionに書かれているアドレスにアクセスする --> 30<form action="index.php" method="POST"> 31 <p>名前</p> 32 <p><input type="text" name="name"></p> 33 <p>コメント</p> 34 <p><textarea name="comment"></textarea></p> 35 <p><input type="submit" value="送信!"></p> 36</form> 37 38

html部分

html部分では一点変更しています。

formタグ

<form action="index.php" method="POST">
「フォーム内のsubmitボタンが押されたとき、index.phpPOSTでアクセスする」
ことを表します。
本ファイルを index.php とすることで、submitボタンが押された際に
formタグ内のデータを持った状態で index.php 内の php プログラムを走らせることが出来ます。

(ちなみに、最初にブラウザからアクセスする時は自動的にGETでアクセスします。
if($_SERVER['REQUEST_METHOD'] === 'POST')は通常のアクセスとsubmitボタンからのアクセスを
振り分けるために利用されていますね)

PHP部分

PHP部分では3点変更をしています。

date_default_timezone_set

最初に date_default_timezone_set("asia/Tokyo");を入れることで
利用するタイムゾーンを設定しています。
date()を利用する際には基本的に必要です。
(ただし、サーバーの設定ファイルに明記されている場合はここで明記する必要はありません)

if($name === "" || $comment=== "")

提示されていましたif($name||$comment===" ")ですと、
$nametrueまたは$content (スペース一つ)の場合」
と解釈されます。
未記入を弾く為でしたらif($name === "" || $comment=== "")
表記する必要があります

(蛇足ですが、このあたりはよりよい表記として

  • isset()を使う方法
  • そもそも$_POST[]でなくfilter_input()を使用する

等の話もあります。将来余裕が出来た時に改めて学習されると良いでしょう)

file_put_contents

fwrite()file_put_contents()へ変更しました。

ファイルへの書き込みについては、手順として

  1. ファイルを開く
  2. ファイルへ書き込む
  3. ファイルを閉じる

の順で操作する事が要求されます。

それぞれに対応する命令はfopen(), fwrite(), fclose() なので
これらを順に呼び出せば書き込みは可能です。

ただ、その一連の動作をまとめて行ってくれる関数として
file_put_contents()が予め存在しているので、
こちらを使用することで代替しました。

最後にちょっとしたコメントを入れさせて貰います。

簡単に質問の履歴を見せていただきましたが、独学でプログラミングを勉強されているのでしょうか?
是非とも頑張っていただきたい所です。

今回のご質問については、修正箇所が数カ所ありましたが、
このような状況ですと何が原因か分かりにくい状態となってしまいます。

まず、エラーが出た際には、(良く言われる「エラーログを読む」のも大切ですが、)
どこが問題なのかを把握するために極力外せそうな処理を外して試行してみるのも良いかと思います。

例えば、if文での記入確認部分は実際の実装時には必要でしょうが、
エラーの出所を探る時には外してしまってfwrite()の表記だけにした方が、
どこで問題が起こっているか分かりやすいですね。

一度書いた内容を消さずとも、行頭に//をつけてコメント化するだけでも書いていないのと同様の状態に出来るので、
そのような方法を利用しても良いでしょう。

php

1// 例 2// if($name||$comment===" "){ 3// echo '記入されてません'; 4// }else if($lenname>20){ 5// echo '*名前は20文字以内'; 6// }else if($lencomment>120){ 7// echo '*コメントは120文字文字以内'; 8// }else{ 9 fwrite(bbs.txt,date('M月d日 H:i:s').' '.$name.' '.$comment."\n"); 10// } 11

極力シンプルな状態で見せていただいた方が回答する側もラクですし、
質問されるときも「このあたりが怪しい」とアタリがつけられるので、より具体的に質問できるでしょう。

少々長くなりましたが、参考になれば幸いです。

投稿2016/11/12 19:48

ezaki

総合スコア204

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

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

kazoogon

2016/11/12 20:05

わかりやすくて詳しい解説ありがとうございます! また質問に回答していただければありがたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問