警告全文如下:

  PHP Warning: Unknown: Your script possibly relies on a session side-effect

  which existed until PHP 4.2.3. Please be advised that the session extension does

  not consider global variables as a source of data, unless register_globals is enabled.

  You can disable this functionality and this warning by setting session.bug_compat_42

  or session.bug_compat_warn to off, respectively. in Unknown on

  关于这个问题, 网上有多种解决办法, 但都是不知所以然的答案, 那么真正的原因是什么呢, 怎么解决呢?

  请首先记住这一点. 在PHP4.2开始, register_globals默认设置为了OFF.

  在4.2.3以后, 为了兼容以前的模式, PHP引入了bug_compat_42, 当启用这个选项以后(默认启用), PHP将容许自动将SESSION中的变量做为全局变量使用. 只不过如果bug_compat_warn选项开启的情况下, 会报告这个特性的被使用.

  来看一段代码,

  session_start();

  var_dump($_SESSION);

  $name = 'laruence';

  $_SESSION['name'] = null;

  ?>

  上面的代码, 在bug_compat_42开启, register_globals关闭的情况下, 俩次刷新页面的输出, 分别为:

  //第一次:

  array(0) {}

  //第二次

  array(1) { ["a"]=> string(8) "laruence" }

  为什么第二次不是NULL呢, 因为在bug_compat_42开启的情况下, PHP会认为变量a是$_SESSION['a']的一个引用, 在session_close的时候, 会把变量a的值回写.

  而在这个过程中, 如果bug_compat_warn开启, 则会抛出文章开头的警告.

  So, that it is~

  那么, 它具体给出警告的条件是什么呢? 知道了这些条件, 我们就可以避免这个警告了,

  在PHPSRC/ext/session/session.c中, 有我们想要的一切答案:

  static void php_session_save_current_state(TSRMLS_D) /* {{{ */

  {

  int ret = FAILURE;

  IF_SESSION_VARS() {

  //如果存在Session数组

  if (PS(bug_compat) && !PG(register_globals)) {

  HashTable *ht = Z_ARRVAL_P(PS(http_session_vars));

  HashPosition pos;

  zval **val;

  int do_warn = 0;

  zend_hash_internal_pointer_reset_ex(ht, &pos);

  while (zend_hash_get_current_data_ex(ht

  , (void **) &val, &pos) != FAILURE) {

  if (Z_TYPE_PP(val) == IS_NULL) { //变量为null

  if (migrate_global(ht, &pos TSRMLS_CC)) {//变量回写

  do_warn = 1;

  }

  }

  zend_hash_move_forward_ex(ht, &pos);

  }

  if (do_warn && PS(bug_compat_warn)) {

  php_error_docref(NULL TSRMLS_CC, E_WARNING, "Your script possibly

  relies on a session side-effect which existed until PHP 4.2.3 ..........");

  //后面省略

  可见, 如果不开启bug_compat_42(现在很少用到这个特性, 开启的话有的时候反而会造成迷惑), 或者不开始bug_compat_warn, 或者在register_globals开启的情况下, 都不会看到这个警告.

  另外, 如果开启bug_compat_42, 还可能遇到如下的NOTICE..

  PHP Notice: Unknown: The session bug compatibility code will not try to

  locate the global variable $324324 due to its numeric nature in Unknown on line 0

  这是当你在$_SESSION中使用数字索引的时候, 可能会引发的警告.

PHP.ini

; Whether or not to register the EGPCS variables as global variables. You may
; want to turn this off if you don't want to clutter your scripts' global scope
; with user data.
; You should do your best to write your scripts so that they do not require
; register_globals to be on; Using form variables as globals can easily lead
; to possible security problems, if the code is not very well thought of.
; http://php.net/register-globals
register_globals = Off 改成 On

[转]PHP Session的一个警告的更多相关文章

  1. mysql编译时报的一个警告warning: type-punning to incomplete type might break strict-aliasing rules,可能是bug

    cmake的时候报了一个警告: /softdb/mysql-5.5.37/storage/innobase/handler/ha_innodb.cc:11870: warning: type-punn ...

  2. QApplication::alert 如果窗口不是活动窗口,则会向窗口显示一个警告(非常好用,效果就和TeamViewer一样)

    void QApplication::alert(QWidget * widget, int msec = 0)如果窗口不是活动窗口,则会向窗口显示一个警告.警报会显示msec 毫秒.如果毫秒为零,闪 ...

  3. 同一个tomcat多个项目共享session,一个tomcat两个项目共享sessionId

    同一个tomcat多个项目共享session,一个tomcat两个项目共享sessionId >>>>>>>>>>>>>& ...

  4. JSP中,EL表达式向session中取出一个attribute和JSP脚本访问session取出一个attribute,写法有何不同?(转自百度知道)

    EL表达式使用起来会更简洁,假如session中有一个属性A(attrA),那么EL和jsp脚本取值的方式如下: EL表达式:${ sessionScope.attrA } JSP脚本:<%=s ...

  5. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:表示一个警告的操作

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. session的一个问题

    <%@ page language="java" import="java.util.*,javax.servlet.http.Cookie.*" pag ...

  7. Session问题-一个部门A登录后未注销另一个部门B再登录,以B的身份操作A的成员

    当管理员A登录后,打开某个管理界面.在A和B权限菜单相同的情况下,管理员B新开页面登录,session变为B的,然后切换到A打开的界面,不刷新的情况下可以操作A的数据. 解决方案:当浏览器登录后,即存 ...

  8. 在MDK 中忽略(suppress) 某一个警告

    文章转载自:http://www.51hei.com/bbs/dpj-29515-1.html 有时候我们需要在MDK中忽略掉某一个具体的warnning,怎么做呢? 只需在Misc Control中 ...

  9. react-native 调用 TouchableOpacity (触摸透明) 时报了一个警告

    `useNativeDriver` is not supported because the native animated module is missing. Falling back to JS ...

随机推荐

  1. 使用windows crypt API解析X509证书

    一.版本号 结构体CERT_INFO中的字段dwVersion即为证书版本,可以直接通过下面的代码获得: DWORD dwCertVer = m_pCertContext->pCertInfo- ...

  2. 用户、角色、权限三者多对多用hibernate的一对多注解配置

    用户.角色.权限三者多对多用hibernate的一对多注解配置 //权限表@Table(name = "p")public class P { @Id @GeneratedValu ...

  3. Eclipse下.project和.classpath作用(转)

    classpath作用 定义项目的结构,如src.output.con.lib等. 源文件的具体位置(kind="src") 运行的系统环境(kind="con" ...

  4. hdu 2069

    #include "stdio.h" int main(){ int num,i1,i2,i3,i4,i5,n; int n1,n2,n3,n4,n5; while(~scanf( ...

  5. 算法练习:寻找最小的k个数

    参考July的文章:http://blog.csdn.net/v_JULY_v/article/details/6370650 寻找最小的k个数题目描述:查找最小的k个元素题目:输入n个整数,输出其中 ...

  6. fushioncharts 使用教程要点---使用JSON数据方式

    1.建立图表步骤: A.下载fushionChart,引入FusionCharts.js和FusionChartsExportComponent.js文件 B.建立图表对象 var chart1 =  ...

  7. HTML5的form表单属性

    form:HTML4中,表单内的从属元素必须书写在<form></form>之内,但是在HTML5中,表单的从属元素可以处于页面的任何位置,然后为其添加form属性,属性值为f ...

  8. 安装Eclipse环境变量的配置,

    window7系统下的 步骤:    第一步:先安装JDK(记住你安装的位置)我安装在D:\Program Files\Java           目录下. 第二步:JDK安装好后,配置环境变量(重 ...

  9. 深入理解JavaScript系列:为什么03-0.2不等于0.1

    五一宅家看书,所以接着更新一篇文章. 今天讲一下为什么03-0.2不等于0.1这个问题. 有点标题党的味道,在JavaScript中,当你试着对小数进行加减运算时,有时候会发现某个结果并非我们所想的那 ...

  10. 如何全面解决ECSHOP的jquery冲突

    主要就是Ecshop的AJAX传输类,transport.js中重写了object的对象原型,从而导致了与jq框架的冲突. 解决: 1. 删除transport.js中587行 - 636行中关于ob ...