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

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

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

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

Q&A

解決済

1回答

1646閲覧

変数にゴミが入っているということに関する質問

yohu_gakusei

総合スコア13

PHP

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

0グッド

1クリップ

投稿2021/06/10 09:32

今回とあるコードでプログラムを作りました。いわば掲示板のようなもので
'edit_post'という変数が空かどうかということでif文を用いて場合分けを行っております。
今回、$edit = '';
という$editに空の初期値を与えましたが、今回この初期値がない場合条件分岐が
if(empty($_POST ['edit_post' ]))
ではなくelseのほうに行ってしまいます。調べたところ変数には定義しないとゴミのようなものが入ることがあると書いてあり、原因はこれかもと予想しました。そのため下のほうにあるhtmlの
<input type="hidden" name="edit_post" value="<?php echo $edit; ?>">
で$editになにかゴミのようようなものがあるため"edit_postが値を持ってしまったのかもしれないと考えました。そこでお聞きしたいのは僕の予測は正しいのかということです。もしも違っていた場合はどうしてこうのように空の初期値を与えないとしたのelseに条件分岐してしまうのかも教えていただきたいです。
初心者故、丁寧に解説していただけると幸いです。

php

1<?php 2 $filename = "kadai_2_1.txt"; 3 $editName = ''; 4 $editComment = ''; 5 $edit = ''; 6 7 if(isset($_POST[ 'name' ])&&isset($_POST[ 'opinion' ])){ 8 $name = $_POST[ 'name' ]; 9 $opinion = $_POST[ 'opinion' ]; 10 $date = date('Y-m-d H:i:s'); 11 12 13 14 15 16 if(empty($_POST ['edit_post' ])){ 17 18 $fp = fopen($filename,"a"); 19 $fileLaw = file($filename, FILE_IGNORE_NEW_LINES); 20 if(count($fileLaw)==0){ 21 22 $numSecond = 1; 23 }else{ 24 $line = end($fileLaw); 25 $lastNum = explode("<>", $line); 26 $numSecond = $lastNum[0]+1; 27 28 } 29 30 fwrite($fp,$numSecond."<>".$name."<>".$opinion."<>".$date."\n"); 31 fclose($fp); 32 }else{ 33 $fileLaw = file($filename, FILE_IGNORE_NEW_LINES); 34 $fp = fopen($filename,"w"); 35 $editNum = $_POST[ 'edit_post' ]; 36 for($i = 0; $i < count($fileLaw); $i++){ 37 $line = explode("<>",$fileLaw[$i]); 38 if($editNum == $line[0]){ 39 fwrite($fp,$editNum."<>".$name."<>".$opinion."<>".$date."\n"); 40 }else{ 41 fwrite($fp,$fileLaw[$i]."\n"); 42 } 43 44 }fclose($fp); 45 } 46 } 47 48 if(isset($_POST[ 'delete' ])){ 49 $delete = $_POST[ 'delete' ]; 50 $fileLaw = file($filename, FILE_IGNORE_NEW_LINES); 51 $fp = fopen($filename,"w"); 52 53 for($n = 0; $n < count($fileLaw); $n++){ 54 $line = explode("<>",$fileLaw[$n]); 55 $leadNumber = $line[0]; 56 if($leadNumber != $delete){ 57 58 fwrite($fp,$line[0]."<>".$line[1]."<>".$line[2]."<>".$line[3]."\n"); 59 60 } 61 } 62 fclose($fp); 63 } 64 if(isset($_POST[ 'edit' ])){ 65 $edit = $_POST[ 'edit' ]; 66 $fileLaw = file($filename, FILE_IGNORE_NEW_LINES); 67 for($n = 0; $n < count($fileLaw); $n++){ 68 $line = explode("<>",$fileLaw[$n]); 69 $leadNumber = $line[0]; 70 if($leadNumber == $edit){ 71 $editName = $line[1]; 72 $editComment = $line[2]; 73 } 74 } 75 } 76 77 78 79 80 81 82?> 83<!DOCTYPE html> 84<html> 85<head> 86<meta charset="utf-8"> 87<title></title> 88</head> 89<body> 90<form action="" method="POST"> 91<input type="hidden" name="edit_post" value="<?php echo $edit; ?>"> 92<p>お名前: 93<input type="text" name="name" value="<?php echo $editName; ?>"> 94</p> 95<p>コメント:</p> 96<p><textarea name="opinion" cols="50" rows="5"><?php echo $editComment; ?></textarea></p> 97<p><input type="submit" name="submitBtn" value="送信"></p> 98</form> 99<form action="" method="POST"> 100<p>削除したい番号を指定:</p> 101<p><input type="text" name="delete"> 102<input type ="submit" name="deleteBtn" value="削除"></p> 103</form> 104</body> 105</html> 106<form action="" method="POST"> 107<p>編集したい番号を指定:</p> 108<p><input type="text" name="edit"> 109<input type ="submit" name="editBtn" value="編集"></p> 110</form> 111<p>以下コメント</p> 112<?php 113 if(file_exists($filename)){ 114 115 116 $fp = fopen($filename, 'r'); 117 while (!feof($fp)) { 118 $txt = fgets($fp); 119 echo $txt.'<br>'; 120 } 121 } 122?> 123</body> 124</html>

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

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

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

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

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

