Php 如何在会话中注册同一变量的多个版本

Php 如何在会话中注册同一变量的多个版本,php,session,session-variables,Php,Session,Session Variables,我的网站有一个数据库,其中包括数千个零件号。当用户搜索产品时,使用变量“$pn”将这些零件号调用到标准模板页面,以使每个页面唯一 例如,当代码在模板中声明变量($pn)时,它实际上使用我的数据库中的零件号(如“ABC123”)填充前端页面 因此后端看起来像: Thanks for searching for the $pn, we have this item in stock. Thanks for searching for the ABC123, we have this item in

我的网站有一个数据库,其中包括数千个零件号。当用户搜索产品时,使用变量“$pn”将这些零件号调用到标准模板页面,以使每个页面唯一

例如,当代码在模板中声明变量($pn)时,它实际上使用我的数据库中的零件号(如“ABC123”)填充前端页面

因此后端看起来像:

Thanks for searching for the $pn, we have this item in stock.
Thanks for searching for the ABC123, we have this item in stock.
       <?php
        session_start();
        ?>

        <?php

        $pn = $item['pn'];

        // Set session variables
        $_SESSION["partnumber1"] = "$pn";
        $_SESSION["partnumber2"] = "$pn"; //Obviously at the moment this would just overwrite partnumber1 twice so I need a way to register more than once 

        ?>
前端看起来像:

Thanks for searching for the $pn, we have this item in stock.
Thanks for searching for the ABC123, we have this item in stock.
       <?php
        session_start();
        ?>

        <?php

        $pn = $item['pn'];

        // Set session variables
        $_SESSION["partnumber1"] = "$pn";
        $_SESSION["partnumber2"] = "$pn"; //Obviously at the moment this would just overwrite partnumber1 twice so I need a way to register more than once 

        ?>
我想知道如何创建一个按钮,将当前状态$pn(例如ABC123)保存到会话中,然后当用户访问不同的零件号页面(如“DEF456”)时,他们可以再次按下按钮,并将第二个状态保存到会话中

我想保存数据的原因是,用户可以浏览网站,并在单独的页面上创建他们感兴趣的产品列表。与basket类似,只是存储的值只需添加到表单字段中即可发送

我只需要在每个会话中保存此数据,不需要将其保存为cookie以存储超过一个会话,也不需要将其保存在数据库中以进行跨浏览器存储

我确实尝试了cookie方法,但使用$pn变量作为cookie值只是删除了值的最后一个状态,并在每次访问不同的零件号页面时创建了一个新值

我已经到处寻找解决这个问题的办法,但我找不到适合我的正确答案。到目前为止,我得到了如下信息:

Thanks for searching for the $pn, we have this item in stock.
Thanks for searching for the ABC123, we have this item in stock.
       <?php
        session_start();
        ?>

        <?php

        $pn = $item['pn'];

        // Set session variables
        $_SESSION["partnumber1"] = "$pn";
        $_SESSION["partnumber2"] = "$pn"; //Obviously at the moment this would just overwrite partnumber1 twice so I need a way to register more than once 

        ?>


非常感谢您的帮助。

我举了一个可能解决您问题的小例子。但正如我在评论中所说,有很多不同的方法可以做到这一点。希望这能让你走上正确的方向

这段代码的思想是,我们保留一个数组,其中所有访问的部分都作为键。如果我们看到数组中已经设置了一个部件,我们将更新该值,以便跟踪他们访问每个部件的次数。如果尚未设置,则添加元素并将计数器设置为1

if(isset($_SESSION['parts'][$pn])){
    $_SESSION['parts'][$pn]++;
} else {
    $_SESSION['parts'][$pn] = 1;
}
现在,如果要对阵列执行某些操作,可以这样做:

foreach ($_SESSION['parts'] as $key => $value) {
    echo 'you have visited part' . $key . ' a total of ' . $value . 'times';
    //You can do whatever you want with the information here.
}

我举了一个可能解决你问题的小例子。但正如我在评论中所说,有很多不同的方法可以做到这一点。希望这能让你走上正确的方向

这段代码的思想是,我们保留一个数组,其中所有访问的部分都作为键。如果我们看到数组中已经设置了一个部件,我们将更新该值,以便跟踪他们访问每个部件的次数。如果尚未设置,则添加元素并将计数器设置为1

if(isset($_SESSION['parts'][$pn])){
    $_SESSION['parts'][$pn]++;
} else {
    $_SESSION['parts'][$pn] = 1;
}
现在,如果要对阵列执行某些操作,可以这样做:

