Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免PHP会话“u start()vs”的第22条陷阱;“已发送邮件头”;警告_Php - Fatal编程技术网

如何避免PHP会话“u start()vs”的第22条陷阱;“已发送邮件头”;警告

如何避免PHP会话“u start()vs”的第22条陷阱;“已发送邮件头”;警告,php,Php,我有一个在本地服务器上运行完全正常的应用程序 它需要两件事: 一个活动的$\u会话,因此每个页面上都有许多关键数据元素可用。(比如用户id和用户角色。) 在我的页面顶部有几个“require_once()”调用,这样我就有了一些可用的常量和标准消息,并且每个页面上都有相同的标题 同样,在我的本地服务器上(使用PHP5.6),这一切都很好 但是,在我的主机服务器上(也使用PHP5.6),我有一个第22条军规: 如果我在每个页面上调用“session_start()”,由于我使用了“require

我有一个在本地服务器上运行完全正常的应用程序

它需要两件事:

  • 一个活动的$\u会话,因此每个页面上都有许多关键数据元素可用。(比如用户id和用户角色。)
  • 在我的页面顶部有几个“require_once()”调用,这样我就有了一些可用的常量和标准消息,并且每个页面上都有相同的标题
  • 同样,在我的本地服务器上(使用PHP5.6),这一切都很好

    但是,在我的主机服务器上(也使用PHP5.6),我有一个第22条军规:

    • 如果我在每个页面上调用“session_start()”,由于我使用了“require_once()”,我会收到“headers ready sent”警告
    • 如果我没有在每个页面上调用“session\u start()”,则$\u session变量在进入下一页时为空
    我唯一的想法似乎很糟糕:

  • 不要使用会话并在URL中传递我的所有数据。这似乎是不安全的,笨拙的,而且像是坏习惯
  • 不要使用“require_once()”,这看起来很愚蠢,因为我会到处都是重复的代码
  • 我该怎么办? 我在一个共享服务器上,所以我认为我不能修改php.ini文件。我的东道主公司在任何其他问题上都很有帮助,在过去的两周里,当我向他们发送有关这个问题的问题时,他们完全保持沉默

    我创建了一个非常简单的示例来说明这个问题。信息量最大的可能是“firstpage.php”的注释,特别是“会话在什么情况下启动”注释下的“if”语句

    这是索引页面(称为mytestindex.php)

    我通过将“session_start()”的代码移动到我的config.php文件中,确保它是第一段代码,从而解决了这个问题(谢谢“martin先生”)

    然后,对于应用程序中的每个页面,我确保这是第一行代码:

    <?php
    require_once("config.php");
    
    
    需要解释,因为似乎不够清楚(??):

    如果会话的状态为“无”,则启动会话


    此外,如果您回显任何已发送的标题,则应在任何require或require_once之前调用。此外,文件的编码也会影响输出并过早地将数据发送到客户端。什么操作系统是您的服务器和开发机器。您只需确保在任何输出之前调用了
    session\u start()
    。这意味着,如果您将一个文件包含到另一个已经调用了
    session\u start()
    的文件中,则包含的文件不需要它。或者,您可以将所有内容都包装在
    ob\u start
    中,但这是一种绕过它的黑客方式。使用
    require\u once
    不会影响发送头,除非包含的文件输出任何内容。最好的办法是:去掉你的结束标记,这是人们用来防止尾随空格导致这个问题的一种做法。我尝试删除结束标记,甚至注释掉包含文件中的所有代码。那没用。但是如果我把session_start()放在tippy的顶部,就可以了。现在看看我是否能找到一种优雅的方式来包含它,或者看看我是否需要在我的应用程序中的每个文件上硬编码它。另外,开发机器是Windows,主机服务器是Linex,添加一些注释来解释您的代码将有助于改进这个答案。真的吗?代码是不言自明的!如果会话的状态为“无”,请启动它。说真的……我在低质量的事后审查队列中找到了这个答案;系统将其标记为低质量,因为没有努力解释代码。这个常数是什么?它记录在哪里?函数返回什么?它还可以返回什么其他值?快速搜索PHP_SESSION_NONE和SESSION_start()会告诉您,但由于所有内容都必须填鸭式输入,因此我编辑了我的答案。代码本身是不言自明的,但它没有解释它解决OPs问题的原因。正如马丁斯先生所说,上面的评论确实解释了这一点。
    if (session_status() == PHP_SESSION_NONE) {
      session_start();
    }