我付了一个程序员来制作一个购物篮脚本来使用Spreadshirt API.一切都很完美,除了篮子一直在排空.我认为会话在某些时候丢失,所以脚本创建了另一个BasketId.
我试图找出它是否有特定原因发生,没有任何成功......我无法重现这个错误.它只是随机发生而没有任何理由.关闭浏览器,重置apache甚至整个网络服务器都不会引起会话丢失.
我有两个不同的脚本在同一个域上使用cookie,他们没有任何问题(一个是管理员登录会话的cookie,另一个cookie是保存用户在商店上最后查看的文章)
我尝试了谷歌上找到的所有解决方案没有任何成功:编辑php.ini,通过PHP强制ini设置,尝试了htaccess方式,...
这是我的phpinfo的"会话"部分:http://gyazo.com/168e2144ddd9ee368a05754dfd463021
shop-ajax.php (会议处理@第18行)
ini_set('session.cookie_domain', '.mywebsite.com' );
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate");
$language = addslashes($_GET['l']);
$shopid = addslashes($_GET['shop']);
// if($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {
// die("no direct access allowed");
// }
if(!session_id()) {
$lifetime=60 * 60 * 24 * 365;
$domain = ".mywebsite.com";
session_set_cookie_params($lifetime,"/",$domain);
@session_start();
}
// Configuration
$config['ShopSource'] = "com";
$config['ShopId'] = $shopid;
$config['ShopKey'] = "*****";
$config['ShopSecret'] = "*****";
/*
* add an article to …Run Code Online (Sandbox Code Playgroud) 我今年夏天已经设置了两个不同的PHP系统.每个使用两种不同的方法:
方法#1:每个任务一个PHP文件
此方法要求PHP为每个主要任务创建一个文件.例如,我的上传脚本将通过访问http://www.domain.com/upload.php.在upload.php,实例化和使用"控制器"和"视图"类.例如,upload.php可能看起来像这样:
<?php
require_once PATH_LIBRARY . 'control/Uploader.class.php';
require_once PATH_LIBRARY . 'view/UploaderPage.class.php';
$uploader = new Uploader();
$uploader->setView(new UploaderPage());
$uploader->init();
?>
Run Code Online (Sandbox Code Playgroud)
在上面的脚本中,如果我想调用另一个脚本,我只需重定向并附加必要的URL编码变量(header('Location: edit_details.php?image_id=456');).
方法#2:index.php处理所有请求的主文件
此方法不要求PHP为每个主要任务创建文件.相反,将在系统中使用的每个"控制器"类都使用index.php我调用的唯一类进行注册Router.路由器决定指定的Controller是合法的还是非法的并且相应地起作用(将浏览器路由到正确的控制器).例如,index.php脚本的简化版本:
<?php
require_once 'bootstrap.inc';
require_once PATH_LIBRARY . 'router/Router.class.php';
$router = new Router();
$router->register('Uploader', PATH_LIBRARY . 'control/Uploader.class.php');
$router->register('DetailsEditor', PATH_LIBRARY . 'control/DetailsEditor.class.php');
$router->route();
?>
Run Code Online (Sandbox Code Playgroud)
因此,每一个行动都发生在index.php.不需要很多文件,这些文件没有做太多其他实例化特定视图和控制器类的文件.但是,如果你想从脚本/类B调用脚本/类A,那么你需要在URL上传递控制器类的名称:header('Location: index.php?controller=DetailsEditor&image_id=456').
到目前为止,我真的不喜欢我需要在URL中包含Controller名称的事实.我觉得它将我的底层系统暴露给最终用户.但是,我确实喜欢我可以在一个页面上注册所有控制器类的事实.大多数情况下,我不知道暴露控制器名称是否安全.另一个烦恼是,如果我想通过POST请求调用脚本,我必须包含一个指定所需控制器类的隐藏输入(例如<input type="hidden" name="controller" value="DetailsEditor" />).
我希望这足以继续下去.我很紧张第二种方法在未来几个月里并没有真正为我服务.我很快就会选择一个或另一个.
谢谢.
我通常最终添加session_start()到我的 PHP 站点上每个页面的顶部(或在每个页面中包含的头文件中)。我最近发现您可以通过使用以下设置来自动启动会话php.ini:
session.auto_start = 1
使用此设置有哪些潜在的缺点(如果有)?
我不确定我应该如何表达这一点,但我会试一试.
我最近开始使用面向对象的PHP编写我的投资组合,我想知道是否根据最佳实践使用单个页面,其中内容根据SQL数据和$ _GET变量而变化?
如果是/否,为什么?
编辑:看看我的下一篇文章,更深入的细节.