- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我希望我对标题的措辞足够准确,但我通常使用 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/
我正在开发一个使用多个 turtle 的滚动游戏。玩家 turtle 根据按键命令在 Y 轴上移动。当危害和好处在 X 轴上移动时,然后循环并改变 Y 轴位置。我尝试定义一个名为 colliding(
我不明白为什么他们不接受这个作为解决方案,他们说这是一个错误的答案:- #include int main(void) { int val=0; printf("Input:- \n
我正在使用基于表单的身份验证。 我有一个注销链接,如下所示: 以及对应的注销方法: public String logout() { FacesContext.getCurren
在 IIS7 应用程序池中有一个设置 Idle-time out 默认是 20 分钟,其中说: Amount of time(in minutes) a worker process will rem
我是一名优秀的程序员,十分优秀!