我希望我能够准确地说出这个标题,但我通常使用Java并且在Web开发/ PHP / CodeIgniter方面没有太多经验。我很难理解脚本的生命周期,因为我发现试图将某个功能实现到我正在开发的网站上(作为一种学习方法)。我将首先描述我尝试实现的功能,然后遇到的问题让我质疑我对脚本如何工作的基本理解,因为我已经习惯了典型的OOP。
好的,所以这里......
我有一个网页,其中包含用户可以执行的两项基本任务,创建和删除条目。我试图实现的是一种为用户计时他们完成某项任务需要多长时间的方法。我这样做的方式是有一个主页,其中有一个用户可以选择的任务列表(在这种情况下为2,创建和删除)。用户将点击将链接到“真实”主页的任务,然后用户将完成该任务。我的脚本看起来像这样:
<?php
class Site extends CI_Controller {
var $task1;
var $tasks = array(
"task1" => NULL,
"date1" => 0,
"date2" => 0,
"diff" => 0);
function __construct()
{
parent::__construct();
include 'timetask.php';
$this->task1 = new TimeTask("create");
}
function index()
{
$this->tasks['task1'] = $this->task1->getTask();
$this->tasks['diff'] = $this->task1->getTimeDiff();
if($this->tasks['diff'] == NULL)
{
$this->tasks['diff'] = 0;
}
$this->load->view('usability_test', $this->tasks);
}
function origIndex()
{
$this->task1->setDate1(new DateTime());
$this->tasks['date1'] = $this->task1->getDate1()->getTimestamp();
$data = array();
if($q = $this->site_model->get_records())
{
$data['records'] = $q;
}
$this->load->view('options_view', $data);
}
function create()
{
$this->task1->setDate2(new DateTime());
$this->tasks['date2'] = $this->task1->getDate2()->getTimestamp();
$data = array(
'author' => $this->input->post('author'),
'title' => $this->input->post('title'),
'contents' => $this->input->post('contents')
);
$this->site_model->add_record($data);
$this->index();
}
我只包括创建以保持简短。然后我也有了TimeTask类,实际上另一个StackOverflow对我有所帮助:
<?php
class TimeTask
{
private $task;
/**
* @var DateTime
*/
private $date1, $date2;
function __construct($currTask)
{
$this->task = $currTask;
}
public function getTimeDiff()
{
$hasDiff = $this->date1 && $this->date2;
if ($hasDiff) {
return $this->date2->getTimestamp() - $this->date1->getTimestamp();
} else {
return NULL;
}
}
public function __toString()
{
return (string) $this->getTimeDiff();
}
/**
* @return \DateTime
*/
public function getDate1()
{
return $this->date1;
}
/**
* @param \DateTime $date1
*/
public function setDate1(DateTime $date1)
{
$this->date1 = $date1;
}
/**
* @return \DateTime
*/
public function getDate2()
{
return $this->date2;
}
/**
* @param \DateTime $date2
*/
public function setDate2(DateTime $date2)
{
$this->date2 = $date2;
}
/**
* @return get current task
*/
public function getTask()
{
return $this->task;
}
}
?>
我不认为发布视图对于问题是必要的,但这里至少是如何建立链接。
<?php echo form_open('site/create');?>
...and...
<?php echo anchor("site/delete/$row->id", $row->title); ?>
现在代码中没有错误,但它没有做到我对它的期望,我之所以认为原因是因为每次通过新页面调用脚本函数时它都不是同一个实例之前调用的脚本,因此任何以前创建的对象都不再存在。这让我感到困惑,让我不确定如何优雅地实现这一点。我猜测如何做到这一点的一些方法是通过URL传递必要的数据或将数据保存在数据库中并稍后检索以比较时间。什么是推荐的方法,不仅仅是这个,还有什么需要以前创建的数据?另外,我认为脚本一次只能为一个网页“活着”吗? 谢谢!
答案 0 :(得分:2)
您可以使用flashdata为下次服务器请求提供数据。
参考:http://codeigniter.com/user_guide/libraries/sessions.html
答案 1 :(得分:2)
Web开发与“标准”开发略有不同 - 主要是因为HTTP的本质。对Web应用程序的每个请求都必须使用HTTP传输到网络,正如所有Web开发人员所知,HTTP是无状态的。这意味着Web服务器不必记住以前的HTTP请求。通常,webdevs以这种或那种方式使用cookie来解决这个问题 - 其中cookie是一些数据,编码为文本字符串,然后发送回浏览器,以便它可以在下次请求时将其重新发送到应用程序。像那样,cookie是一种可转移的记忆。
因此,每次发出请求时,除非您使用cookie(HTTP cookie或有时称为URL cookie的状态 - 在URL中编码状态数据)传输某些数据,否则它会向Web应用程序查找一个全新的请求,与过去的任何请求无关。因此,为了使您的应用程序正常工作,您需要以某种方式使用cookie来记住或恢复用户完成任务时的开始时间。您可以(i)使用CI的内置工具来记忆数据(如上所述的flashdata,或来自CI Session类的用户数据 - 请参阅http://codeigniter.com/user_guide/libraries/sessions.html),它们构建在CI cookie之上),(ii) )使用您自己的cookie数据(不推荐 - 为什么在这种情况下使用框架?),或(iii)使用隐藏的表单字段 - 一种旧的但有时是goldie技术,需要PHP脚本生成一个视图来编写隐藏的表单字段其值是您要记住的数据,并在下次请求时发回给您。
这种问题是您在网络开发中一次又一次遇到的问题 - 所以要很好地了解问题及其解决方案!
答案 2 :(得分:2)
您可以使用会话执行额外步骤并实现数据库表以存储当前会话。这使您能够验证ID并确认它是有效的会话,而不是通过修改的cookie意外恢复的旧会话。
这是非常直接的。
创建表格:
CREATE TABLE IF NOT EXISTS `ci_sessions` (
session_id varchar(40) DEFAULT '0' NOT NULL,
ip_address varchar(45) DEFAULT '0' NOT NULL,
user_agent varchar(120) NOT NULL,
last_activity int(10) unsigned DEFAULT 0 NOT NULL,
user_data text NOT NULL,
PRIMARY KEY (session_id),
KEY `last_activity_idx` (`last_activity`)
);
修改配置文件(application / config / config.php):
$config['sess_use_database'] = TRUE;
$config['sess_table_name'] = 'ci_sessions';
然后,使用标准方法设置和获取值。