73235


よくわかるPHPの教科書で学習中で掲示板を作成中なのですが、以下のエラーが解除できません。

[code]

    Notice: Undefined index: page in C:\xampp\htdocs\post\index.php on line 35
    
[/code]

参考にした記事  
[Undefined index: page in -
StackOverflow](https://stackoverflow.com/questions/12468275/undefined-index-
page-in)  
[「Notice: Undefined index」と表示されるとき ](https://php1st.com/574)  
[Notice: Undefined indexエラーの原因と解決方法 -
Qiita](https://qiita.com/wakahara3/items/bb7c8d7a1673b161abe7)

[code]

    <?php
    session_start();
    require('../dbconnect.a.php');
    
    if (isset($_SESSION['id']) && $_SESSION['time'] + 3600 > time()) {
        //ログインしている
        $_SESSION['time'] = time();
    
        $members = $db->prepare('SELECT * FROM members WHERE id=?');
        $members->execute(array($_SESSION['id']));
        $member = $members->fetch();
    } else {
        // ログインしてない
        header('Location: login.php'); 
        exit();
    }
    
    // 投稿を記録する
    if(!empty($_POST['message'])) {
        if (empty($_POST['message'] != '')); {
        $message = $db->prepare('INSERT INTO posts SET member_id=?, message=?, reply_post_id=?, created=NOW()');
        $message->execute(array(
          $member['id'],
          $_POST['message'],
          $_POST['reply_post_id']
      ));
    
      header('Location: index.php');
      exit();
    
        }
    }
    
    //投稿を取得する
    $page = $_REQUEST['page'];
    if ($page == '') {
        $page = 1;
    }
    $page = max($page, 1);
    
    //最終ページを取得する
    $counts = $db->query('SELECT COUNT(*) AS cnt FROM posts');
    $cnt = $counts->fetch();
    $maxPage = ceil($cnt['cnt'] / 5);
    $page = min($page, $maxPage);
    
    $start = ($page - 1) * 5;
    
    $posts = $db->prepare('SELECT m.name, m.picture, p.* FROM members m, posts p WHERE m.id=p.member_id ORDER BY p.created DESC LIMIT ?, 5');
    $posts->bindParam(1, $start, PDO::PARAM_INT);
    $posts->execute();
    
    //返信の場合
    if (isset($_REQUEST['res'])) {
        $response = $db->prepare('SELECT m.name, m.picture, p.* FROM members m,posts p WHERE m.id=p.member_id AND p.id=? ORDER BY p.created DESC');
        $response->execute(array($_REQUEST['res']));
    
        $table = $response->fetch();
        $message = '＠' . $table['name'] . ' ' . $table['message'];
    }
    
    //htmlspecialcharsのショートカット
    function h($value) {
        return htmlspecialchars($value, ENT_QUOTES);
    }
    
    //本文内のURLにリンクを設定します
    function makeLink($value) {
        return mb_ereg_replace("(https?)(://[[:alnum:]\+\$;\?\.%,!#~*/:@&=_-]+)", '<a href="\1\2">\1\2</a>' , $value);
    }
    ?>
    
    <!doctype html>
    <html lang="ja">
        <head>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
            <!-- Bootstrap CSS -->
            <link rel="stylesheet" href="css/style.css">
    
            <title> Haratter ：投稿画面</title>
        </head>
        <body>
        <header>
          <h1 class="font-weight-nomal">ひとこと掲示板</h1>
        </header>
    <main>
    <pre>
    <div id="content">
    <form action="" method="post">
    <dl>
    <dt><font size="3"><?php echo h($member['name']); ?>さん、メッセージをどうぞ</font></dt>
    <dd>
    <textarea name="message" cols="50" rows="5"><?php 
    if (isset($message)) {
    echo h($message);
    }
    ?></textarea>
    <input type="hidden" name="reply_post_id" value="<?php echo h($_REQUEST['res']); ?>" />
    </dd>
    </dl>
    <div>
    <input type="submit" value="投稿する" />
    </div>
    </form>
    </div>
    
    <?php
    foreach ($posts as $post):
    ?>
    <div class="msg">
    <img src="member_picture/<?php echo h($post['picture']); ?>" width="48" height="48" alt="<?php echo h($post['name']); ?>" />
    <p><?php echo makeLink(h($post['message'])); ?><span class="name">(<?php echo h($post['name']); ?>)</span>
    [<a href="index.php?res=<?php echo h($post['id']); ?>">Re</a>]</p>
    <p class="day"><a href="view.php?id=<?php echo h($post['id']); ?>"><?php echo h($post['created']); ?></a>
    <?php
    if ($post['reply_post_id'] > 0):
    ?>
    <a href="view.php?id=<?php echo h($post['reply_post_id']); ?>">返信元のメッセージ</a>
    <?php
    endif;
    ?>
    <?php
    if ($_SESSION['id'] == $post['member_id']):
    ?>
       [<a href="delete.php?id=<?php echo h($post['id']); ?>" style="color:#F33;">削除</a>]
    <?php
    endif;
    ?>
    </p>
    </div>
    <?php
    endforeach;
    ?>
    
    <ul class="paging">
    <?php
    if ($page > 1) {
    ?>
    <li><a href="index.php?page=<?php print($page - 1); ?>">前のページへ</a></li>
    <?php
    } else {
    ?>
    <li>前のページへ</li>
    <?php
    }
    ?>
    <?php
    if ($page < $maxPage) {
    ?>
    <li><a href="index.php?page=<?php print($page + 1); ?>">次のページへ</a></li>
    <?php
    } else {
    ?>
    <li>次のページへ</li>
    <?php
    }
    ?>
    </ul>
    </pre>
    </main>
    </body>
    </html>
    
[/code]


CC BY-SA 4.0
2021-01-11T16:12:22.090
73226
2021-01-12T08:23:36.817
2021-01-12T08:23:36.817
3060
42859
question
php
Notice: Undefined index:


外部から渡された値をほかの部分では[isset](https://www.php.net/manual/ja/function.isset.php)や[empty](https://www.php.net/manual/ja/function.empty.php)を使って存在チェックしているので同様の存在チェックが必要です。

ここでいう外部から渡された値とは  
$_GET  
$_POST  
$_COOKIE  
$_REQUEST  
以上の変数を使う場合は必ず存在チェックをしましょう。

いくらページの仕様上パラメータが渡っていないことがないとしても、  
Webの仕組み上リクエストはいくらでも不正に送信できるのでかならずわたってくる値のチェックは行いましょう。

今回の場合はpageの値が渡ってこないときの処理をどうするか決める必要があります。（エラーとするのか？初期値をいれるのか？）  
仮に初期値１を入れるとすると[null合体演算子](https://www.php.net/manual/ja/migration70.new-
features.php#migration70.new-features.null-coalesce-op)を利用するとシンプルで使いやすいと思います。

[code]

    //投稿を取得する
    $page = $_REQUEST['page'] ?? 1;
    if ($page == '') {
        $page = 1;
    }
    $page = max($page, 1);
    
[/code]

アプリケーションの仕様を決めてもらってどういう運用がいいか決めていきましょう。

## 追記

大事なことはissetで書くことやemptyで書くことではないです。  
「したいこと」を書くことです。  
emptyもissetも似た様な書き方はできます。

issetの場合

[code]

    $page = isset($_REQUEST['page']) ? $_REQUEST['page'] : 1;
    if ($page == '') {
        $page = 1;
    }
    $page = max($page, 1);
    
[/code]

emptyの場合

[code]

    $page = empty($_REQUEST['page']) ? 1 : $_REQUEST['page'];
    if ($page == '') {
        $page = 1;
    }
    $page = max($page, 1);
    
[/code]

ですが厳密いうとこれらは違います。  
たとえば数値の0が入ってきた場合や空の配列が入ってきた場合などです。

[code]

    //emptyでもtrue;issetでもtrueになってしまい挙動が変わる
    $_REQUEST['page'] = 0; 
    $_REQUEST['page'] = [];
    
[/code]

なのでどういうアプリケーションの仕様がいいか決めてもらってからコードを書く必要があります。


CC BY-SA 4.0
2021-01-12T01:25:09.033
73235
2021-01-12T05:32:29.120
2021-01-12T05:32:29.120
22665
22665
73226
answer