プロが教えるわが家の防犯対策術!

$_SESSIONは配列を入れられると思うのですが、
例えば、
$code=$_GET['code'];
if(isset($_SESSION['cart']))
{
$cart=$_SESSION['cart'];
}

$_SESSION['cart']=$code;

これではエラーになってしまいます。

$code=$_GET['code'];
if(isset($_SESSION['cart']))
{
$cart=$_SESSION['cart']; ←上書きせず追加していく
}
$cart[]=$code;
$_SESSION['cart']=$cart;

上記の様に$cart[]=$code;を記述すると上手くいくのですが、直接$_SESSIONに入れては出来ないのでしょうか?

又、上書きせず追加していくには$cart=$_SESSION['cart'];の記述が必要だと思うのですが、これはセッションの値を$cartに移すと上書きされず、値を持っていられると意味なのですが、何故、上書きされないのか上手く理解が出来ません。
教えてください。宜しくお願いします。

質問者からの補足コメント

  • すみません、先程動かしたらエラーが出ませんでした。昨日、動かした時は出たのですが。謎です。
    もう一つ教えて頂きたいのですが、
    $cart[]=$code;で値を配列に入れる。
    $_SESSION['cart']=$cart;で$cartの配列をセッションに入れる。
    $cart=$_SESSION['cart'];で上書きされず値が追加されていく。
    と思うのですが、$cart=$_SESSION['cart'];で再代入すると上書きされないという事でしょうか?何故、上書きされないのか理解が出来ずにいます。
    もし宜しければ教えて頂けると助かります。m(__)m

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/03/14 10:20
  • 御解答ありがとうございます。
    先程、教えて頂いた記述を実行しましたがカートの中身は追加させず値が一つしか入っていない様です。
    array(1) { ["cart"]=> array(1) { [0]=> string(1) "1" } }←追加されず上書きになってしまいます。
    <?php
    $code = $_POST['code'];
    if(!isset($_SESSION['cart']))
    {
    $_SESSION['cart'] = array();
    }
    $_SESSION['cart'][] = $code;
    var_dump($_SESSION); ←表示の仕方が間違っているのでしょうか?
    ?>

    No.2の回答に寄せられた補足コメントです。 補足日時:2023/03/15 12:41

A 回答 (4件)

>追加されず上書きになってしまいます。



session_start(); を忘れていませんか?
    • good
    • 0
この回答へのお礼

忘れてました。
すみません!
きちんと追加されており、教えて頂いた記述で作っていこうと思います。
とても、分かりやすい説明で理解が出来ました。
ありがとうございます。
ずっと理解が出来ず、もやもやしていたので本当に助かりました。
教えて頂きありがとうございました。

お礼日時:2023/03/15 13:08

>これはセッションの値を$cartに移すと上書きされず、値を持っていられると意味なのですが、何故、上書きされないのか上手く理解が出来ません。



「=」は、変数の値を全てコピーして代入する演算子だからです。

「=&」(リファレンスの代入)を使用すれば元の変数も書き換わります。

$cart =& $_SESSION['cart'];
$cart[]=$code;
unset($cart);

・リファレンスの代入
https://www.php.net/manual/ja/language.reference …

ディープコピー(Deep copy)= 深いコピー、シャローコピー(Shallow copy)= 浅いコピー、と言う専門用語があります。


意図した通りに動作しないときは、変数の値を出力して確認するとよいです。

print_r($_SESSION);
var_dump($_SESSION);
    • good
    • 0

下記で動作するはずです。



$code = $_GET['code'];
if(!isset($_SESSION['cart']))
{
$_SESSION['cart'] = array(); // 存在しない場合の初期化
}
$_SESSION['cart'][] = $code;


>上記の様に$cart[]=$code;を記述すると上手くいくのですが、直接$_SESSIONに入れては出来ないのでしょうか?

できます。


>又、上書きせず追加していくには$cart=$_SESSION['cart'];の記述が必要だと思うのですが、

不要です。
この回答への補足あり
    • good
    • 0

PHP Version 7.4.33で下記コードを試したら、とくに問題なく動きました。


$_SESSION['cart'] = $_GET['code'];

>$_SESSION['cart']=$code;
>これではエラーになってしまいます。
具体的にどんなエラーメッセージを出てるのか補足したら回答を得られやすいと思います。
「$_SESSIONについて教えて下さい。」の回答画像1
この回答への補足あり
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!