PHP简单问题。。 各位帮我看看哪里出错了。。

<?phpinclude_once'config.php';$name=$_POST['username'];$pwd=$_POST['pwd'];if(isset($_... <?php
include_once 'config.php';

$name=$_POST['username'];
$pwd=$_POST['pwd'];

if(isset($_POST['submit']))
{
$db=db_connect();
$sql="select*from login where name=$name and pwd=$pwd";
$result=$db->query($sql);

if($result&&$result->num_rows>0)
{$db->close();
header("Location:index.php?name=$name");

}
else
{ $db->close();
header("Location:login.php?name=$name");
}
echo "登陆失败!";
}

if(isset($_POST['submit1']))
{ $db=db_connect();
$sql="insert into login values($name,$pwd)";
$result=$db->query($sql);
if($result) echo "注册成功!";
else echo "注册失败!";
}
?>
<html>
<head>
<title>登陆</title>
</head>
<body>
<center>
<form name='form' method='post' action='login.php'>
<table widtd='90%'>
<tr>
<td align='right'>用户名:</td>
<td><input name='username' type='text' id='username'>
</td>
</tr>
<tr>
<td align='right'>密码:</td>
<td><input name='pwd' type='password' id='pwd'></td>
</tr>
<td>
<input type='submit' name='submit' value='登陆'>
<input type='submit' name='submit1' value='注册'>
<input type='reset' name='reset' value='取消'>
</td>
</tr>
</table>
</form>
</center>
</body>
</html>

Warning: Cannot modify header information - headers already sent by (output started at F:\AppServ\www\ziji\login.php:1) in F:\AppServ\www\ziji\login.php on line 15
展开
 我来答
5563184
2011-04-02 · 超过12用户采纳过TA的回答
知道答主
回答量:52
采纳率:100%
帮助的人:29.2万
展开全部
综合使用得到的解决方法是
1在页面顶部的php标签中加入ob_start();

2在返回的信息下面加入ob_end_flush();

这样就可以屏蔽错误信息的现实了

另外转一下其他人的方法,也许在其他情况下也会有效

If you got this message: "Warning: Cannot modify header information - headers already sent by ...."
如果在执行php程序时看到这条警告:"Warning: Cannot modify header information - headers already sent by ...."

Few notes based on the following user posts:
有以下几种解决方法:

1. Blank lines (空白行):
Make sure no blank line after <?php ... ?> of the calling php script.
检查有<?php ... ?> 后面没有空白行,特别是include或者require的文件。不少问题是这些空白行导致的。

2. Use exit statement (用exit来解决):
Use exit after header statement seems to help some people
在header后加上exit();
header ("Location: xxx");
exit();

3. PHP has this annoying problem, if your HTML goes before any PHP code or any header modification before redirecting to certain page, it'll said "Warning: Cannot modify header information - headers already sent by ...." Basically anytime you output to browser, the header is set and cannot be modified. So two ways to get around the problem:

3a. Use Javascript (用Javascript来解决):
<? echo "<script> self.location(\"file.php\");</script>"; ?>
Since it's a script, it won't modify the header until execution of Javascript.
可以用Javascript来代替header。但是上面的这段代码我没有执行成功... 另外需要注意,采用这种方法需要浏览器支持Javascript.

3b. Use output buffering (用输出缓存来解决):
<?php ob_start(); ?>
... HTML codes ...
<?php
... PHP codes ...
header ("Location: ....");
ob_end_flush();
?>
This will save the output buffer on server and not output to browser yet, which means you can modify the header all you want until the ob_end_flush() statement. This method is cleaner than the Javascript since Javascript method assumes the browser has Javascript turn on. However, there are overhead to store output buffer on server before output, but with modern hardware I would imagine it won't be that big of deal. Javascript solution would be better if you know for sure your user has Javascript turn on on their browser.

就像上面的代码那样,这种方法在生成页面的时候缓存,这样就允许在输出head之后再输出header了。本站的许愿板就是采用这种方法解决的header问题。

在后台管理或者有时候在论坛,点击一个页面,页顶会出现
Warning: Cannot modify header information - headers already sent by....
这类语句,造成这个原因是因为setcookie语句的问题。

cookie本身在使用上有一些限制,例如:
1.呼叫setcookie的叙述必须放在<html>标签之前
2.呼叫setcookie之前,不可使用echo
3.直到网页被重新载入后,cookie才会在程式中出现
4.setcookie函数必须在任何资料输出至浏览器前,就先送出
5.……
基於上面这些限制,所以执行setcookie()函数时,常会碰到"Undefined index"、"Cannot modify header information - headers already sent by"…等问题,解决"Cannot modify header information - headers already sent by"这个错误的方法是在产生cookie前,先延缓资料输出至浏览器,因此,您可以在程式的最前方加上ob_start();这个函数。这样就可以解决了。

4.set output_buffering = On in php.ini (开启php.ini中的output_buffering )
set output_buffering = On will enable output buffering for all files. But this method may slow down your php output. The performance of this method depends on which Web server you're working with, and what kind of scripts you're using.
这种方法和3b的方法理论上是一样的。但是这种方法开启了所有php程序的输出缓存,这样做可能影响php执行效率,这取决于服务器的性能和代码的复杂度。

昨天想用PHP写一段下载文件的代码,因为不想得怎么设置HTTP协议就直接到php.net上找header()函数的事例,很多代码,我直接拷贝了一段,

<?php
$file = 'filetest.txt';//filetest.txt文件你随便写点东西进去就好了
header("Content-Disposition: attachment; filename=" . urlencode($file));
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header("Content-Length: " . filesize('filetest.txt'));
flush(); // this doesn't really matter.

$fp = fopen($file, "r");
while (!feof($fp))
{
echo fread($fp, 65536);
flush(); // this is essential for large downloads
}

fclose($fp);

?>

运行了一下发现不行,一直报错:Warning: Cannot modify header information - headers already sent by (output started at E:\xampp\htdocs\test\downloadfile\file_download.php:1) in E:\xampp\htdocs\test\downloadfile\file_download.php on line 3

我很看了很久,文件一开始就直接是header代码了,没任何输出怎么会说已有字符输出了呢?后来上网查到别人给的提示,才发现,原来我创建文件的时候是直接用记事本存储为UTF8, 原来这样也会出错

----------------以下是引用他人的建议 --------------------

方法一:
在PHP里Cookie的使用是有一些限制的。
1、使用setcookie必须在<html>标签之前
2、使用setcookie之前,不可以使用echo输入内容
3、直到网页被加载完后,cookie才会出现
4、setcookie必须放到任何资料输出浏览器前,才送出
.....
由于上面的限制,在使用setcookie()函数时,学会遇到 "Undefined index"、"Cannot modify header information - headers already sent by"…等问题,解决办法是在输出内容之前,产生cookie,可以在程序的最上方加入函数 ob_start();

ob_start :打开输出缓冲区
函数格式:void ob_start(void)
说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。

方法二:
解 决Warning: Cannot modify header information - headers already sent by ...... 前几天装了个php的大头贴系统测试,发现报错Warning: Cannot modify header information - headers already sent by ......
今天又装openads,还是出现这个问题。怒了。上网找了半天,有人说要在文件开头写上
ob_start();
失败。
后来打开 php.ini 然后把 output_buffering 设为 on 。重起appache,OK。看来这才是解决办法。

特别注意:(我就是看了这个才解决问题的)
如果使用utf-8编码,一定要去掉UTF-8中的BOM,这都是因为utf-8编码文件含有的bom原因,而php4,5都是不支持bom的。去掉bom,可以用Notepad++打开转换一下。(我就是看了这个才解决问题的)

用PHP的ob_start(); 控制您的浏览器cache 。我另外单独转载了一篇文章关于用PHP的ob_start();控制您的浏览器cache的文章

----------------END --------------------
镭速传输
2024-10-28 广告
作为深圳市云语科技有限公司的一员,我们推出的FTP替代升级方案,旨在解决传统FTP在安全性、效率、稳定性及管理方面的不足。我们的产品通过采用自主研发的Raysync传输协议,实现高效、安全的文件传输,即使在恶劣网络环境下也能确保传输的稳定性... 点击进入详情页
本回答由镭速传输提供
无敌大种
2011-04-01 · TA获得超过364个赞
知道小有建树答主
回答量:314
采纳率:0%
帮助的人:259万
展开全部
header("Location:login.php?name=$name");
一般 header用在页面开始部分直接载入,所以换成
echo "window.location.href='login.php'"
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wjreplay
2011-04-02 · 超过21用户采纳过TA的回答
知道答主
回答量:71
采纳率:0%
帮助的人:61.3万
展开全部
因为你在 header("Location:index.php?name=$name"); 之前输出了东西了。就算是输出个空格也会显示警告的。可以在 @header("Location:index.php?name=$name"); 蛋最好还是用 输出一个javascript 的跳转
追问
但我就是不知道哪里输出了东西导致错误。。好像前面没有输出什么啊。。
追答
<? 标签前面有个空格都会出现这个错误提示的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
来自居庸关粉妆玉琢的珍珠梅
推荐于2016-05-24 · TA获得超过113个赞
知道答主
回答量:96
采纳率:0%
帮助的人:38.1万
展开全部
header("Location:index.php?name=$name");
换成以下一句:
die("<script>window.self.location.href='index.php?name=".$name."';</script>");

header("Location:login.php?name=$name");
换成以下一句:
die("<script>window.self.location.href='login.php?name=".$name."';</script>");
追问
对了喔。。为什么要这样换呢。。
追答
Warning: Cannot modify header information - headers already sent by (output started at F:\AppServ\www\ziji\login.php:1) in F:\AppServ\www\ziji\login.php on line 1
很明显,禁止重复输出header。一般在页面中间不使用header。所以可以将页面跳转的任务交给客户端,而服务端只是输出一段字符串,并终止执行 即die(some_string);
里面的window.self.location.href='login.php?name=".$name."'; 是javascript脚本,提示浏览器进行页面跳转
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式