hp函数setcookie()报错:Warning: Cannot modify header

 更新时间:2016年11月25日 17:38  点击:1403
今天在利用php函数setcookie()设置值是提示:Warning: Cannot modify header information headers already sent by错了,立即去gg问了一下,找到N种解决办法下面我来整理一下希望对大家会有所帮助。

快要下班的时候,看到php讨论学习群中有朋友说设置cookie的时候。向他要了代码看了原因!报错
Warning: Cannot modify header information – headers already sent by (output started at cookie1.php:4) in cookie1.php on line 5


<?php
ob_start();
setcookie("username","宋岩宾",time()+3600);
echo "the username is:".$HTTP_COOKIE_VARS["username"]." ";
echo "the username is:".$_COOKIE["username"]." ";
print_r($_COOKIE);
?>
Warning: Cannot modify header information - headers already sent by出错的原因
我在php程序的头部加了,
header("cache-control:no-cache,must-revalidate");
之后页面就出现上面的错误,看了N个资料也没有结果。今天偶尔发现原来是我的php.ini里面的配置出了问题,在C:windows下找到php.ini文件
output_buffering默认为off的。我现在把它设为4096就OK了

用于解决显示提示错误,不能按(日期+导出文件数)为文件名的错误信息.
setcookie函数必?在任何?料?出至浏览器前,就先送出
基於上面?些限制,所以?绦?etcookie()函??r,常??龅?quot;Undefined index"、"Cannot modify header information - headers already sent by"…等???,解?Q"Cannot modify header information - headers already sent by"?????的方法是在?生cookie前,先延??料?出至?g?器,因此,您可以在程式的最前方加上ob_start();???函?怠?br /> ob_start()函数用于打开缓冲区,比如header()函数之前如果就有输出,包括回车空格换行都会有"Header had all ready send by"的错误,这时可以先用ob_start()打开缓冲区PHP代码的数据块和echo()输出都会进入缓冲区而不会立刻输出.当然打开缓冲区的作用很多,只要发挥你的想象.可以总结以下四点:

1.用于header()之前

ob_start(); //打开缓冲区
echo "Hellon"; //输出
header("location:index.php"); //把浏览器重定向到index.php
ob_end_flush();//输出全部内容到浏览器
?>

2.phpinfo()函数可获取客户端和服务器端的信息,但要保存客户端信息用缓冲区的方法是最好的选择.
ob_start(); //打开缓冲区
phpinfo(); //使用phpinfo函数
$info=ob_get_contents(); //得到缓冲区的内容并且赋值给$info
$file=fopen('info.txt','w'); //打开文件info.txt
fwrite($file,$info); //写入信息到info.txt
fclose($file); //关闭文件info.txt
?>

3.静态页面技术
ob_start();//打开缓冲区
?>
php页面的全部输出
$content = ob_get_contents();//取得php页面输出的全部内容
$fp = fopen("output00001.html", "w"); //创建一个文件,并打开,准备写入
fwrite($fp, $content); //把php页面的内容全部写入output00001.html,然后……
fclose($fp);
?>

4.输出代码
Function run_code($code) {
If($code) {
ob_start();
eval($code);
$contents = ob_get_contents();
ob_end_clean();
}else {
echo "错误!没有输出";
exit();
}
return $contents;
}

 

看了PHP手册和搜索了原因。得到一下结论

方法一:

在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 ……有人说要在文件开头写上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 。

 

很多朋友发现使用phpmyadmin4.0或以上版本会发现打开比以前慢多了,这个如果使用过dedecms的朋友就会碰到相同的问题,解决dedecms是因加载了远程文件而phpmyadmin4同样这样操作了,所以我们只要找到代码删除即可。

很多人用了phpmyadmin4以后的版本发现速度好像慢了很多,总结下,提供解决方法。
1、修改本地化时间

原理: 本地化时间格式化需要gettext支持, 假如你的环境没有开启此功能, 将会返回乱码, 影响#phpmyadmin ajax的处理. 本测试在phpmyadmin 4.0.2 php 5.5.0 环境上验证通过.
修改:./libraries/Util.class.php 文件
 

 代码如下 复制代码
# 查找
return strftime($date, $timestamp);
 
# 替换成如下代码:
if(extension_loaded('gettext'))
  return strftime($date, $timestamp);
 
# 中国区这样设置.
date_default_timezone_set('UTC');
return gmdate('Y-m-d H:i:s', $timestamp + 28800);

2、屏蔽在线升级

原理: phpmyadmin官方网站被GFW了,自动检查更新的时间白白浪费在墙内等待,关闭即可
修改:./version_check.php 文件,将下面这些代码删除或者注释掉

 

 代码如下 复制代码
$save = true;
$file = 'http://www.phpmyadmin.net/home_page/version.json';
if (ini_get('allow_url_fopen')) {
    $response = file_get_contents($file);
} else if (function_exists('curl_init')) {
    $curl_handle = curl_init($file);
    curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($curl_handle);
}

现在退出后, 再登录访问, 看看是不是已经秒开了? 大家试试吧~

今天小编来给大家介绍一个关于PHP strtotime计算上一个月的今天问题解决,如果你碰到计算上一个月今天有问题不防进入参考。

PHP,上一个月

strtotime 有个小问题

 代码如下 复制代码

> php -r”echo date(‘Ymd000000′,strtotime ( ‘-1 month’, strtotime ( ’201307310000′ ) ));”
20130701000000#
> php -r”echo date(‘Ymd000000′,strtotime ( ‘-1 month’, strtotime ( ’201308010000′ ) ));”
20130701000000#

搜了一下,下面的方法更准确一些

 代码如下 复制代码

$time = strtotime("2011-03-31");


函数 mktime,它可以取得日期的时间戳:

