-1

我想在保存数据后重定向到特定的 url。

我用了:

header('Location: https://linkbook.co/index.php/site/saveUrl');

它没有奏效。

为什么?

整个代码:

public function actionSaveUrl(){
            $criteria = new CDbCriteria();
            $criteria->limit = 1;
            $criteria->order = 'id asc';
            $model_url = Url::model()->FindByAttributes(array('saved_to_file'=>0,'status'=>1),$criteria);
            if($model_url){
                echo $model_url->link;
                CurlTool::downloadFile($model_url->link,'url_' . $model_url->id . '.html');
                $model_url->saved_to_file = 1;
                if( $model_url->validate() && $model_url->save() ){
                    echo 1;
                    header('Location: https://linkbook.co/index.php/site/saveUrl');
                    exit();
                }
                else{
                    echo 2;
                }
            }
        }
4

4 回答 4

8

这是你的问题:

echo 1;

已经将输出发送到浏览器后,您不能发送标头(除非您正在缓冲输出)。执行此操作时,您应该从 PHP 收到警告消息。

于 2013-06-25T13:31:17.233 回答
3

标题前不能有任何输出,输出可以是:

  • 无意:
    • 之前的空格
    • UTF-8 字节顺序标记
    • 以前的错误消息或通知
  • 故意的:
    • print、echo 和其他产生输出的函数(如 var_dump)
    • 之前的原始区域

有关更多信息,请查看此答案!

同样在将来,如果您在 php 中启用错误可能会有所帮助,这样您将收到一个错误,告诉您在哪里生成了其他输出。您可以通过将其放在您的 php 页面顶部来启用错误:

<?php 
ini_set('display_errors', 'On'); 
error_reporting(E_ALL); 
?>
于 2013-06-25T13:35:07.803 回答
2

手册明确指出:

请记住,必须在发送任何实际输出之前调用 header(),无论是通过普通 HTML 标记、文件中的空白行还是从 PHP 发送。使用 include 或 require 函数或其他文件访问函数读取代码并在调用 header() 之前输出空格或空行是一个非常常见的错误。使用单个 PHP/HTML 文件时也存在同样的问题。

你做:

 // <-- THIS LINE OUTPUTS SOMETHING
 echo $model_url->link;
 ...
 echo 1; // <-- THIS LINE OUTPUTS SOMETHING AS WELL
 // SO THIS WON'T WORK
 header('Location: https://linkbook.co/index.php/site/saveUrl');

所以:扫描您的程序以查找可能输出某些内容的任何程序行,并将您的header()调用移到该行之前

于 2013-06-25T13:33:19.150 回答
-1

首先,在重定向之前你不应该有任何输出(这是echo 1;为了什么?)

其次,在 Yii 中,你可以像这样重定向:

$this->redirect('https://linkbook.co/index.php/site/saveUrl');
于 2013-06-25T13:32:06.723 回答