foreach ($_SESSION['parts'] as $key => $value) {
    echo 'you have visited part' . $key . ' a total of ' . $value . 'times';
    //You can do whatever you want with the information here.
}

根据要求,下面是一个使用会话在其中存储阵列的小示例

这是课堂部分。您可以将它放在单独的文件中,并在任何需要的地方包含它。对于单独的文件,请使用代码下面的部分和上面的示例-类零件后括号之间的代码

<?php

session_start();

//your code

class Parts {
    private $storage = [];

    public function __construct() {
        if (session_status() == PHP_SESSION_NONE) {
            session_start();
        }
        // Ref to session, you can access it directly, but if you want to change place, where parts should be stored, you can simply change it here without editing another lines of code
        $this->storage = &$_SESSION['parts'];
    }

    public function addPart($part) {
        if ($this->storage === null || !in_array($part, $this->storage)) {
            $this->storage[] = $part;
        }
        return $this;
    }

    public function removePart($part) {
        $this->storage = array_filter($this->storage, function($a) use ($part) { return $a !== $part; });
        return $this;
    }

    public function getParts() {
        return $this->storage;
    }

    public function setParts($parts) {
        $this->storage = $parts;
        return $this;
    }
}

$parts = new Parts();
$parts
    ->addPart(1)
    ->addPart(2)
    ->addPart(3)
    ->removePart(2);

var_dump($parts->getParts());

$allParts = $parts->getParts();

// Iterate over each part in storage
foreach ($allParts as $part) {
    // echo one part
    echo $part;
}

根据要求,下面是一个使用会话在其中存储阵列的小示例

这是课堂部分。您可以将它放在单独的文件中,并在任何需要的地方包含它。对于单独的文件,请使用代码下面的部分和上面的示例-类零件后括号之间的代码

<?php

session_start();

//your code

class Parts {
    private $storage = [];

    public function __construct() {
        if (session_status() == PHP_SESSION_NONE) {
            session_start();
        }
        // Ref to session, you can access it directly, but if you want to change place, where parts should be stored, you can simply change it here without editing another lines of code
        $this->storage = &$_SESSION['parts'];
    }

    public function addPart($part) {
        if ($this->storage === null || !in_array($part, $this->storage)) {
            $this->storage[] = $part;
        }
        return $this;
    }

    public function removePart($part) {
        $this->storage = array_filter($this->storage, function($a) use ($part) { return $a !== $part; });
        return $this;
    }

    public function getParts() {
        return $this->storage;
    }

    public function setParts($parts) {
        $this->storage = $parts;
        return $this;
    }
}

$parts = new Parts();
$parts
    ->addPart(1)
    ->addPart(2)
    ->addPart(3)
    ->removePart(2);

var_dump($parts->getParts());

$allParts = $parts->getParts();

// Iterate over each part in storage
foreach ($allParts as $part) {
    // echo one part
    echo $part;
}

有很多方法可以做到这一点,这使得向您提供任何具体建议有点困难。你应该问问自己,你想保存这些数据做什么。您是希望每次访问(会话)都保存它,还是希望保存更长的时间(cookies),或者甚至希望在浏览器之间保存很长一段时间(数据库)。Hi@DirkScholten感谢您的输入,我编辑了我的问题以解释我需要存储数据的原因。使用数组存储,获取部件
$parts=$\u会话['parts'],添加部件
$parts[]=$pn并存储到会话
$\u会话['parts]=$parts,用foreachThank@Eakethet在零件上循环表示感谢。您能给我举一个例子,说明我现在使用的代码应该是什么样子的吗trouble@NickM不,很晚了,但是我尝试了使用oop的小例子。有很多方法可以做到这一点,这使得给你一些具体的建议有点困难。你应该问问自己,你想保存这些数据做什么。您是希望每次访问(会话)都保存它,还是希望保存更长的时间(cookies),或者甚至希望在浏览器之间保存很长一段时间(数据库)。Hi@DirkScholten感谢您的输入,我编辑了我的问题以解释我需要存储数据的原因。使用数组存储,获取部件
$parts=$\u会话['parts'],添加部件
$parts[]=$pn并存储到会话
$\u会话['parts]=$parts,用foreachThank@Eakethet在零件上循环表示感谢。您能给我举一个例子,说明我现在使用的代码应该是什么样子的吗trouble@NickM不,很晚了,但我尝试了使用oop的小例子。