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

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

ただいまの
回答率

87.60%

phpで簡易掲示板作成時のエラーについて

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 504

score 105

phpの勉強のために、とあるサイトの掲示板制作のコードを真似て作成しているのですが、
下記のエラーがでており解決方法がわからず困っています。
バージョンの違いの物なのかなと思いますが、どのように対処したらいいでしょうか。
PHPバージョン:7.2

■エラー内容
Notice: Undefined variable: errors in C:\xampp\htdocs\php\actions.php on line 43

【index.php】

<?php

require_once('actions.php');

try{ //order by id descで、idの降順(大きい物から小さい順)に記事一覧を取得
  $result = $pdo->query("select * from users order by id desc");
  $count = $result->rowCount();
} catch(Exception $e) {
  echo $e->getMassage() . PHP_EOL;
}

$ptm = new PostTheMessage();
if($_SERVER['REQUEST_METHOD'] === 'POST') {
  $message = $_POST;
  $ptm->post($message);
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>掲示板</title>
  <link rel="stylesheet" href="css/sanitize.css">
  <link rel="stylesheet" href="css/styles.css">
</head>
<body>
  <div id="header">
    <h1>掲示板</h1>
    <p>現在の投稿<span><?= $count; ?></span></p>
  </div><!-- header -->
  <div id="main">
    <div id="modal" class="hidden">
      <form action="" method="post">
        <label for="name">名前</label>
        <input type="text" name="name" value="" id="name"><br>
        <label for="password">削除用パスワード</label>
        <input type="password" name="password" value=""><br>
        <textarea name="body" rows="8" cols="40" placeholder="ここにコメントを記入してください"></textarea><br>
        <button type="submit" name="submit" id="submit">書き込む</button>
      </form>
      <p id="close_modal">
        Close
      </p>
     </div><!-- modal -->
      <div id="mask" class="hidden"></div>
      <div id="open_modal">
        <h2>投稿する</h2>
      </div>
      <div id="posts">
        <?php if($count == 0): ?>
          <p>
            まだ投稿はありません。
          </p>
        <?php endif; ?>
        <dl>
          <?php $i = 0; ?>
          <?php foreach ($result as $row): ?>
            <dt class="postrow <?php if($i > 4) { echo 'post_hidden'; } ?>"><!-- 5件以上は非表示 -->
              <span><?= $count - $i; ?></span><span>名前:<?= h($row["name"]) ?></span>
              <span><?= h($row["created"]) ?></span><br>
            </dt>
            <dd class="postrow <?php if($i > 4){ echo 'post_hidden'; } ?>"><!-- 5件以上は非表示 -->
              <?= nl2br(h($row["body"])) ?>
              <a href="delete.php?id=<?= h($row["id"]) ?>">削除</a>
            </dd>
            <?php $i++ ?>
          <?php endforeach; ?>
        </dl>
        <div id="load_result"></div>
        <button id="load_more">全件表示</button>
      </div><!-- posts -->
  </div><!-- main -->
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="actions.js"></script>
</body>
</html>

【actions.php】

<?php
require_once('config.php');

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

try {
  $pdo = new PDO(DSN, DB_USER, DB_PASS);
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(Exception $e) {
  echo $e->getMessage() . PHP_EOL;
}

class PostTheMessage{

  public function post($message){
    try{
      // error check
      $validated_message = $this->_validatePost($message);
      // imap_save
      $this->_save($validated_message);
      // redirect
      header('Locaton:http://'. $_SERVER['SERVER_NAME']);
      exit;
    } catch(\Exception $e){
      echo $e->getMessage() . PHP_EOL;
    }
  }

  private function _validatePost($post){
    if(mb_strlen($post["password"]) > 7){
      $post["password"] = password_hash($post["password"], PASSWORD_DEFAULT);
    } else {
      $errors[] = '8文字以上のパスワードを設定してね。';
    }
    if(mb_strlen($post["name"]) > 15){
      $errors[] = '名前が長すぎるよ';
    }
    if(empty(trim($post["body"])) || mb_strlen($post["body"]) > 255) {
      $errors[] = '文章長すぎるか入力してないよ。';
    }
    if($errors){
      die(implode("<br />\n", $errors));
    }
    return $post;
  }

  private function _save($v_message){
    try{
      $pdo = new PDO(DSN, DB_USER, DB_PASS);
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      if(empty($v_message['name'])){
        $stmt = $pdo->prepare("insert into users(body, password) values(?, ?)");
        $stmt->execute([$v_message["body"], $v_message["password"]]);
      } else {
        $stmt = $pdo->prepare("insert into users(name, body, password) values(?, ?, ?)");
        $stmt->execute([$v_message["name"], $v_message["body"], $v_message["password"]]);
      }
    } catch(Exception $e){
      echo $e->getMessage() . PHP_EOL;
      exit;
    }
  }

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m.ts10806

    2019/02/12 17:15

    エラー内容については調べてみましたか?Google翻訳にかけるなり、「Notice: Undefined variable: 」部分を検索にかけるなりすると解決のために一歩進むとは思います。

    キャンセル

  • yoorwm

    2019/02/12 17:17

    Noticeというのはエラーでは無いですよ。
    参考ソースと質問レベルが離れている気がするので、もう少し簡単なサンプルから始めた方が良いかと思います。

    キャンセル

  • n_takapyon

    2019/02/12 17:24

    バージョンの問題ではなく適切に変数の宣言がされていないのが原因だと思いますので。
    エラーメッセージに書いてある通り43行目から探ってみてください。

    キャンセル

回答 1

checkベストアンサー

+2

行数で

  private function _validatePost($post){
    if(mb_strlen($post["password"]) > 7){
      $post["password"] = password_hash($post["password"], PASSWORD_DEFAULT);
    } else {
      $errors[] = '8文字以上のパスワードを設定してね。';
    }
    if(mb_strlen($post["name"]) > 15){
      $errors[] = '名前が長すぎるよ';
    }
    if(empty(trim($post["body"])) || mb_strlen($post["body"]) > 255) {
      $errors[] = '文章長すぎるか入力してないよ。';
    }
    if($errors){
      die(implode("<br />\n", $errors));
    }
    return $post;
  }


if($errors){とわかると思いますが、理由はエラー処理にならない限り$errorsの宣言がないからですのでこの関数の最初にでも$errors = [];でも入れておけばよいかと・・・または(かつ)if($errors){empty関数でチェックする

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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