PHP 中的单例模式...如何在请求之间保存状态

2024-01-11

通过使用静态变量和单例模式,我认为创建一个简单的购物车会很容易,它会在加载另一个页面时记住购物车中的商品。

我遇到的问题是刷新页面时购物车不记得其中已有的内容。

我下面的代码有问题吗?或者我应该只使用全局变量还是 mysql 数据库。

存储状态的最佳方法是什么?

<?php
//create a singleton class
class shoppingCart {

    private static $_shoppingCartItems = array();
    private static $_instance = null;

    private function __construct(){

    }

    public static function getInstance(){
        if(self::$_instance == null)
            self::$_instance = new shoppingCart();
        return self::$_instance;            
    }


    public function add(ShoppingItem $item){
        $this->_shoppingCartItems[] = $item;
    }

    public function cartCount(){                 
        return count($this->_shoppingCartItems);
    }  
}
?>

执行

$item = new shoppingItem();

$shoppingCart = shoppingCart::getInstance();
$shoppingCart->add($item);
$shoppingCart->add($item);

//should increment by 2 on each page load but it doesn't
echo $shoppingCart->cartCount(); 

静态类成员(或与此相关的任何其他变量)不会在不同的请求中保留。绝不。

救援会议

唯一的例外是$_SESSION;这是一种特殊的机制来实现这一点。

为会话加注星标session_start() http://www.php.net/manual/en/function.session-start.php在脚本的顶部。

您现在可以使用$_SESSION就像存储和检索信息的常规数组一样。会话属于单个用户,它不是在所有用户之间共享数据的方式。

看一看here http://www.php.net/manual/en/session.examples.basic.php进行介绍。

Silence

之前不能输出任何内容session_start()叫做。也就是说,<?php必须是 PHP 脚本中希望使用会话的第一件事。此外,之间不能有 echo 语句或任何其他输出生成函数<?php and session_start().

输出缓冲

如果您确实必须在启动会话之前生成输出,您可以使用输出缓冲 http://php.net/manual/en/function.ob-start.php.

Notes

  • $_SESSION是健忘的。经过一定的time http://www.php.net/manual/en/session.configuration.php#ini.session.gc-maxlifetime如果用户不活动,数据将被删除。
  • 如果您收到以下错误消息,则表明您违反了上述准则。另一种可能性是您的脚本具有 BOM(Unicode 字节顺序标记)。如果是这样,请将其删除。

