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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

11889閲覧

Undefined variableとUndefined array key 0 inのエラーの直し方がわかりません。

zake914

総合スコア4

PHP

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/08/25 06:53

編集2021/08/25 07:02

前提・実現したいこと

たびたび質問失礼します。
掲示板を作っており、投稿内容の保存をテキストファイルにし、返信機能もつけたいと思っています。

発生している問題・エラーメッセージ

PHP Warning: Undefined variable $line in /workspace/Main.php on line 158 PHP Warning: Undefined array key 0 in /workspace/Main.php on line 205 PHP Warning: Undefined array key 1 in /workspace/Main.php on line 207

該当のソースコード

pHp

1 2<?php 3 4//変数の初期化 5 6$fname = "data.txt";//ファイル名 7$id = 0;//選択されているデータのID 8$thread = 0;//スレットを示す番号 9$page = 0;//現在のページ番号 10$page_max = 0;//最後のページ番号 11$page_items = 20;//ページあたりの項目数 12$items_max = 0;//最大項目数 13$last_name = "";//ユーザーの名前 14$last_email = "";//ユーザーのメールアドレス 15$last_url = "";//ユーザーのURL 16$new_title = "";//タイトル 17 18//メイン処理の開始 19 20//idのチェック 21if (isset($_GET['id'])){ 22 $id = (int)$_GET['page']; 23} 24//pageのチェック 25if (isset($_GET['page'])){ 26 $page = (int)$_GET['page']; 27} 28 29//データ読み込み、クッキー情報を読み込む 30load(); 31readFormCookie(); 32 33//フォーム送信時の処理 34if (isset($_POST['name'])){ 35 addData(); 36 save(); 37 load(); 38} 39//ここまで 40 41//関数の定義 42 43//クッキーから値を読み込む 44function readFormCookie(){ 45 global $last_name,$last_email,$last_url; 46 //$last_name = $_COOKIE['last_name']; 47 $last_name = @$_COOKIE['last_name']?:null; 48 //$last_email = $_COOKIE['last_email']; 49 $last_name = @$_COOKIE['last_email']?:null; 50 //$last_url = $_COOKIE['last_url']; 51 $last_name = @$_COOKIE['last_url']?:null; 52} 53 54//クッキーに保存する 55function writeToCookie(){ 56 global $last_name,$last_email,$last_url; 57 setcookie('last_name',$last_name,time() + 60 * 60 * 24 * 7); 58 setcookie('last_url',$last_url,time() + 60 * 60 * 24 * 7); 59 setcookie('last_email',$last_email,time() + 60 * 60 * 24 * 7); 60} 61 62//データを読み込む 63function load(){ 64 global $data,$fname; 65 $data = array(); 66 $f = @fopen($fname,'r') or error('ファイルの読み込みに失敗しました。'); 67 while(!feof($f)){ 68 $line = fgets($f); 69 $line = trim($line); 70 if($line != ""){ 71 array_push($data,$line); 72 } 73 } 74 fclose($f); 75 setPageNum(); 76} 77 78//最大ページ数の設定 79function setPageNum(){ 80 global $data,$page_max,$page_items; 81 $page_max = (int)((count($data)-2)/$page_items); 82} 83 84//データを保存する 85function save(){ 86 global $data,$fname; 87 $f = fopen($fname,'w') or error('ファイルの読み込みに失敗しました。'); 88 foreach($data as $line){ 89 $line2 = trim($line); 90 if ($line2 != ""){ 91 fputs($f,$line2 . "¥r¥n"); 92 } 93 } 94 fclose($f); 95} 96 97//送信されたフォームをデータに追加する 98function addData(){ 99 global $data,$last_email,$last_name,$last_url; 100 $set_thread = (int)$_POST['thread']; 101 $title = htmlspecialchars($_POST['title']); 102 $name = htmlspecialchars($_POST['name']); 103 $email = htmlspecialchars($_POST['email']); 104 $url = htmlspecialchars($_POST['url']); 105 $comment = htmlspecialchars($_POST['comment']); 106 $comment = mb_ereg_replace("¥r¥n","<br>".$comment); 107 $comment = mb_ereg_replace("¥r","<br>".$comment); 108 $comment = mb_ereg_replace("¥n","<br>".$comment); 109 $time = time(); 110 $line = $title . "¥t". $name . "¥t" . $email . "¥t" . $url . "¥t". $comment . "¥t" . $time; 111 112 $num = 0; 113 $n = count($data); 114 $flg = false; 115 for($i = 1;$i < $n;$i++){ 116 $arr = explode("¥t",$data[$i]); 117 if ($sel_thread == (int)$arr[0]){ 118 $line = arr[0] . "¥t" .$line; 119 array_splice($data,$i,0,$line); 120 $flg = ture; 121 break; 122 } 123 } 124 if(!$flg){ 125 $arr = explode("¥t",$data[$n -1]); 126 $line = ($arr[0] + 1) . "¥t" . $line; 127 array_push($data,$line); 128 } 129 delOldItem(); 130 //クッキーに保存 131 $last_name = $name; 132 $last_email = $email; 133 $last_url = $url; 134 writeToCookie(); 135} 136 137//最初の項目を削除する 138function delOldItem(){ 139 global $data,$items_max; 140 if(count($data)>($items_max + 1)){ 141 $line = $data[0]; 142 array_shift($data); 143 array_shift($data); 144 array_unshift($data,$line); 145 } 146} 147 148//指定のidデータを返す 149function getData($n){ 150 global $data; 151 $str = ""; 152 foreach($data as $line){ 153 $arr = explode("¥t",$line); 154 if($arr[6] == $n){ 155 $str = $line; 156 break; 157 } 158 } 159 return $line; 160} 161 162//タイトルの表示 163function writeFromTitle(){ 164 global $id; 165 if ($id <= 0){ 166 echo"<h3>新たなスレッドで投稿する</h3>"; 167 } else { 168 echo"<h3>このスレッドに投稿する</h3>"; 169 } 170} 171 172//idの値のデータを書き出す 173function writeData(){ 174 global $id,$page,$thread,$new_title; 175 $line = getData($id); 176 if($id <= 0){ 177 echo "<h3>*選択されたデータはありません。</h3>"; 178 return; 179 } 180 $arr = explode("¥t",$line); 181 $thread = $arr[0]; 182 $new_title = "RE: ".$arr[1]; 183 $date_text = date('Y/n/j H:i:s' ,$arr[6]); 184 echo "<table width='600'>"; 185 echo "<tr><th class='sel_title¥'colspan='2'>" 186 . $arr[1] . "(" .$date_text .") </th></tr>"; 187 echo "<tr><td width='100'>投稿者:</td><td>" 188 . $arr[2] . " [" . $arr[3] . "]</td></tr>"; 189 echo "<tr><td>WEBサイト:</td><td>" . $arr[4] . "</td><tr>"; 190 echo "<tr><td>内容:</td><td>" .$arr[5] . "</td></tr>"; 191 echo "</table>¥r¥n"; 192 echo "<form method='POST' action='index.php?page=" 193 . $page ."'>¥r¥n"; 194 echo "<input type='submit' value='戻る'>¥r¥n"; 195 echo "</form>¥r¥n"; 196} 197 198//データをテーブルに書き出す 199function writeTable(){ 200 global $data,$page,$page_items; 201 $num = count($data) - 1; 202 $start = $num - $page * $page_items; 203 $end = $start - $page_items; 204 if ($end < 0){ $end = 0;} 205 echo "<table border='1' width='300'>¥r¥n"; 206 $line = $data[0]; 207 $arr = explode("¥t",$line); 208 echo "<tr class='header'><th>" . $arr[1] . "</th>¥r¥n"; 209 $n = count($data); 210 $last_thread = 0; 211 for($i = $start; $i > $end; $i--){ 212 $line = $data[$i]; 213 if ($line == "") next; 214 $arr = explode("¥t",$line); 215 echo "<tr><td>"; 216 if ($last_thread == $arr[0]){ echo "¬"; } 217 echo "<a href='index.php?=id=" .$arr[6] . "&page=" 218 . $page . "'>" .($arr[1] == "" ? "(無題);" : 219 $arr[1]). "</a></td></tr>¥r¥n"; 220 $last_thread = $arr[0]; 221 } 222 223 echo "</table>¥r¥n"; 224} 225 226//ページ番号の表示 227function writePageNum(){ 228 global $page,$page_max; 229 for ($i = 0;$i <= $page_max;$i++){ 230 if ($page == $i){ 231 echo ($i + 1) . " "; 232 }else { 233 echo "<a href='index.php?page=".$i."'>".($i + 1)."</a>"; 234 } 235 } 236} 237 238 239//エラー時の処理 240function error($msg){ 241?> 242<html> 243 <head> 244 <meta http-equiv="content-type" content="test/html; charset=sjis"> 245 <title>ミニイタ</title> 246 </head> 247 <body> 248 <h3>ERROR</h3> 249 <?php echo $msg; ?> 250 </body> 251</html> 252<?php 253 exit(); 254} 255 256//ここまで 257?> 258 259<html> 260 <head> 261 <meta http-equiv="content-type" content="test/html; charset=sjis"> 262 <title>ミニイタ</title> 263 <style type="test/css"> 264 <!-- 265 .title { font-size:14px; 266 line-height: 16px; 267 padding: :2px 2px 2px 2px; 268 background-color: rgb(200,200,255);} 269 .header {background-color: rgb(200,255,200);} 270 .sel_title {text-align: left;} 271 --> 272 </style> 273 </head> 274 <body> 275 <h3 class="title">イタ</h3> 276 <?php writeData(); ?> 277 <hr> 278 <?php writeFromTitle(); ?> 279 <from method="POST" action="index.php"> 280 <input type="hidden" name="thread" value="<?php echo $thread; ?>" 281 <table> 282 <tr><td>タイトル</td><td> 283 <input type="text" name="title" size="60" value="<?php echo $new_title;?>"> 284 </td></tr> 285 <tr><td>email</td><td> 286 <input type="text" name="email" size="60" value="<?php echo $last_email;?>"> 287 </td></tr> 288 <tr><td>WEBサイト</td><td> 289 <input type="text" name="url" size="60" value="<?php echo $last_url;?>"> 290 </td></tr> 291 <tr><td>内容</td><td> 292 <textarea name="comment" cols="40"></textarea> 293 </td></tr> 294 <tr><td></td><td><input type="submit" value="送信"></td></tr> 295 </table> 296 </from> 297 <hr> 298 299 <?php writePageNum(); ?> 300 <br> 301 <?php writeTable(); ?> 302 303 </body> 304</html> 305

