“处理另一个错误时出错:yii\web\邮件头已发送异常”

8oomwypt  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(172)

我尝试在基于Yii 2框架的留言簿应用程序上提交评论。在我的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.';

我怎样才能解决这个问题?

oxiaedzo

oxiaedzo1#

从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() Package 代码。

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();
    }
}
7y4bm7vi

7y4bm7vi2#

虽然我认为rob 006的解决方案是正确的,但我也遇到过控制器没有回音的情况,但我也得到了错误。在浏览了几个网站寻找解决方案后,我发现了一个替代方案。
您可以检查 php.ini 文件并确保 output buffer 已启用。如果没有,您可以通过在 php.ini 中添加以下行来启用它(如果它不存在):

output_buffering = on

并且只为脚本关闭它-脚本中的任何一个都不需要它的地方...
1.调用ob_end_flush(),或
1.呼叫ob_end_clean()

相关问题