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

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

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

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

配列

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

Q&A

解決済

2回答

6272閲覧

PHP Warning: Undefined array key "last_name" というPHPのエラーの直し方がわからず困っています。

zake914

総合スコア4

PHP

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

配列

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

0グッド

0クリップ

投稿2021/08/25 06:03

前提・実現したいこと

PHPを使用し、掲示板を作っています。
テキストファイルに投稿内容を保存し、返信もできるようにしました。

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

PHP Warning: Undefined array key "last_name" in /workspace/Main.php on line 45 PHP Warning: Undefined array key "last_email" in /workspace/Main.php on line 46 PHP Warning: Undefined array key "last_url" in /workspace/Main.php on line 47 PHP Warning: Undefined variable $line in /workspace/Main.php on line 155 PHP Warning: Undefined array key 0 in /workspace/Main.php on line 202 PHP Warning: Undefined array key 1 in /workspace/Main.php on line 204

というエラーが表示され、直す方法がわからず、困っています。

該当のソースコード

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

試したこと

Googleにて調べてみたところ、このエラーメッセージには配列が関わっているということがわかりましたが、それ以上は調べてもわかりませんでした。

このサイトのトップページに書いてあるよう、15分調べてもわからなかったので、(解決しなかったので、)皆様のお知恵を拝借したく、質問した次第です。

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

質問の内容に不備がありましたら教えてください。
訂正させていただきます。

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

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

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

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

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

m.ts10806

2021/08/25 06:12

なんのためにクッキー使ってますか?
zake914

2021/08/25 06:13

はい。 いちいち名前とURL、メールアドレスを入力するのはめんどくさいので、クッキーを使い、自動入力させています。
guest

回答2

0

クッキーに値が保存されてないか、
初回アクセス時だと思います。

初回アクセス時は当該クッキーは存在しないのでそのように出ます。
初期値は空でarray_key_existsで存在するときのみ参照するように実装してください。
※これに限らず配列のキーのチェックはすること

あとはクッキーがちゃんと保持されてるか確認してください。

投稿2021/08/25 06:19

m.ts10806

総合スコア80850

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

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

0

ベストアンサー

$_COOKIE['last_name']が設定されてないからでしょうね

  • $_COOKIE['last_name']を事前に設定するか
  • 設定されてないときに代替で別の値を出力するか

でしょう

あまりおすすめしませんが、こういう処理で対処はできます

PHP

1$last_name = $_COOKIE['last_name']; 2↓↓↓ 3$last_name = @$_COOKIE['last_name']?:null; 4//ちゃんとやるなら 5$last_name = isset($_COOKIE["test1"])?$_COOKIE["test1"]:null

投稿2021/08/25 06:18

編集2021/08/25 06:26
yambejp

総合スコア114837

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

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

zake914

2021/08/25 06:48

ありがとうございます。 コンソールからこのエラーが消えました。 ただ、また新たなエラーにぶつかり困っています。 また新たな質問をさせていただきますので、お答えいただけるとありがたいです。 どうぞよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問