了解 Web 开发/CodeIgniter 中脚本的数据/生命传递


Understanding the passing of data/life of a script in web development/CodeIgniter

我希望我的标题措辞足够准确,但我通常使用Java,并且在Web开发/PHP/CodeIgniter方面没有太多经验。我很难理解脚本的生命周期,因为我发现试图在我正在开发的网站中实现某个功能(作为学习如何实现的一种手段)。我将首先描述我尝试实现的功能,然后我遇到的问题让我质疑我对脚本工作原理的基本理解,因为我习惯了典型的 OOP。

好的,所以这里...

我有一个网页,其中包含用户可以执行的 2 个基本任务,创建和删除条目。我试图实现的是一种对用户完成某项任务所需的时间进行计时的方法。我这样做的方式是有一个主页,其中将有一个用户可以选择的任务列表(在本例中为 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传递必要的数据,或者将数据保存在数据库中,稍后检索以比较时间。推荐的方法是什么,不仅仅是这个,还有任何需要以前创建的数据的东西?另外,我认为脚本一次只对一个网页"活着"是否正确?谢谢!

Web开发与"标准"开发略有不同 - 主要是因为HTTP的性质。 对Web应用程序的每个请求都必须使用HTTP在网络上传输,正如所有Web开发人员所知,HTTP是无状态的。 这意味着Web服务器不必记住有关以前的HTTP请求的任何内容。 通常,Web开发人员以一种或另一种方式使用cookie来解决这个问题 - 其中cookie是一些数据,编码为文本字符串,被发送回浏览器,以便它可以在下一个请求时将其重新发送到应用程序。 像这样,饼干是一种可转移的记忆。

因此,每次您发出请求时,除非您使用 cookie(HTTP cookie 或有时称为 URL cookie - URL 中编码的状态数据)传输一些数据,否则它看起来就像一个全新的请求,与任何过去的请求无关。 因此,为了使您的应用程序正常工作,您需要以某种方式使用 cookie 来记住或恢复检测到用户已完成任务时的开始时间。 您可以 (i) 使用 CI 的内置工具来记住数据(如上所述的 flashdata,或来自 CI 会话类的用户数据 - 见 http://codeigniter.com/user_guide/libraries/sessions.html),它们建立在 CI cookie 之上),(ii) 使用您自己的 cookie 数据执行此操作(不推荐 - 在这种情况下为什么要使用框架?),或 (iii) 使用隐藏表单字段 - 一种老式但有时是黄金的技术,需要 PHP 脚本生成一个视图来编写隐藏的表单字段值是您要记住并在下一个请求时发回给您的数据。

这种问题是您在 Web 开发中一次又一次会遇到的问题 - 因此请充分了解问题及其解决方案!

您可以使用 flashdata 使数据可用于下一个服务器请求。

参考: http://codeigniter.com/user_guide/libraries/sessions.html

您可以对会话执行额外的步骤,并实现数据库表来存储当前会话。这使您能够验证 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`)

);

修改配置文件(应用程序/配置/配置.php):

$config['sess_use_database'] = TRUE;
$config['sess_table_name'] = 'ci_sessions';

然后,使用标准方法设置和获取值。

这是指南:CI 用户指南 - 会话类