• 締切済み

PHPでセッションに入れたクラスの変数が消える

こんにちは。 PHPでセッションを使っていて困ったことが怒りました。 セッションに入れたクラスインスタンスの中の変数が消えます。 一回目に参照したときは残っていますが、 2回目アクセスした時には無くなってます。 クラスインスタンスのメンバー変数に文字列など、PHP標準のものは残ってますが、メンバー変数にインスタンスを入れると、消えることが判明しました。 これはなぜですか?? よろしくお願いします。

  • PHP
  • 回答数1
  • ありがとう数0

みんなの回答

回答No.1

情報が足りなすぎです 問題のあるソースをできるだけ簡素化して載せるとかしないと 誰も回答してくれないかと session_startしてないとか?

utukusi
質問者

補足

すいませんでした。以下が自分が試した例です。 //オブジェクト <?php /*testオブジェクトクラス*/ Class TestObj{ var $commodityName = null; //商品名 var $price = null; //価格 } //1番目のページ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_Jis"> <title>SessionTest1</title> </head> <body> <form action="sessionTest.php" method="POST"> 物:<input type="text" name="comName" /> 値段:<input type="text" name="price" /> <input type="submit" value="送信しちゃおう"> </form> </body> </html> //2番目のページ <?php session_start(); include("object/TestObj.php"); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_Jis"> <title>SessionTest1</title> </head> <body> <?php if($_SERVER['REQUEST_METHOD']=="POST"){ $obj = $_SESSION["cart"]; if($obj != null){ $obj = $_SESSION["cart"]; }else{ $obj = new TestObj(); } $obj->commodityName = $_POST["comName"]; $_price = $obj->price; $_price = $_price + $_POST["comPrice"]; $obj->price = $_price; $_SESSION["cart"] = $obj; echo "ポストされている"; }else{ echo "ポストされてはいない"; } ?> <table> <?php $obj = $_SESSION["cart"]; if($obj != null){ ?> <tr> <td>名前:<?=$obj->commodityName?></td> <td>価格:<?=$obj->price?></td> </tr> <?php }else{ echo "何も追加されていない"; } ?> </table> <a href="sessionKushon.php">次のページへいく</a> </body> </html> //3番目のページ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_Jis"> <title>SessionTest1</title> </head> <body> どうなってるの? <a href="sessionForm.php">最初にもどろうぜ。</a> </body> </html> //以上 このような感じで作ってみたんです。最初のページがsessionForm.phpで、ここで何か入力します。価格に数字を入れます。 送信ボタンを押して次のページ(sessionTest.php)に行きます。 期待していることとして、最初に入れた数値が表示されてほしいけど、 0になります。 さらに、次のページ(sessionKushon.php)に進むか、戻るを押して、最初のフォームページに行き、また何か入力して送信して次のページに行きます。 すると何も表示されません。 これはなぜでしょうか??お願いします。

