web-dev-qa-db-ja.com

別のエラーの処理中にエラーが発生しました:yii \ web \ HeadersAlreadySentException

Yii2フレームワークに基づくゲストブックアプリケーションにコメントを送信しようとしています。 PCのlocalhostですべてが正常に機能しますが、共有ホスティングでViewにコメントを送信したい場合、このエラーが発生します。

ここにエラーがあります:

An Error occurred while handling another error:
    exception 'yii\web\HeadersAlreadySentException' with message 'Headers already sent in /home/mahdikas/public_html/guestbook/controllers/PostController.php on line 117.' in /home/mahdikas/public_html/guestbook/vendor/yiisoft/yii2/web/Response.php:366
    Stack trace:
    #0 /home/mahdikas/public_html/guestbook/vendor/yiisoft/yii2/web/Response.php(339): yii\web\Response->sendHeaders()
    #1 /home/mahdikas/public_html/guestbook/vendor/yiisoft/yii2/web/ErrorHandler.php(135): yii\web\Response->send()
    #2 /home/mahdikas/public_html/guestbook/vendor/yiisoft/yii2/base/ErrorHandler.php(111): yii\web\ErrorHandler->renderException(Object(yii\web\HeadersAlreadySentException))
    #3 [internal function]: yii\base\ErrorHandler->handleException(Object(yii\web\HeadersAlreadySentException))
    #4 {main}
    Previous exception:
    exception 'yii\web\HeadersAlreadySentException' with message 'Headers already sent in /home/mahdikas/public_html/guestbook/controllers/PostController.php on line 117.' in /home/mahdikas/public_html/guestbook/vendor/yiisoft/yii2/web/Response.php:366
    Stack trace:
    #0 /home/mahdikas/public_html/guestbook/vendor/yiisoft/yii2/web/Response.php(339): yii\web\Response->sendHeaders()
    #1 /home/mahdikas/public_html/guestbook/vendor/yiisoft/yii2/base/Application.php(392): yii\web\Response->send()
    #2 /home/mahdikas/public_html/guestbook/web/index.php(12): yii\base\Application->run()
    #3 {main}

postControllerに私はこのコードを持っています:

public function actionAdd_comment()
{
  //print_r($_POST);
  $model = new \app\models\Comments;
  if ($model->load(Yii::$app->request->post()) && $model->validate()) {
    $model->comment_date = date('Y-m-d H:i:s');
    if ($model->save()) {
      echo 'Thanks for your comment.';
    } else {
      echo 'Failed!';
    }
  }
}

エラーの117行目は次のとおりです。

echo 'Thanks for your comment.';

この問題を解決するのを手伝ってくれませんか。私は本当に行き詰まっています。

前もって感謝します

13
Mahdi Kashani

Yii 2.0.14なので、コントローラーでエコーすることはできません。応答を返す必要があります。

_public function actionAdd_comment() {
    $model = new \app\models\Comments();
    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
        $model->comment_date = date('Y-m-d H:i:s');
        if ($model->save()) {
            return 'Thanks for your comment.';
        } else {
            return 'Failed!';
        }
    }
}
_

エコーを回避できない場合は、メソッドの最後でexitを呼び出して、それ以上処理されないようにするか、コードをob_start()およびob_get_clean()でラップすることもできます。 。

_public function actionAdd_comment() {
    $model = new \app\models\Comments();
    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
        $this->someMagicWithEcho();
        exit;
    }
}
_

または

_public function actionAdd_comment() {
    $model = new \app\models\Comments();
    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
        ob_start();
        $this->someMagicWithEcho();
        return ob_get_clean();
    }
}
_
5
rob006

@ rob006の解決策は正しいものとして受け入れますが、コントローラーにエコーがない状況に遭遇しましたが、エラーも発生しました。解決策を探していくつかのサイトを調べた後、私は代替案を発見しました

PHP.iniファイルをチェックして、出力バッファが有効になっていることを確認できます。存在しない場合は、php.iniにこの行を追加して有効にできます。 _output_buffering = on_そして、どちらかが必要としないスクリプトだけをオフにします...

  1. ob_end_flush()を呼び出す、または
  2. ob_end_clean()を呼び出す
1
Paul Wakhungu