web-dev-qa-db-fra.com

Une erreur s'est produite lors de la gestion d'une autre erreur: yii\web\HeadersAlreadySentException.

J'essaie de soumettre un commentaire sur une application de livre d'or basée sur Yii2 Framework. sur localhost sur mon PC tout fonctionne bien, mais sur l'hébergement partagé lorsque je veux soumettre un commentaire dans View, j'obtiens cette erreur.

Voici l'erreur:

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}

dans le postController j'ai ce 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!';
    }
  }
}

quelle ligne 117 dans l'erreur est:

echo 'Thanks for your comment.';

Pouvez-vous s'il vous plaît m'aider à résoudre ce problème? Je suis vraiment coincé.

Merci d'avance

3
Mahdi Kashani

Depuis Yii 2.0.14, vous ne pouvez plus utiliser l’écho dans le contrôleur. La réponse doit être renvoyée:

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

Vous pouvez également appeler exit à la fin de votre méthode pour empêcher tout traitement ultérieur ou encapsuler votre code avec ob_start() et ob_get_clean(), si vous ne pouvez pas éviter l'écho.

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

ou 

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

Bien que j'accepte la solution de @ rob006 comme étant correcte, j'ai rencontré une situation dans laquelle il n'y avait pas d'écho dans le contrôleur, mais j'ai aussi eu l'erreur. Après avoir parcouru plusieurs sites à la recherche d'une solution, j'ai découvert une alternative

Vous pouvez vérifier le fichier PHP.ini et vous assurer que le tampon de sortie est activé. sinon, vous pouvez l'activer en ajoutant cette ligne dans le fichier php.ini si elle n'existe pas .output_buffering = on.__ et désactivez-le uniquement pour le script, le script là où il n'est pas requis ...

  1. appelez ob_end_flush(), ou
  2. appelant ob_end_clean()
1
Paul Wakhungu