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

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

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

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

Q&A

解決済

1回答

1018閲覧

掲示板で投稿がない場合に「まだ投稿がありません」と表示させたい

MakotoIshizawa

総合スコア32

PHP

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

0グッド

0クリップ

投稿2019/09/25 05:20

投稿の表示の用のコードを最初はis_fileだけで書いていました。
全ての投稿を削除してみると何も表示されませんでした。
is_file での分岐で投稿を分岐すると、何も書いていない時に何も表示されません。
&&をつけて!is_nullにすると投稿が有っても「まだ投稿がありません」と表示されてしまいます。
更に$filname !==""を加えても同様です。
is_file と$filname!==""だとis_file だけの場合と同様でする

php

1<?php 2/*もしポストで送信されたら以下の処理を行いGET送信でリダイレクトする(更新時の二重書き込み防止)*/ 3if ( $_SERVER[ 'REQUEST_METHOD' ] === 'POST' ) { /*もしPOSTで送信されたら*/ 4 5 /*フォームで送信された値を受け取り、テキストファイルに保存する。 6 その際1行ごとに「{番号}<>{名前}<>{コメント}<>{投稿された時間}」と言う形で保存する*/ 7 //変数の定義 8 $filename = "keijiban.txt"; /*保存するファイル*/ 9 $name = $_POST[ 'name' ]; /*投稿者の名前*/ 10 $comment = $_POST[ 'comment' ]; /*投稿するコメント*/ 11 $date = date( "Y-m-d H:i" ); /*投稿日時*/ 12 $search = array( "\r\n", "\r", "\n", "<>" ); //置き換え時の検索文字 13 $replace = array( "<<改行>>", "<<改行>>", "<<改行>>", "&lt;&gt;" ); //置き換える文字 14 $deleteNO = $_POST[ 'deleteNO' ]; /*削除番号の変数定義*/ 15 //投稿番号の定義 16 if ( is_file( $filename ) ) { /*ファイルの存在確認。*/ 17 //最後の行にプラス1 18 $ret_array = file( $filename ); 19 $lastline = $ret_array[ count( $ret_array ) - 1 ]; 20 $num = explode( '<>', $lastline ); 21 $lastnum = $num[ 0 ] + 1; 22 } else { /*ファイルが無かった場合変数の定義を1とする*/ 23 $lastnum = 1; 24 } 25 26 //書き込み内容 27 $hozon = $lastnum . "<>" . str_replace( $search, $replace, $name ) . "<>" . str_replace( $search, $replace, $comment ) . "<>" . $date . "\n"; 28 29 //投稿部分 30 if ( !empty( $_POST[ 'name' ] ) && !empty( $_POST[ 'comment' ] ) ) { /*もし名前とコメントが送信されたら*/ 31 $fp = fopen( $filename, "a" ); /*追記モードでファイルを開く*/ 32 if ( flock( $fp, LOCK_EX ) ) { /*ロックする*/ 33 fwrite( $fp, $hozon ); /*指定したファイルに追記モードで書き込み*/ 34 } 35 flock( $fp, LOCK_UN ); 36 fclose( $fp ); 37 } 38 //削除部分 39 if ( !empty( $_POST[ 'deleteNO' ] ) ) { //もし、削除番号がポスト送信されたら 40 $deleteNO = $_POST[ 'deleteNO' ]; //削除番号の変数定義 41 $ret_array = file( $filename ); //ファイルを配列として読み込む 42 //unlink($filename); 43 //file_put_contents($filename,$hozon,FILE_APPEND|LOCK_EX); 44 $fp = fopen( $filename, "w" ); 45 if ( flock( $fp, LOCK_EX ) ) { 46 foreach ( $ret_array as $value ) { //ループ 47 $bangou = explode( "<>", $value ); //<>で分割し投稿番号取り出す 48 if ( $deleteNO !== $bangou[ 0 ] ) { //もし読み込んだ番号と送信した番号が違ったら 49 fwrite( $fp, $value ); //ファイルに書き込む 50 } 51 } 52 } 53 flock( $fp, LOCK_UN ); //ロック開放 54 fclose( $fp ); 55 } 56 57 header( 'Location: keijiban.php' ); 58 exit; 59} 60?> 61<!doctype html> 62<html lang="ja"> 63<head> 64<meta charset="utf-8"> 65<title>簡易掲示板</title> 66</head> 67 68<body> 69<form action="keijiban.php" method="post" > 70 <label for="name-field">お名前<span style="color: red;">【必須】</span><br> 71 </label> 72 <input type="text" name="name" id="name-field" required="required"> 73 <label for="comment">コメント<span style="color: red;">【必須】</span></label> 74 <br> 75 <textarea name="comment" cols="30" rows="3" id="comment" required="required"></textarea> 76 <input type="submit" value="投稿"> 77</form> 78<form action="keijiban.php" method="post"> 79 <label for="deleteNO" >削除対象番号</label> 80 <input type="text" name="deleteNO" id="deleteNO" > 81 <input type="submit" value=”削除”> 82</form> 83<?php 84$filename = "keijiban.txt"; 85$search = array( "<<改行>>", "&lt;&gt;" ); //置き換え時の検索文字 86$replace = array( "<br>", "<>" ); //置き換える文字 87if ( is_file( $filename ) && !is_null( $filname ) && $filename !=="" ){ 88 $ret_array = file( $filename ); 89 foreach ( $ret_array as $value ) { 90 $bunkatu = explode( "<>", $value ); 91 foreach ( $bunkatu as $value2 ) { 92 echo str_replace( $search, $replace, $value2 ) . "<br>\n"; 93 } 94 } 95} else{ 96 echo "まだ投稿はありません"; 97} 98 99?> 100</body> 101</html>

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

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

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

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

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

guest

回答1

0

ベストアンサー

$ret_array = file( $filename );の次にでもif(empty($ret_array) === false)で条件分岐すればよいかと

投稿2019/09/25 05:26

rururu3

総合スコア5545

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

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

MakotoIshizawa

2019/09/25 05:37

ありがとうございました。 if(empty($ret_array) === false)でうまくいったのは理解出来たのですが、 元々試したコードでなぜ出来なかったのかが理解できません。 もしお時間が許すなら解説していただけると助かります。
rururu3

2019/09/25 05:42 編集

多分 if ( is_file( $filename ) && !is_null( $filname ) && $filename !=="" ){ でなぜうまく行かなかったのかだと思いますが 上記条件はファイル存在チェックしかしてないためです(ファイル内容に関しては何もチェックしてません) ので中身がなにもないファイルであった場合でも条件的にはtrueになるためです ※多分 if ( is_file( $filename ) && !is_null( $filname ) && $filename !=="" ){ は if ( is_file( $filename ) ){ と一緒のはず
MakotoIshizawa

2019/09/25 05:53

=== falseの部分が中身に関与しているんですか?
MakotoIshizawa

2019/09/25 05:54

配列を取り出してチェックしてるということですね?
rururu3

2019/09/25 05:55

if(empty($ret_array) === false) これの話だったら、emptyは空配列だとtrueを返します
MakotoIshizawa

2019/09/25 05:55

ファイルを読み込んでチェックすることで中身の検証をしたということですね
rururu3

2019/09/25 05:57

そうなります。
MakotoIshizawa

2019/09/25 05:58

if(empty($ret_array) === false)の$ret_arryで中身について操作できて、 emptyの部分を変えると、挙動が変えられると。 何をtrueにしたいかにより変えてやればよいということですね。
MakotoIshizawa

2019/09/25 05:59

では&& !is_null( $filname ) && $filename !=="" )は要らないですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問