m.ts10806

2021/06/10 09:35

var_dumpで確認すればわかることでは? 「ゴミのようなものが入る」とは何を読みましたか? 出典明示してください
m.ts10806

2021/06/10 10:23

質問編集して本文に追記願います
guest

回答1

0

ベストアンサー

PHP: empty - Manual
PHP isset, empty, is_null の違い早見表 - Qiita

empty()で判断するの、危険なんだよ。
0が入っていても、''(文字列長ゼロの文字列)が入っていてもemptyとみなされてtrueになっちゃう。

それと、もしも、複数行入力できるtextareaで入力させている時、
改行を含む文字列を受信した時、
そのままデータファイルに出力しちゃうと、
改行コードでデータが途切れてしまうので、
それでデータファイルを破壊するって話はある。

ファイル上、

数字<>名前<>意見<>日付
数字<>名前<>意見<>日付
数字<>名前<>意見<>日付
数字<>名前<>意見<>日付

ってなるのが、

数字<>名前<>意見<>日付
数字<>名前<>意
見<>日付
数字<>名前<>意見<>日付
数字<>名前<>意見<>日付

みたいになる。

そういうときは、改行コードを含むか検査して、別の差し支えない文字に置き換えて使ったりする。
改行コードは、\x0d(CR)や\x0a(LF)あるいは\x0d\x0a(CRLF)など、webブラウザを実行している環境によってコードが変わる可能性もあるので、
それらを含む場合に置き換えるような関数を加える。

PHPで改行コードを統一する関数: CRLF, CR, LF が混在してる文字列を LF に変換するなど - Qiita
↑ この記事で紹介されている、function convertEOL()など参考にして、

$opinion = preg_replace("/\r\n|\r|\n/", '<LF>', $opinion);

とすることで一旦改行コードが無効化されるので、
保存する処理に加えるといいかも。

戻すときは

$opinion = str_replace('<LF>', PHP_EOL, $opinion);

とすることで(PHPを実行している環境に合わせた)改行コードに変わります。
これなら、必ずデータが1行分に収まります。

もう一つ別の手があって、
1行分読み込んで、データ区切りの「<>」で分解したときの個数を判定し、
足りなければ次の1行も読み込んで改行文字を加えたうえで連結します。
ファイルからの読み込み処理が少し煩雑になりますけど、やれない話ではないです。

投稿2021/06/10 09:40

編集2021/06/11 00:41
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yohu_gakusei

2021/06/10 09:51

返信ありがとうございます。なら今回は!issetを用いればうまくいったということでしょうか?
退会済みユーザー

退会済みユーザー

2021/06/10 09:52

加筆した方の内容が、根本原因だと思うので、もう一度ご確認を。
yohu_gakusei

2021/06/10 10:07

返信ありがとうございます。今回textareaに原因があるとは思いませんでした、確かにおっしゃる通り改行があると番号が表示されないことがわかりました、根本的な解決にはなりませんがなら今回コメントをtextareaではなく名前のフォームのように一行の入力にすればの治るということでしょうか?
退会済みユーザー

退会済みユーザー

2021/06/10 12:43

仕様、もしくは、こういう風に作りたい、というもの次第ではないでしょうか。 改行文字を含めて投稿を受け付けたいのであれば、 textareaで受け付けた文字入力に含まれる改行コードをファイル保存用に一旦置き換える必要があります。 それをやりたいかどうか、ではなく、実現したいかどうかで考えてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問