it-swarm.com.de

Bei der Behandlung eines anderen Fehlers ist ein Fehler aufgetreten: yii\web\HeadersAlreadySentException

Ich versuche, einen Kommentar zu einer Gästebuchanwendung auf Basis von Yii2 Framework einzureichen. auf localhost auf meinem PC funktioniert alles einwandfrei, aber auf dem Shared Hosting, wenn ich einen Kommentar in View übermitteln möchte, erhalte ich diesen Fehler.

Hier ist der Fehler:

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}

im postController habe ich diesen Code:

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!';
    }
  }
}

welche Zeile 117 im Fehler ist:

echo 'Thanks for your comment.';

Können Sie mir bitte helfen, dieses Problem zu lösen? Ich bin wirklich festgefahren.

Danke im Voraus

3
Mahdi Kashani

Seit Yii 2.0.14 können Sie im Controller kein Echo ausführen. Antwort muss zurückgegeben werden:

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!';
        }
    }
}

Sie können auch exit am Ende Ihrer Methode aufrufen, um die weitere Verarbeitung zu verhindern, oder Ihren Code mit ob_start() und ob_get_clean() umschließen, wenn Sie kein Echo vermeiden können.

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

oder 

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

Obwohl ich die Lösung von @ rob006 als korrekt akzeptiere, ist eine Situation aufgetreten, in der kein Echo im Controller aufgetreten ist, aber ich habe auch den Fehler erhalten. Nachdem ich mehrere Standorte auf der Suche nach einer Lösung durchlaufen hatte, entdeckte ich eine Alternative

Sie können die Datei PHP.ini überprüfen und sicherstellen, dass der Ausgabepuffer aktiviert ist. Wenn nicht, können Sie es aktivieren, indem Sie diese Zeile in php.ini hinzufügen, falls sie nicht vorhanden ist .output_buffering = on

  1. aufruf von ob_end_flush() oder
  2. ob_end_clean() aufrufen
1
Paul Wakhungu