我希望在保存数据后重定向到特定的网址。
我用过:
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;
}
}
}
答案 0 :(得分:8)
这是你的问题:
echo 1;
在您已将输出发送到浏览器后,您无法发送标头(除非您正在缓冲输出)。当你这样做时,你应该从PHP得到一条警告信息。
答案 1 :(得分:3)
在标题之前不能有任何输出,输出可以是:
有关详细信息,请查看this answer!
此外,如果您在php中启用错误可能会有所帮助,这样您就会收到错误消息,告诉您生成其他输出的位置。您可以通过将其放在php页面上来启用错误:
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);
?>
答案 2 :(得分:2)
manual明确说:
请记住,在发送任何实际输出之前,必须通过普通HTML标记,文件中的空行或PHP来调用header()。使用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()
电话。
答案 3 :(得分:-1)
首先,你不应该在重定向之前有任何输出(echo 1;
是什么?)
其次,在Yii中,您可以像这样重定向:
$this->redirect('https://linkbook.co/index.php/site/saveUrl');