3

タイトルを十分に正確に表現したいと思いますが、私は通常Javaを使用しており、Web開発/ PHP/CodeIgniterの経験があまりありません。私が開発しているWebサイトに特定の機能を実装しようとしていることに気付いたので(方法を学ぶ手段として)、スクリプトのライフサイクルを理解するのに苦労しています。最初に実装しようとした機能について説明し、次に遭遇した問題により、通常のOOPに慣れているため、スクリプトがどのように機能するかについての基本的な理解に疑問を投げかけました。

さて、ここに行きます...

ユーザーが実行できる2つの基本的なタスク、エントリの作成と削除を含むWebページがあります。私が実装しようとしたのは、ユーザーが特定のタスクを完了するのにかかる時間を計測する方法でした。私がこれを行った方法は、ユーザーが選択できるタスクのリスト(この場合は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に渡すか、データをデータベースに保存して後で取得し、時間を比較することです。これだけでなく、以前に作成したデータが必要な場合に推奨される方法は何でしょうか。また、スクリプトは一度に1つのWebページに対してのみ「有効」であると考えるのは正しいですか?ありがとう!

4

3 に答える 3

2

セッションで追加の手順を実行し、データベース テーブルを実装して現在のセッションを保存できます。これにより、ID を検証し、それが有効なセッションであり、たとえば modded 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 に答える
2

Web 開発は、主に HTTP の性質により、「標準」の開発とは少し異なります。Web アプリケーションへの各要求は、すべての Web 開発者が知っているように、ステートレスである HTTP を使用してネットワークを通過する必要があります。これが意味することは、Web サーバーは以前の HTTP 要求について何も覚えておく必要がないということです。通常、Web 開発者は何らかの方法で Cookie を使用してこれを回避します。Cookie はテキスト文字列としてコード化されたデータの一部であり、次のリクエストでアプリケーションに再送信できるようにブラウザに送り返されます。そのように、クッキーは一種の転送可能なメモリです。

そのため、リクエストを行うたびに、Cookie (HTTP Cookie、または URL Cookie と呼ばれることもある URL にコード化された状態データ) を使用してデータを転送しない限り、Web アプリケーションには真新しいように見えます。過去のリクエストとは関係ありません。したがって、アプリケーションが機能するためには、何らかの方法で Cookie を使用して、ユーザーがタスクを完了したことを検出した開始時刻を記憶または回復する必要があります。(i) データを記憶するための CI の組み込み機能 (上記のフラッシュデータ、または CI セッション クラスからのユーザーデータ - http://codeigniter.com/user_guide/libraries/sessions.htmlを参照) を使用できます。)、CI Cookie の上に構築されている)、(ii) 独自の Cookie データを使用してこれを行う (推奨されません。その場合、なぜフレームワークを使用するのですか?)、または (iii) 非表示のフォーム フィールドを使用します。この手法では、ビューを生成する PHP スクリプトが非表示のフォーム フィールドに書き込む必要があります。このフィールドの値は、記憶したいデータであり、次のリクエストで返信されます。

この種の問題は、Web 開発で何度も遭遇するものです。そのため、問題とその解決策をよく理解してください。

于 2012-06-29T16:22:43.787 に答える
2

flashdata を使用して、次のサーバー要求でデータを利用できるようにすることができます。

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

于 2012-06-29T15:22:07.097 に答える