gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:34:52 26 4
gpt4 key购买 nike

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

}

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

最佳答案

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 脚本生成一个 View 来编写隐藏的表单字段,其值是您想要记住并在下一次请求时发回给您的数据。

这种问题是您在 Web 开发中会反复遇到的问题 - 所以要好好了解问题及其解决方案!

关于php - 了解 Web 开发/CodeIgniter 中脚本的数据传递/生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11264365/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com