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

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

ただいまの
回答率

88.59%

Notice: Undefined offsetのエラーが出て困っています。

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 519

ciel2231

score 10

PHP、CSVで掲示板を作成しています。
動作確認をしたところ

<li><?php echo nl2br($row[1]); ?>(<?=$row[0]?>)</li>の部分で「Notice: Undefined offsetのエラー:1」と出てきます。

どう直せばいいのかご教示よろしくお願いいたします。

function h($str){
 return htmlspecialchars($str,ENT_QUOTES,'UTF-8');
}

$name=(string)filter_input(INPUT_POST,'name');
$message=(string)filter_input(INPUT_POST,'message');

$fp = fopen('keijiban.csv','a+b');
if($_SERVER['REQUEST_METHOD']==='POST'){
  fputcsv($fp,[$_POST['name'], $_POST['message']]);
  rewind($fp);
 }
while($row = fgetcsv($fp)){
    $rows[] = $row;
}
fclose($fp);

?>


<!DOCTYPE html>
<html lang="ja">
<head>
 <meta charset="utf-8">
 <title> 簡易掲示板</title>
 <link rel="stylesheet" href="keijiban.css">
 <meta name="description" content="簡易掲示板です。">
 <meta name="viewport" content="width=device-width,initial-scale=1"
</head>
<body>

 <h1>簡易掲示板</h1>
  <form method="POST" action="">
<div>
   <label for="name">名前</label>
   <input type="text" id="name" name = "name" placeholder="匿名さん">
 </div>
 <div>
   <label for="message">メッセージ</label>
   <textarea name="message"  cols="30" rows="5" maxlength="100" placeholder="本文"></textarea>
  <br>
  <input type="submit" value="送信する" class="button">
  </div>
 </form>

  <h2>投稿一覧</h2>

 <?php if (!empty($rows)): ?>
  <ul>
 <?php foreach ($rows as $row): ?>
    <li><?php echo nl2br($row[1]); ?>(<?=$row[0]?>)</li>
  <?php endforeach; ?>
  </ul>
 <?php else: ?>
  <p>投稿はまだありません</p>
 <?php endif; ?>


</body>
</html>

var_export($rows);で出力した場合です。
array ( 0 => array ( 0 => 'テスト,メッセージ', ), 1 => array ( 0 => 'テスト1', 1 => '', ), 2 => array ( 0 => '', 1 => 'メッセージ1', ), 3 => array ( 0 => 'tesuto ', 1 => '', ), 4 => array ( 0 => 'テスト1', 1 => 'メッセージ1', ), 5 => array ( 0 => '匿名,"あああ ', ), 6 => array ( 0 => 'いいい ', ), 7 => array ( 0 => 'ううう"', ), )
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2020/03/09 11:36

    すみません、前言撤回します。 var_export($rows);でお願いできますか?(var_dumpと違い回答者側で再現しやすいため)

    キャンセル

  • ciel2231

    2020/03/09 11:37

    了解しました。

    キャンセル

  • kei344

    2020/03/09 11:40

    コードブロックが外れていますよ。コードブロックは ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。

    キャンセル

回答 3

+2

keijiban.csv
の中身を直接エディタで読み込むなどして確認してください。

<li><?php echo nl2br($row[1]); ?>(<?=$row[0]?>)</li>

$row[1]もしくは$row[0]に該当するデータが入っていない可能性があります。

例えば、名前のみの投稿や、本文だけの投稿等の場合、テストしていますか?


var_export($rows);の出力をみると、
0 => と
1 => が必ずしもセットになっていない箇所がいくつもあり、
0 => のみの箇所がエラーメッセージ出力の原因になっています。

やり方として、

1)出力直前に、$row[1]の有無を検査を追加、存在しなければ仮にでも $row[1] をカラ文字列を詰める。

2)そもそも本文($message)がカラであることを許容しているのが悪いので、
csvファイルに出力する前に検査する処理を追加。

3)keijiban.csv に既にできてしまっている不正なデータが邪魔なので、
該当行を削除して再度テストする。

など。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/09 11:15

    本文だけの場合はうまく表示されます。
    名前のみや、名前と本文だと、Notice: Undefined offset: 1が表示されてしまいます。

    キャンセル

  • 2020/03/09 11:24

    そもそも、本文なし投稿を許容している時点で、ダメなんじゃないかな。
    filter_input使ったことで、$messageはカラ文字列(文字列長ゼロの文字列)であり、
    それを検出してエラーメッセージを表示して記録しないようにすると良いかと。

    キャンセル

+1

csvに何もデータ保存されてない状態でこのエラー出てませんか?
下記をfcloseの次の行あたりに入れて出力内容確認してみてください。

var_dump($rows);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/09 11:11

    CSVデータには送信データ保存されているんですよね。

    キャンセル

  • 2020/03/09 11:58

    後出しはご勘弁を。
    よほど特殊な事情や機微な情報でなければ提示しておいて損はないですし、お互い無駄がなくなります。

    キャンセル

  • 2020/03/09 12:02

    それに回答後半のデバッグの方が大事です。

    キャンセル

+1

すでに指摘があるとおり、$row[1]の中身が入っていないデータが多数あります。CSVもPHPで生成しているのであれば、生成コードを修正したほうがよいです。

array(8) {
  [0]=>
  array(1) { // 1件しか入っていない
    [0]=>
    string(25) "テスト,メッセージ"
  }
  [1]=>
  array(2) {
    [0]=>
    string(10) "テスト1"
    [1]=>
    string(0) ""
  }
  [2]=>
  array(2) {
    [0]=>
    string(0) ""
    [1]=>
    string(16) "メッセージ1"
  }
  [3]=>
  array(2) {
    [0]=>
    string(7) "tesuto "
    [1]=>
    string(0) ""
  }
  [4]=>
  array(2) {
    [0]=>
    string(10) "テスト1"
    [1]=>
    string(16) "メッセージ1"
  }
  [5]=>
  array(1) { // 1件しか入っていない
    [0]=>
    string(18) "匿名,\"あああ "
  }
  [6]=>
  array(1) { // 1件しか入っていない
    [0]=>
    string(10) "いいい "
  }
  [7]=>
  array(1) { // 1件しか入っていない
    [0]=>
    string(10) "ううう\""
  }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/09 11:54

    fputcsv関数を使ってCSVファイルを出力してるのですが、そのコードを修正ということですか?

    キャンセル

  • 2020/03/09 11:57

    そうですね。1件しか入っていないデータがどうやってできるかを検証しつつ、そういうことが無いように組めばよいです。

    キャンセル

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

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る