[PHP-users 748] 変数の永続化

Osamu Shigematsu php-users@php.gr.jp
Wed, 18 Jul 2001 10:15:39 +0900


重松と申します。

PHP 3.0.15, PHPLIB 7.2c を使っています。

変数を永続化したいと思い、

    $user->register("pdata");

とし、$pdata を登録しました。
# user は User のサブクラスのインスタンスです。

$pdata  は配列で、必要な情報を適宜

    $pdata["foo"] = $foo;

のように代入しているのですが、ソースは同じにもかかわらず、昨日はできたことが、
今日になって、永続できなくなりました。

ブラウザのキャッシュの問題かと思い、クリアしてみましたが、変わりませんでした。
ちなみに、Mac の IE 5, Windows2000 の IE 5 で試しましたが、結果は同じでした。

なお、当該ソースは以下のようなものです。$user->register("pdata") は
index.php3 に書かれていて、$proc[] の内容により、include するファイルを切り
替えています。$proc[] はフォームが渡した $proc を index.php3 で
explode("_",$proc) として切り出したものです。
# implode で配列の個数を指定して連結できないんでしょうか。。。

変数の永続化で何か勘違いなどがあるのではと思っているのですが、
確認すべき点、誤り、などお気づきでしたら、ご指摘いただければ幸いです。

<?php
// $Id$

// ========================================
// 契約期間の入力 - 契約日
// ========================================

$errmsg = "";
for(;$step;){
    // 永続化処理

    if(!isset($contract_date_Y)) fatal_exit(__FILE__,__LINE__);
    if(!isset($contract_date_m)) fatal_exit(__FILE__,__LINE__);
    if(!isset($contract_date_d)) fatal_exit(__FILE__,__LINE__);

    $contract_date = mktime(0,0,0,
        $contract_date_m,
        $contract_date_d,
        $contract_date_Y);

    // あり得ない日付が選択されていないか
    $errmsg = "$contract_date_Y 年 $contract_date_m 月 $contract_date_d 日は
不正な日付です。";
    if(date("Y",$contract_date)!=$contract_date_Y) break; // 永続化処理中断
    if(date("m",$contract_date)!=$contract_date_m) break; // 永続化処理中断
    if(date("d",$contract_date)!=$contract_date_d) break; // 永続化処理中断

    if(isset($pdata["contract_date"])){
        // すでに設定されている
        if($pdata["contract_date"] != $contract_date){
            // 値が変更された
            // 影響のある永続変数をすべてクリア
            unset($pdata["contract_strat"]);
            unset($pdata["contract_end"]);
        }
    }
    $pdata["contract_date"] = $contract_date;

    // 次の画面へ遷移
    $url  = "./?proc=";
    $url .= sprintf("%d_%d_%d", $proc[0], $proc[1], $proc[2]+1);
    Header("Location: $url");
    exit(); // リダイレクトのためここで処理終了
}

if(!$errmsg){
    if(isset($pdata["contract_date"])){
        // すでに設定されている
        $contract_date_Y = date("Y", $pdata["contract_date"]);
        $contract_date_m = date("m", $pdata["contract_date"]);
        $contract_date_d = date("d", $pdata["contract_date"]);
    }else{
        // この画面は初めて -> 今日の日付にする
        $contract_date_Y = date("Y");
        $contract_date_m = date("m");
        $contract_date_d = date("d");
    }
}

// アクセス権確認
$perm->check("localcenter_admin"); // ローカルグループ管理者権限が必要

require("html_document.inc");

$html = new html_document;

$tag  = "<h1>契約期間の入力 - 契約日</h1>";

$tag .= "<form method=\"post\" action=\"./\">";
$tag .= "<input type=\"hidden\" name=\"proc\" value=\"";
$tag .= sprintf("%d_%d_%d", $proc[0], $proc[1], $proc[2]) . "\">";
$tag .= "<input type=\"hidden\" name=\"step\" value=\"1\">";

$tag .= "契約日: ";

// 選択肢作成
{
    // 年 2000 年から現在の次の年まで
    $tag .= "<select name=\"contract_date_Y\">";
    for($i = 2000; $i <= ((int)date("Y")) + 1; ++$i){
        $s = ($i==$contract_date_Y) ? " selected=\"selected\"" : "";
        $tag .= "<option value=\"$i\"$s>$i";
    }
    $tag .= "</select>";
    $tag .= "年";

    // 月
    $tag .= "<select name=\"contract_date_m\">";
    for($i = 1; $i <= 12; ++$i){
        $s = ($i==$contract_date_m) ? " selected=\"selected\"" : "";
        $tag .= "<option value=\"$i\"$s>$i";
    }
    $tag .= "</select>";
    $tag .= "月";

    // 日
    $tag .= "<select name=\"contract_date_d\">";
    for($i = 1; $i <= 31; ++$i){
        $s = ($i==$contract_date_d) ? " selected=\"selected\"" : "";
        $tag .= "<option value=\"$i\"$s>$i";
    }
    $tag .= "</select>";
    $tag .= "日";
    $tag .= "<br>";
    if($errmsg)
        $tag .= "$errmsg<br>";
}

$tag .= "<input type=\"submit\" value=\"選択\">";
$tag .= "</form>";

$html->append($tag);
$html->build();

?>

-- 
Osamu Shigematsu

http://www.ravi.ne.jp/
mailto:shige@ravi.ne.jp