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

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

ただいまの
回答率

89.04%

PHPの出力を止め、HTMLのみ表示させる方法

解決済

回答 2

投稿

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

newyee

score 155

PHPにて、簡易掲示板を作成しているのですが、バリデーションチェックにて、エラーメッセージを出力させる際、一度PHPで作成した変数にエラーメッセージを入れ、htmlの方で出力したいと考えているのですが、PHPの方では変数にエラーメッセージを入れた時点で処理を終えHTMLを表示させたいのですが、良い方法などご存じありませんでしょうか...?
以下のコードでは、「if($name == '' || $comment == ''){」ここの部分および「if(!preg_match("/^[0-9]{4}$/",$pass)){」ここのif文の中で「exit()」としているのですが、exitを使用しますとHTMLのコードも出力がされません。ご助言頂けましたら幸いです。よろしくお願いします

<?php
include 'includes/login.php'; 
error_reporting(E_ALL);
ini_set('display_errors', '1');

$name = $_POST['name'];
$title = $_POST['title'];
$comment = $_POST['comment'];
$pass = $_POST['pass'];
$token = $_POST['token'];
$err_message = array();

if($name == '' || $comment == ''){
  $err_message = '名前または、コメントが入力されていません';

  exit();  

}
if(!preg_match("/^[0-9]{4}$/",$pass)){
  $err_message = 'パスワードを4文字で入力してください';
  exit();

}

//CSRF対策
if($token != password_hash(session_id(),PASSWORD_DEFAULT)){
  header('Location:bbs.php');
  exit();

}

setcookie('name',$name,time() + 60 * 60 * 24 * 30);

//データベースに接続
$dsn = 'mysql:host=localhost;dbname=online_bbs;charset=utf8';
$user = 'root';
$password = '';

try{
  $db = new PDO($dsn,$user,$password);
  $db->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
  $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
  $stmt = $db->prepare("
    INSERT INTO post (name,title,comment,created_at,password)
    VALUES (:name, :title, :comment, now(), :pass)");
  $stmt->bindValue(':name',$name,PDO::PARAM_STR);
  $stmt->bindValue(':title',$title,PDO::PARAM_STR);
  $stmt->bindValue(':comment',$comment,PDO::PARAM_STR);
  $stmt->bindValue(':pass',$pass,PDO::PARAM_STR);
  $stmt->execute();
  header('Location:bbs.php');
  exit();
}catch(PDOException $e){
  die ('エラー:' . $e->getMessage());
}


?>



<html>
<head>
  <meta charset="utf-8">
  <title>Page Title</title>

</head>
<body>
  <?php if($err_message):
    foreach($err_message as $values): ?>
      <p><?php echo $values; ?></p>
  <?php 
    endforeach;
  endif;
  ?>

</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

exit()ってそうそうWebシステムで使うことないですね。
少なくとも確実にHTML出力があるのに使うのってあまり見ない。
「そこで(全ての)処理終了」なので、その後にいくら画面出力の処理を書いてても出ません。
配列におさめてエラーがあるかないかで続きをどうするか決めれば良いだけ。

$err = [];

if(チェック1){
  $err[] = "エラー1";
}
if(チェック2){
  $err[] = "エラー2";
}

if(count($err) === 0){
  //登録処理

  exit();
}

echo implode("<br />",$err);


最後のimplodeは配列の展開方法だけなのでそこはご自由に。

もし「対象のinputのところに出したい」のであれば連番ではなく
$err["name"][] = "エラーメッセージ";
とかにして、キーの存在チェックを以て配列展開をすれば良いだけです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/04 10:22

    その後の質問で活かされている様子がないのですが、なぜでしょうか。
    https://teratail.com/questions/177507
    「分からないから放置」では回答した意味が全くなくなります。

    キャンセル

  • 2019/03/04 11:51

    ご指摘ありがとうございます。
    ご指摘頂きました「その後の質問で生かされている様子がない」とは具体的にどのような部分か教えて頂けませんでしょうか...?

    キャンセル

  • 2019/03/04 11:54

    「配列におさめてエラーがあるかないかで続きをどうするか決めれば良い」というアドバイスをしていますが、次の質問ではechoしてexit()にしてしまってます。
    複数の入力チェックでのエラーが同時に起こることもあるのに、1つずつ締めてしまっては意味がないですよ。

    キャンセル

0

別のファイル、別の関数にすることで達成できると思いますが、複数の入力チェックが1パターンずつしかチェックされないのは、UXが悪いので、今のまま、エラーメッセージを複数持てるようにしたほうがよいと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/03 12:09

    ご回答ありがとうございます。
    ご回答いただきました、「複数の入力チェックが1パターンずつしかチェックされない」ここの部分がいまいちイメージが掴めないのですが、自分のコードは具体的にどのように変更すれば良いと思われますでしょうか...?理解が悪くて申し訳ありません...

    キャンセル

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

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

関連した質問

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