試したこと

前の質問の回答者より、2つ目のエラーは配列に値がないことによるエラーだとわかり、コードを確認してみたのですが、値が配列に入っているようにしか考えられず、困っています。
また、1つ目のエラーは、未定義の変数があることが問題らしいのですが、どういうことなのかわかりません。
一つ目のエラーは、変数の前に「@」をつけることで解決しました。

なお、前の質問はこちらです。
https://teratail.com/questions/356068

補足情報(FW/ツールのバージョンなど)

質問に不足している内容があれば、教えてください。
訂正させていただきます。
どうぞよろしくお願いします。

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

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

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

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

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

guest

回答2

0

一つ目のエラーは、変数の前に「@」をつけることで解決しました。

エラー出力を抑止しているだけなので実装のまずさを隠しただけで根本的な解決になっていません。

変数にきちんと初期値を与えれば大抵は回避できます。
もちろんデバッグで値がどうなっているかは適宜チェックのこと。

もう一つも同じです。
前の質問の回答のようにキーの存在チェックをしたうえで値を決定すること。
場合により初期値を設定しておく。

こればかりは要件次第ですが、やはりきちんとデバッグできるようになることが今後も加味すると最優先と思います。

投稿2021/08/25 07:01

m.ts10806

総合スコア80871

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

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

0

ベストアンサー

多分、158行目のエラーは

PHP

1return $line; 2↓↓↓ 3return $str;

205行目は$data[0]が存在しないのでフローの問題
207行目は206行目でexplodeしても$lineに\tを含んでいない?ので$arr[0]しか存在しないのでは?

基本的にglobalは使ってはダメです。
引数で受け取ってreturnで持ち出してください

投稿2021/08/25 07:08

yambejp

総合スコア115275

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

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

zake914

2021/08/25 07:32

ご回答ありがとうございます。 205行目は$data[0]が存在しないというのはわかりましたが、フローの問題とはどういうことでしょうか。 どのように直せば良いのでしょうか。
yambejp

2021/08/25 07:36

グローバルの$dataを参照しているので、 どこかのフローで$dataを適切に設定する必要があるということです。 それがどこなのかはご自身で追跡してみてください
zake914

2021/08/25 08:05

承知しました。 がんばります。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問