int mktime ([ int $hour [, int $minute [, int $second [, int $month [, int $day [, int $year [, int $is_dst ]]]]]]] )

根据给出的参数返回 Unix 时间戳。时间戳是一个长整数,包含了从 Unix 纪元(January 1 1970 00:00:00 GMT)到给定时间的秒数。

参数可以从右向左省略,任何省略的参数会被设置成本地日期和时间的当前值。
所以可以通过它来计算

 代码如下 复制代码

function last_month_day($time){
    $strtime=mktime(date('h',$time),date('i',$time),date('s',$time),date('m',$time)-1,date('d',$time),date('Y',$time));
    echo date('Y-m-d',$strtime);
}
 last_month_day(strtotime("2012-03-31"));


输出的结果是2012-03-02;按理说应该是输出2012-02-31????笨蛋2月有31号吗?没,有30号吗,没?有29号吗?..这个..可以有…
PHP给我们处理了这种情况,他会多出几天按下个月来算.
2012年2月最后一天是2012-02-29那么31号比29多两天,所以PHP就累加到下个月来处理 就是2012-03-02啦.
差点忘了..那么星期几怎么算呢??不用算啦..PHP给我们准备好了.
date(‘w’,$strtime);输出的就是一周中的第几天.就是星期几了.

 代码如下 复制代码

/**
 * 计算上一个月的今天,如果上个月没有今天,则返回上一个月的最后一天
 * @param type $time
 * @return type
 */
function last_month_today($time){
    $last_month_time = mktime(date("G", $time), date("i", $time),
                date("s", $time), date("n", $time), 0, date("Y", $time));
    $last_month_t =  date("t", $last_month_time);

    if ($last_month_t < date("j", $time)) {
        return date("Y-m-t H:i:s", $last_month_time);
    }

    return date(date("Y-m", $last_month_time) . "-d", $time);
}

echo last_month_today($time);

未安装pdo_mysql使用时会提示pdo_mysql 必须支持 请检查 pdo_mysql 模块是否正确加载了,安装方法很简单下面我来看看。


解决方法:

1.修改本地php.ini配置,以Win下的php.ini为例,找到

;extension=php_pdo_mysql.dll

;extension=php_pdo.dll

去除前面的分号“;”

2.重启apache服务即可。

可能碰到问题

建立Apache + Php + mysql + Zend 环境结果遇到一个问题,使用 pdo_mysql.dll 会报错 IE 就会出错 ,原来只要将 libmysql.dll 拷贝到 apache 目录下就可以了


将下载下来的php-5.2-win32-VC6-x86-latest.zip 解压取出其中中的libmysql.dll 扩展库拷贝到 xamppapachebin 和xamppphp目录下去覆盖原文件 重启 apache

 
当用php_pdo_mysql.dll扩展库链接数据库,发现IE页面突然出错自动关闭

点击调试 出现信息如下

szAppVer : 2.2.11.0  szModName : php_pdo_mysql.dll
szModVer : 5.2.8.8 offset : 0000250a

--with-mm 出现问题    configure: error: cannot find mm library ,将mm装在非 /usr下能够解决

汉字在php应用中经常会给我们带来一些麻烦,今天在网上找到一段array数组转换成xml时发现汉字就为空了,后来gg了关天得出比较好的结果了,下面与大家分享。

在 php 数组转xml我们在php中学会这样来写

 代码如下 复制代码


function array2xml($array, $xml = false){
    if($xml === false){
        $xml = new SimpleXMLElement('<root/>');
    }
    foreach($array as $key => $value){
        if(is_array($value)){
            array2xml($value, $xml->addChild($key));
        }else{
            $xml->addChild($key, $value);
        }
    }
    return $xml->asXML();
}
 
header('Content-type: text/xml');
print array2xml($array);

当内容出现汉字时会出现为空的情况


解决办法是转编码处理

 代码如下 复制代码

 
function array2xml($array, $xml = false){
    if($xml === false){
        $xml = new SimpleXMLElement('<root/>');
    }
    foreach($array as $key => $value){
        if(is_array($value)){
            array2xml($value, $xml->addChild($key));
        }else{
           
//$value=utf8_encode($value);
 
            if (preg_match("/([x81-xfe][x40-xfe])/", $value, $match)) {
                $value = iconv('gbk', 'utf-8', $value);  
//判断是否有汉字出现
            }
            $xml->addChild($key, $value);
        }
    }
    return $xml->asXML();
}

后面给大家另一些关于汉字正则实例

1.判断字符串是否全是汉字

 代码如下 复制代码

<?php
    $str = '全部是汉字测试';
    if (preg_match_all("/^([x81-xfe][x40-xfe])+$/", $str, $match)) {
        echo '全部是汉字'; 
    } else {
        echo '不全是汉字';
    }
?>

当$str = '全部是汉字测试'; 时输出"全部是汉字";
当$str = 'all全部是汉字测试'; 时输出"不全是汉字";

[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
  • Element PageHeader页头的使用方法

    这篇文章主要介绍了Element PageHeader页头的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-27
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • PHP函数strip_tags的一个bug浅析

    PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31
  • SQL Server中row_number函数的常见用法示例详解

    这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • PHP加密解密函数详解

    分享一个PHP加密解密的函数,此函数实现了对部分变量值的加密的功能。 加密代码如下: /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ //加密函数 srand(...2015-10-30
  • php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法

    最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。 1.使用 PEAR 的...2015-10-21
  • C#中加载dll并调用其函数的实现方法

    下面小编就为大家带来一篇C#中加载dll并调用其函数的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#虚函数用法实例分析

    这篇文章主要介绍了C#虚函数用法,实例分析了C#中虚函数的功能与基本使用技巧,需要的朋友可以参考下...2020-06-25