【问题标题】:Storing multiple items into a session将多个项目存储到会话中
【发布时间】:2016-07-22 20:58:27
【问题描述】:

我正在尝试将多个项目存储到一个会话中。我正在从这样的表格中发布项目:

<?php
$product_id = $_GET['product_id'];
$sql = "SELECT * FROM Products WHERE product_id = $product_id";
    $result = $conn->query($sql);

    if($result->num_rows > 0){
        while($row = $result->fetch_assoc()){
            echo '<img src=' . $row['product_img'] . ' />';
            echo '<div class="title">'. $row['product_name'] .'</div>';
            echo '<div class="title">'. $row['product_price'] .'</div>';
            echo '<div class="title">'. $row['product_sku'] .'</div>';
            echo '<div class="title">'. $row['product_description'] .'</div>';
            echo '<form action="addToCart.php" method="post">
                    <input type="hidden" name="product_img" value="' . $row['product_img'] . '" />
                    <input type="hidden" name="product_id" value="' . $row['product_id'] . '" />
                    <input type="hidden" name="product_name" value="' . $row['product_name'] . '" />
                    <input type="hidden" name="product_price" value="' . $row['product_price'] . '" />
                    <input type="hidden" name="product_sku" value="' . $row['product_sku'] . '" />
                    <input type="hidden" name="product_description" value="' . $row['product_description'] . '" />
                    <input type="submit" name="Submit">
                  </form>';
        }
    } else{
    echo "0 Results";
    }
?>

addToCart.php 看起来像这样:

<?php 
    if (isset($_POST['Submit'])) { 
        $_SESSION['product_img'] = $_POST['product_img'];
        $_SESSION['product_id'] = $_POST['product_id'];
        $_SESSION['product_name'] = $_POST['product_name'];
        $_SESSION['product_price'] = $_POST['product_price'];
        $_SESSION['product_sku'] = $_POST['product_sku'];
        $_SESSION['product_description'] = $_POST['product_description'];
    } 
?>

所以上面现在将项目设置到会话中(所以我相信)。然后我从篮子.php 中存储的数据中输出项目

<?php echo '<img src=' . $_SESSION['product_img'] . ' />'; ?>
<?php echo $_SESSION['product_id'];?>
<?php echo $_SESSION['product_name'];?>
<?php echo $_SESSION['product_price'] ?>
<?php echo $_SESSION['product_sku']; ?>
<?php echo $_SESSION['product_description']; ?>

我遇到的问题是每当我添加另一个项目时它会覆盖前一个项目?我知道我需要使用数组来存储多个项目,但我尝试了一些不同的方法,但我很难理解。

【问题讨论】:

  • 您可以在数组中嵌入数组。 $_SESSION['foo'][1] = 'someval', $_SESSION['foo'][2] = 'otherval'; 请注意,您很容易受到sql injection attacks
  • @MarcB 感谢您的评论,您能否为我解释一下,因为我正在努力理解(对不起,我对此很陌生)
  • 使用您的产品 ID 作为顶级数组键:$_SESS['cart'][$prodID]['name'] =&gt; 'foo'

标签: php arrays mysqli


【解决方案1】:

您可以使用 [] 将它们存储在数组中:

$_SESSION['product_img'][] = $_POST['product_img'];
$_SESSION['product_id'][] = $_POST['product_id'];
$_SESSION['product_name'][] = $_POST['product_name'];
$_SESSION['product_price'][] = $_POST['product_price'];
$_SESSION['product_sku'][] = $_POST['product_sku'];
$_SESSION['product_description'][] = $_POST['product_description']

现在,尝试查看每个数组中的内容:

var_dump($_SESSION['product_id']);

【讨论】:

  • 所以我把它换成了我的,它仍然只显示单个项目?
  • @Dan,没办法。我很确定您只添加了一项。尝试添加一些项目,然后使用我提到的 var_dump
  • 所以我将其切换为 addToCart.php 中的代码,var_dump 显示 string(1) "2" 这是我添加到购物篮的产品的 ID
  • @丹。这是正确的。但是,您是否尝试再添加一种产品?然后,你应该得到多个 id
  • 是的,并且在 var_dump 所在的 basket.php 中,它只显示了我最后添加的任何产品的最后一个 ID。
【解决方案2】:

可以将会话数据存储为嵌套数组。在您的情况下,由于它是一个购物车,您可能希望使用产品的 ID 构建您的数组;这样您就可以确定没有产品会覆盖另一个产品(只要它们没有相同的 product_id 值....下面是您如何做到这一点的示例:

<?php   
    //FIRST CHECK IF SESSION EXIST BEFORE STARTING IT:
    if (session_status() == PHP_SESSION_NONE  || session_id() == '') {
        session_start();
    }
    if (isset($_POST['Submit'])) {
        $product_id             = htmlspecialchars(trim($_POST['product_id']));
        $product_img            = htmlspecialchars(trim($_POST['product_img']));
        $product_sku            = htmlspecialchars(trim($_POST['product_sku']));
        $product_name           = htmlspecialchars(trim($_POST['product_name']));
        $product_price          = htmlspecialchars(trim($_POST['product_price']));
        $product_description    = htmlspecialchars(trim($_POST['product_description']));

        if(!isset($_SESSION['products'])){
            $_SESSION['products'] = array();
        }
        if(!isset($_SESSION['products'][$product_id])){
            $_SESSION['products'][$product_id] = array();
        }
        $_SESSION['products'][$product_id]['product_id']            = $product_id;
        $_SESSION['products'][$product_id]['product_img']           = $ $product_img;
        $_SESSION['products'][$product_id]['product_name']          = $product_name;
        $_SESSION['products'][$product_id]['product_price']         = $product_price;
        $_SESSION['products'][$product_id]['product_sku']           = $product_sku;
        $_SESSION['products'][$product_id]['product_description']   = $product_description;     
    } 

在其他任何地方(可能是另一个脚本),您都可以像这样访问您的数据:

<?php

    $output             = "";
    $storedProductData  = $_SESSION['products'];
    if(!empty($storedProductData)){
        foreach($storedProductData as $product_id=>$productData){
            $output .= "<img src='{$productData['product_img']}' />"                            . PHP_EOL;
            $output .= "<span id='generic-class'>{$productData['product_id']}</span>"           . PHP_EOL;
            $output .= "<span id='generic-class'>{$productData['product_name']}</span>"         . PHP_EOL;
            $output .= "<span id='generic-class'>{$productData['product_price']}</span>"        . PHP_EOL;
            $output .= "<span id='generic-class'>{$productData['product_sku']}</span>"          . PHP_EOL;
            $output .= "<span id='generic-class'>{$productData['product_description']}</span>"  . PHP_EOL;
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多