警告:session_start():无法发送会话 cookie - 标头已经存在 发送者(输出开始于

发生这种情况的原因是 PHP 处理输出的方式造成的:它试图尽快向用户提供输出。然而,HTTP 协议在响应的所有输出(“正文”)之前传输某些控制数据(cookie、哪个会话属于您等),称为“标头”。一旦输出任何内容,就需要发送标头 - 除非您使用输出缓冲。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 中的单例模式...如何在请求之间保存状态 的相关文章

  • Laravel 集成测试:如何断言一个 URL 已被调用但另一个 URL 没有

    我想测试一个向某个 URL 发出请求的控制器 例如 http example com api say hello 但它不会向另一个 URL 发出请求 例如 http example com api say bye bye 我想测试的控制器功
  • 使 pdo::query 静态

    当我运行下面的代码时出现此错误 我通常使用 msql 函数 但我尝试使用 PDO 代替 怎么了 致命错误 第 14 行无法静态调用非静态方法 PDO query
  • 如何使用CSS将背景图像放入选择选项标签中

    我有一个从 json 响应接收的国家 地区下拉列表 并且想要在国家 地区名称旁边添加相应的国家 地区国旗图标 也从 json 响应获取图像 我已经尝试了不同的 jQuery 和 bootstrap 插件 但他们所做的是破坏我以前的选择框样式
  • 按通用值对值进行分组:userid 和 ipaddress

    我正在解决数据库中的一个问题 我正在尝试查找使用多个帐户的用户 我有一个用户 ID 和使用的 IP 地址的列表 如下所示 用户 ID IP 地址 1 IP 地址 13 2 IP 地址 23 1 IP 地址 12 4 IP地址56 9 IP
  • 为什么我不能在 TCPDF 表中使用 č,ć,đ 图表?

    我正在为我的网站构建一个 tcpdf 文件 该 tcpdf 文件中有一个包含一些数据的表格 但我无法使该章程正常工作 对于编码 我使用 windows 1250 宪章女巫不起作用 我已经尝试过 utf 8 但仍然没有得到这个章程 tcpdf
  • Smarty输出空白页

    已解决 模板文件错误 我有这样的 Smarty 设置 require once smarty Smarty class php smarty new Smarty smarty gt compile dir compile dir smar
  • 如何复制 ArrayIterator 以保留其当前迭代位置?

    因为这似乎是我必须做的才能达到这种效果 arr a gt first b gt second iter new ArrayIterator arr Do a bunch of iterations iter gt next new iter
  • facebook php - 如何获取专辑封面照片

    我需要使用 PHP SDK Facebook 获取专辑封面照片 我尝试 https graph facebook com ALBUM ID picture type album 但我得到默认图像 例如 获取用户 https graph fa
  • PHP - 获取base64图像字符串解码并保存为jpg(生成空图像)

    嗨 我实际上是通过 ajax 发送一个 base64 图像字符串到一个 php 脚本 该脚本只是解码字符串并将内容保存为 jpg 文件 但结果是一张空图像 这怎么可能 PHP脚本 uploadedPhotos array photo 1 p
  • 在字符串中间添加一个字符

    可能有一个简单的解决方案可以解决这个问题 但会引起面部表情 我将时间存储为 4 个字符长的字符串 即 1300 我试图将该字符串显示为 13 00 我觉得必须有一个比我现在正在做的更优雅的解决方案 我目前有 startTime get fi
  • 在 Laravel 5 中截断表

    描述 我有一个充满测试数据的表 有时 我想清除它以获取新数据 我可以在 DBMS 应用程序中执行截断 例如MySQL 工作台 但我试图在我的应用程序中实现它 Goal 创建一个按钮 单击时截断数据库中的表 这是我的步骤 1 声明一条路线 R
  • 阻止注销页面后的后退按钮

    我有 php 注销页面 当用户单击注销链接时 请参阅此页面并重定向到索引页面 但是当单击后退按钮时 我会看到带有用户数据的上一页 当然 当我刷新页面时 我看不到以前的页面和数据 我在单击注销并单击后退按钮后检查了其他代码 drupal 但我
  • 为什么验证不起作用并跳转到另一个页面?

    我写了一个customer display php来验证数据 到目前为止只有名字 但无论名字字段是否为空 网页都会跳转到customer search php并且没有更改数据库中的信息 为什么
  • 通过 facebook graph API 检索 facebook 用户的邮政编码

    我正在尝试使用 facebook graph API 检索用户的邮政编码 我正在使用以下代码 代码在php ini中 facebook new Facebook array appId gt APP ID secret gt APP SEC
  • 从数据库填充复选框

    我有两个表 第一个由与名称关联的 id 组成 1 汽车 2 火车 3 普通 ETC 第二个表由两个字段 user id 和第一个表中的 id 组成 例如 1 1 2 1 3 当用户转到该页面时 我试图重新填充选定的复选框 首先 您查询数据库
  • URL 中的 %2F 中断并且未引用所需的 .php 文件 [重复]

    这个问题在这里已经有答案了 我需要将 作为变量作为 URL 的一部分传递 我的结构如下所示 www domain com listings page 1 city Burnaby South type Townhome bedroom 2
  • 如何在 Zend Framework 3 中注册自定义表单视图助手

    我正在将继承的 Zend Framework 2 应用程序迁移到 Zend Framework 3 并且在注册自定义表单视图助手时遇到了一些困难 这些助手在应用程序使用版本 2 时起作用 主要用于添加标签属性以实现可访问性 例如 这是一个自
  • 检查 $_POST 数据

    我正在对表单进行一些垃圾邮件检查 下面的代码在我的本地主机上正常工作 如果为 true 则重定向到 google com 但是 当它在生产服务器上时却不起作用 执行脚本的其余部分并且不重定向到 Google com if POST SERV
  • Laravel $request->file() 返回 null

    尝试在后端使用 Laravel 上传文件时遇到问题 Issue Laravel request gt file 方法返回 null Setup 我使用以下方法构建了一个 AJAX 请求超级代理人 https github com visio
  • 一种无需 JavaScript 即可在 PHP 中确定浏览器宽度的方法?

    首先有吗 或者我必须使用javascript 我希望能够更改使用的 CSS 因此 frex 我可以为移动设备或其他设备加载较小的字体 不幸的是 仅使用 PHP 无法检测用户分辨率 如果您使用 Javascript 则可以在 cookie 中

随机推荐

  • 不需要的 onItemSelected 调用

    我有 36 个微调器 我已经用一些值初始化了它们 我已经与他们一起使用了 onItemSelectedListener 像往常一样 用户可以与这些旋转器交互 触发 onItemSeected 函数 一个问题是调用是在 init 期间进行的
  • 无法让 Swagger UI 与 Spring boot 一起使用

    我正在尝试让 Swagger UI 与 Spring Boot 1 2 1 一起使用 我按照以下说明进行操作https github com martypitt swagger springmvc https github com mart
  • Thrift - 每个 Socket 都有不同的 Handler 实例

    我正在 Thrift 中开发一个 代理 服务器 我的问题是 传入代理的每个连接都使用相同的处理程序实例 代理的客户端实现位于处理程序中 因此所有客户端都通过同一连接与终端服务器进行通信 我有 n 个客户端 gt n 个套接字 gt 1 个处
  • Android Studio 操作栏颜色未改变

    在 styles xml 中运行 Android 5 0 lollipop
  • 搜索引擎 Lucene 与数据库搜索

    我正在使用 MySQL 数据库 并且一直在使用数据库驱动的搜索 数据库引擎和Lucene搜索引擎有何优缺点 我想获得有关何时何地使用它们的建议 我建议你阅读全文搜索引擎与 DBMS https lucidworks com 2009 09
  • Unix 路径搜索 C 函数 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在编写 UNIX shell 程
  • 如何使用 awk、Perl 或 Python 挖掘 XML 文档?

    我有一个具有以下数据格式的 XML 文件
  • python 无法通过电子邮件发送附件文件

    我有以下代码 可以正常工作 但它不会发送附件文件 import smtplib import os from email mime multipart import MIMEMultipart from email mime text im
  • 如何确定 jQuery 中匹配元素的元素类型?

    我通过 ID 名称匹配 ASP Net 生成的元素 但我有一些元素可能根据页面上下文呈现为文本框或标签 我需要确定匹配的是文本框还是标签 以便知道是通过 val 还是通过 html 获取内容 id endOfIdToMatch each f
  • 对标准化数据的曲线拟合结果进行非标准化

    我正在拟合指数衰减函数lsqvurcefit in Matlab 为此 我首先正常化 http en wikipedia org wiki Standard score Standardizing in mathematical stati
  • mysql进程无法停止

    我最近在 Ubuntu 12 04 操作系统桌面上安装了 5 5 28 29 2 Percona Server GPL 版本 29 2 我尝试使用不同的方法停止服务器 sudo etc init d mysql stop sudo kill
  • 地址簿中记录的 ABRecordID(地址簿中插入记录的唯一 ID)

    我在向 iPhone 的联系人添加记录时遇到了困难 情况是这样的我有一个视图 其中创建联系人并将其插入到 iPhone 的联系人中 我想要的是 有没有办法找到插入的 记录 联系人的唯一 ID 在其他视图中访问联系人将需要它 请赐教我这一点
  • 如何在 IntelliJ IDEA 中选择骆驼化单词的单个单词

    IntelliJ IDEA 中移动或选择骆驼化单词的单个单词的快捷方式是什么 假设我有一个 LongMultiWordVariableName 我希望能够将光标移动到每个单词以进行编辑或选择变量的部分 Eclipse has a short
  • backbonejs + cors 和 save() 方法

    我正在尝试执行 POST 抛出保存方法 这是我的模型 app Models Dummy Backbone Model extend initialize function url http anotherdomain Hello 当我执行时
  • VSO(TFS) - 获取当前日期时间作为变量

    如何获取当前日期时间并将其作为变量传递给某些部署任务 您可以定义具有任意值的变量 然后将该变量修改为当前日期 详细步骤如下 在release中定义一个变量 Assume the variable name is time and we se
  • solrj:添加后需要显式提交吗?

    我正在使用solrClient add SolrInputDocument doc 将文档逐一添加到我的方法solr 之后我明确地打电话solrClient commit 是必须的吗 我见过一些add方法 它指定一个delay for co
  • Pandas 根据列的值有效地分块读取大型面板 CSV

    我有一个很大的 CSV 文件 磁盘上约 50 GB 但无法立即将其完全读入内存 数据集本身是面板数据 看起来像 ID Time Col 1 Col N 1 2000 1 1 1 2000 1 2 2 2000 1 1 我加载这些数据的想法是
  • 为什么我的图标没有出现在标题栏中?

    我已从 Visual Studio 解决方案资源管理器的 属性 窗口为我的应用程序分配了一个图标 应用程序的图标更改成功 但标题栏仍显示默认图标 我已经重建了我的应用程序 但它仍然显示默认图标 我究竟做错了什么 因为公司的图标配置与应用程序
  • 将 Y 轴放在热图的左侧?

    如何制作 Y 轴标签位于左侧的热图 好像默认是右边的 我需要使用自定义轴吗axis In the heatmap函数轴的位置是硬编码的 但只需更改一个数字即可将其定位在另一侧 这将非常容易 在控制台中输入 heatmap 然后将第二个参数从
  • PHP 中的单例模式...如何在请求之间保存状态

    通过使用静态变量和单例模式 我认为创建一个简单的购物车会很容易 它会在加载另一个页面时记住购物车中的商品 我遇到的问题是刷新页面时购物车不记得其中已有的内容 我下面的代码有问题吗 或者我应该只使用全局变量还是 mysql 数据库 存储状态的