関連するQ&A

  • クラス変数とインスタンス変数

    PHP4でクラスを使いはじめたのですが、わからないことが出てきたので、教えてください。 クラスで指定したメンバ変数は、インスタンス毎に記憶さる、インスタンス変数になると思いますが、 クラスそのものに関連付けされた、クラス変数というものは、PHPでは使えないのでしょうか? 以上、よろしくお願いいたします。

    • 締切済み
    • PHP
  • rubyのクラス変数のようなものは無い?

    rubyのクラス変数に相当するものはPHPにはないのでしょうか? つまり、あるクラスの全てのインスタンスで共有する変数です。 DB中に存在する環境固有の値をクラスで保持したいのですが、インスタンスごとにDBアクセスするのは無駄なので、初回インスタンス生成時(is_nullで判断)にのみDBアクセスして、あとはそれを参照するだけにしたい。 globalを使って全体でのグローバル変数にするしかないのでしょうか?

    • ベストアンサー
    • PHP
  • PHPのセッションについて

    現在PHPでの開発を行っております。 環境は、PHP4.0.5、サーバはレンタルでFreeBSDです。 セッションに格納する変数について教えていただきたいと思っております。 セッションに変数をセットする際に、session_registerを使用しているのですが、格納される変数の型はどこで指定するのでしょうか。 例えば、今、セッション変数として、$no="001"をsession_register("no")として、格納しているのですが、 session_registerで値を取得しようとすると、「1」が返ってきます。 セッション変数に格納した時点で、どうやら数値に変換されているようなのですが、文字列として格納することはできないのでしょうか。 よろしくお願いします。

    • 締切済み
    • PHP
  • インスタンス変数とクラス変数の違い

    1つのクラスオブジェクト内のインスタンス全てで共有できる クラス変数 @@a と、 同じインスタンス内であればメソッドの定義を越えてその値を 参照したり、変更したりできるインスタンス変数 @a のスコープの違いをお手すきでしたらご指導願えませんか? あとクラス変数にはセッターやゲッター等のアクセスメソッドを 設定できるんですか? いろいろ知りたいです。

    • ベストアンサー
    • Ruby
  • クラス変数/メソッドとインスタンス変数/メソッドの見え方について

    Javaの言語仕様(?)についてお教え下さい。 参照変数の型がインスタンスのスーパークラスの型の時、クラス変数/メソッドとインスタンス変数/メソッドの見え方が納得いかずに困っています。 以下のような条件の時です。   ・クラスが2つあり、1つはもう1つのクラスを継承しています。     それぞれを「スーパー」「サブ」と以下で呼びます。   ・インスタンスは"サブ"の型です。   ・上記インスタンスへの参照変数は"スーパー"のクラスの型です。   ・"スーパー"、"サブ"ともに【同名】の「クラス」変数/メソッド、「インスタンス」変数/メソッドがあります。 この場合に、"サブ"のインスタンスを参照している"スーパー"の型の変数を介し、それらにアクセスしたらどれが見えるか?という疑問です。 実験結果では以下のようになりました。           [フィールド]  [メソッド]   [1.static ]  スーパーの   スーパーの   [2.非static]  スーパーの   サブの 納得いかないのは「2.非static」で「フィールド」が、「スーパーの」になるところです。 これも「サブの」になると思っていました。 なぜサブクラスのが見えないのでしょうか? 同名の変数なのでスーパークラスのはサブクラスので隠れされ、サブクラスのが見えると思っていたのですが。 参考書には以下のように書いてありました。   フィールドの場合、参照変数の型のものが見える。   メソッドの場合、インスタンスの型のものが見える。 私には不自然に感じられるのですが、「こういう仕様だから。」と納得するしか無いのでしょうか? 「なぜこうなるか」について説明がある文献、サイトなどありましたらお教えください。 参考までに以下が実験したサンプルコードと結果です。長くて申し訳ありません。 「サンプルコード」 public class Super { static int staticField = 10; int instanceField = 100; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class Sub extends Super { static int staticField = 90; int instanceField = 900; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class TestStatic { public static void main(String[] args) { // インスタンスはSub、参照変数もSub、という状態。 Sub sub = new Sub(); System.out.println( "実験1" ); System.out.println( "1.クラス変数      " + sub.staticField ); System.out.print( "2.クラスメソッド    " ); sub.staticMethod(); System.out.println( "3.インスタンス変数   " + sub.instanceField ); System.out.print( "4.インスタンスメソッド " ); sub.instanceMethod(); // インスタンスはSub、参照変数はSuper、という状態。 Super sup = new Sub(); System.out.println( "実験2" ); System.out.println( "5.クラス変数      " + sup.staticField ); System.out.print( "6.クラスメソッド    " ); sup.staticMethod(); System.out.println( "7.インスタンス変数   " + sup.instanceField ); System.out.print( "8.インスタンスメソッド " ); sup.instanceMethod(); } } 「結果」 実験1 1.クラス変数      90 2.クラスメソッド    staticField = 90 3.インスタンス変数   900 4.インスタンスメソッド instanceField = 900 実験2 5.クラス変数      10 6.クラスメソッド    staticField = 10 7.インスタンス変数   100 8.インスタンスメソッド instanceField = 900 納得が行かないのは7のところです。 以上よろしくお願いいたします。

    • ベストアンサー
    • Java
  • PHPのセッションと乱数について

    お世話になります。 PHPの記述でつまずいてしまった2つあり、アドバイス頂ければと思い投稿させて頂きました。 1.PHPでセッションにてページ間のデータを受け渡しをしているのですが、これを特定のセッションのみ終了させることは可能でしょうか? 例)$_SESSION['1']と$_SESSION['2']の二つのセッションがあり、$_SESSION['2']のみクリアすることは可能でしょうか? session_destroyをしてしまうと全部のセッションがクリアされてしまうため、ここで悩んでいます。 2.ある特定の文字列で16桁の乱文字列を作りたいのですが可能でしょうか? 例)使う文字列=a,b,c,d,e,1,2,3,4,5   上記の9つを使って16桁(a1bbcde45ed51cae)の文字列を毎回生成させていです。(文字列には特にこだわりませんが、英数字+数字で16桁の文字列を作る) 上記の2点について、夜分遅くですがアドバイスなど頂けたら嬉しい限りです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHP5のセッション管理に使う$_SESSIONに関する質問

    現在本と、WEBの入門サイトの二つでPHPを学習しているのですが $_SESSION変数を利用したアクセスカウンタのサンプルで WEBの情報では$_SESSIONを $_SESSION['count'] と書いていました(WEBはPHP4) そして、本の方では $_SESSION['acces_count'] と書いてありました そして、私は $_SESSION['acces_count'] を $_SESSION['testtest'] に変えて実行してみた所これでもエラーが出ずに実効できました $_SESSION変数のキーは、いかなる物でもかまわないのでしょうか

    • ベストアンサー
    • PHP
  • PHPでセッション管理

    PHPでセッション管理の勉強をしています、 テストに以下の文章があるのですが カウント2回です は表示するのですが 3回目以降も カウント2回です と表示します。 文章がどこかおかしいでしょうか? また、このセッション管理は携帯電話でも有効なのでしょうか? スミマセン、教えてください。 バージョンは MYSQL ver4.0.26 PHP ver4.2.2 です <?php session_start(); $count = 1; if (isset($_SESSION["count"])) { $count = $_SESSION["count"]; $count++; } $_SESSION["count"] = $count; ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <title>セッション変数のテスト</title> </head> <body> セッション変数のテスト<BR> <BR> <?php if ($count == 1) { ?> はじめての訪問です。<BR> <BR> セッション変数にデータがありません。<BR> このページをリロードしてください。<BR> <?php } else { ?> あなたの訪問は<?=$count?>回目です。<BR> <?php } ?> </body> </html>

    • ベストアンサー
    • PHP
  • マルチスレッド下でのインスタンス変数・クラス変数

    よろしくお願いします。  マルチスレッド下で動作するクラスを作成しています。データにアクセスするためのオブジェクトを クラスのフィールド値として保持し、使い回しを行いたいと考えています。このデータアクセスオブジェクト(以下Dao)内では特にフィールドは使用せず、全てローカル変数のみで動作するようになっています。Dao自体は初回のクラス生成時にstatic処理にてフィールドにセットされます。  このDaoを保持するフィールドは、staticなクラス変数が良いのか、インスタンス変数として保持する方が良いのか迷っております。  クラス変数ならばPermanent領域をオブジェクト1つ分のメモリ使用で済み、インスタンス変数だとスレッド毎にheapを使い、処理数が増えるとメモリ圧迫しちゃう?と安易に考えてしまったりしています。  ご意見・ご助言よろしくお願い致します。

    • ベストアンサー
    • Java
  • Stringクラスの変数の格納アドレスを知りたい

    いつもお世話になります。 Javaの文字列クラスのStringは参照型ですが、この変数の値が格納されたアドレスを知るためにはどうすればよいのでしょうか。eclipse上で、文字列の変数に対してtoString()を試してみたところ、格納されている文字列が出力されました。 ※自作したクラス、たとえばtest.MyClassだとすれば、toString()を用いれば「test.MyClass@01234」というような表記で出力されますが、このような情報を取得するにはどうすればよいでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Java