3

我希望我对标题的措辞足够准确,但我通常使用 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();

}

我只包括 create 以保持简短。然后我还有 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 传递必要的数据,或者将数据保存在数据库中并稍后检索它以比较时间。推荐的方法是什么,不仅仅是这个,而是任何需要以前创建的数据的方法?另外,我认为脚本一次只对一个网页“活着”是否正确?谢谢!

4

3 回答 3

2

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

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

于 2012-06-29T15:22:07.097 回答
2

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

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

此类问题在 Web 开发中会一次又一次地遇到 - 所以要好好了解问题及其解决方案!

于 2012-06-29T16:22:43.787 回答
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';

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

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

于 2012-06-29T17:53:18.563 回答