Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP$\u会话创建一个单页购物车,不使用SQL_Php_Html_Session_Shopping Cart_Cart - Fatal编程技术网

使用PHP$\u会话创建一个单页购物车,不使用SQL

使用PHP$\u会话创建一个单页购物车,不使用SQL,php,html,session,shopping-cart,cart,Php,Html,Session,Shopping Cart,Cart,我正在学习一些PHP,我正在尝试创建一个多页购物车 我已经阅读了SQL数据库系统,并且可以看到它的好处,但是我想先学习一些基础知识。在这样做的过程中,我创建了一个多功能页面,其中包含关联数组中的产品,以及一个提交给自身的表单 我想要实现的是: 产品只能购买一次(购买按钮替换为移除按钮) 项目及其成本将添加到下面的购物车中 用户可以将其从购物车或项目列表中删除 应根据需要更新总成本 “签出”按钮将提交项目名称和成本 表单向自身发布,不需要任何SQL 我目前的问题是: 我一次不能购买多个项目,

我正在学习一些PHP,我正在尝试创建一个多页购物车

我已经阅读了SQL数据库系统,并且可以看到它的好处,但是我想先学习一些基础知识。在这样做的过程中,我创建了一个多功能页面,其中包含关联数组中的产品,以及一个提交给自身的表单

我想要实现的是:

  • 产品只能购买一次(购买按钮替换为移除按钮)
  • 项目及其成本将添加到下面的购物车中
  • 用户可以将其从购物车或项目列表中删除
  • 应根据需要更新总成本
  • “签出”按钮将提交项目名称和成本
  • 表单向自身发布,不需要任何SQL
我目前的问题是:

  • 我一次不能购买多个项目,即购物车仅包含上次购买的项目
  • 我无法让它“检查”是否已购买物品,如果已购买,请将“购买”替换为“删除”
  • 我无法在购物车中显示商品详细信息
  • “签出”按钮不会将任何详细信息传递给我的测试
同样,我还没有寻找SQL解决方案,只是一个使用
$\u SESSION
$\u POST
的纯PHP,并且希望使用按钮而不是
类型链接

感谢您提前阅读,以下是代码:

<?php
session_start ();

$items = array (
        'A123' => array (
                'name' => 'Item1',
                'desc' => 'Item 1 description...',
                'price' => 1000 
        ),
        'B456' => array (
                'name' => 'Item40',
                'desc' => 'Item40 description...',
                'price' => 2500 
        ),
        'Z999' => array (
                'name' => 'Item999',
                'desc' => 'Item999 description...',
                'price' => 9999 
        ) 
);

if (! isset ( $_SESSION ['cart'] )) {
    $_SESSION ['cart'] = array ();
}

// Add
if (isset ( $_POST ["buy"] )) {
    $_SESSION ['cart'] = $_POST;
} 

// Delete Item
else if (isset ( $_POST ['delete'] )) { // a remove button has been clicked
    unset ( $_POST ['delete'] ); //
} 

// Empty Cart
else if (isset ( $_POST ["delete"] )) { // remove item from cart
    unset ( $_SESSION ['cart'] );
}

?>
<form action='<?php echo $_SERVER['PHP_SELF']; ?>' method='post'>
    <?php
        foreach ( $items as $ino => $item ) {
            $title = $item ['name'];
            $desc = $item ['desc'];
            $price = $item ['price'];

            echo " <p>$title</p>";
            echo " <p>$desc</p>";
            echo "<p>\$$price</p>";

            if ($_SESSION ['cart'] == $ino) {
                echo '<img src="carticon.png">';
                echo "<p><button type='submit' name='delete' value='$ino'>Remove</button></p>";
            } else {
                echo "<button type='submit' name='buy' value='$ino'>Buy</button> ";
            }
        }
    ?>
</form>

<?php
if (isset ( $_SESSION ["cart"] )) {
    ?>

<form action='(omitted link)'
target='_blank' method='post'
enctype='application/x-www-form-urlencoded'>
<table>
    <tr>
        <th>Product</th>
        <th>Price</th>
        <th>Action</th>
    </tr>
    <?php

    $total = 0;
    foreach ( $_SESSION ["cart"] as $i ) {
        ?>
    <tr>
        <td>
            <?php echo($_SESSION["cart"]); ?> <!--Item name-->
        </td>
        <td>price<?php echo($_SESSION["price"][$i] ); ?>
            <!--Item cost-->
        </td>
        <td><button type='submit' name='delete' value='$ino'>Remove</button>
            </p></td>
    </tr>
    <?php
        $total = + $_SESSION ["amounts"] [$i];
    }
    $_SESSION ["total"] = $total;
    ?>
    <tr>
        <td colspan="2">Total: $<?php echo($total); ?></td>
        <td><input type='submit' value='Checkout' /></td>
    </tr>
    <tr>
        <td><button type='submit' name='clear'>Clear cart</button></td>
    </tr>
</table>
</form>
<?php  } ?>

价格
去除

总数:$ 清车
脚本中有一些问题需要解决,因此我将把它们分解为各个部分

还有很多安全错误检查也应该用代码来完成,但是作为一个纯粹的学习练习,我绕过了这些因素

定义购物车 您正在将购物车定义为数组:

if (! isset ( $_SESSION ['cart'] )) {
    $_SESSION ['cart'] = array ();
}
但是,将项目添加到购物车时,您正在替换购物车:

// Add
if (isset ( $_POST ["buy"] )) {
    $_SESSION ['cart'] = $_POST; // 
} 
要将项目添加到购物车,您应该使用
$cart[]=$\u POST
,但还需要考虑其他事项

添加到购物车 当您只需要产品ID时,
$cart[]=$\u POST
会将完整的
$\u POST
数据添加到购物车中。正确的方法是:

// Add
if (isset ( $_POST ["buy"] )) {
    // Check the item is not already in the cart
    if (!in_array($_POST ["buy"], $_SESSION['cart'])) {
        // Add new item to cart
        $_SESSION ['cart'][] = $_POST["buy"];
    }
}
<?php
// Set a default total
$total = 0;
foreach ( $_SESSION['cart'] as $ino ) {
    ?>
<tr>
    <td>
        Name: <?php echo $items[$ino]['name']; ?>
    </td>
    <td>
        Price: <?php echo $items[$ino]["price"]; ?>
    </td>
    <td>
        <button type='submit' name='delete' value='<?php echo $ino; ?>'>Remove</button>
    </td>
</tr>
<?php
    $total += $items[$ino]['price'];
} // end foreach
?>

Total: $<?php echo $total; ?>
这将导致购物车存储多个值。例如,
打印($\u会话['cart'])
可能会显示:

array (
    0 => 'A123',
    1 => 'B456'
);
此数组中的每个项目都是已添加到购物车中的项目

从购物车中删除项目 既然
$\u会话['cart']
的结构已经更改,“从购物车中删除”操作也需要更新。使用,我们可以检查数组中是否存在该值,找到它的键,然后删除它

// Delete Item
else if (isset ( $_POST ['delete'] )) { // a remove button has been clicked
    // Remove the item from the cart
    if (false !== $key = array_search($_POST['delete'], $_SESSION['cart'])) {
        unset($_SESSION['cart'][$key]);
    }
}
检查商品是否在您的购物车中 为了支持新的数组结构,需要对代码进行进一步更改。您可以使用检查您的产品是否包含在购物车阵列中

<?php
    foreach ( $items as $ino => $item ) {
        // ... snipped for brevity

        // Check if an item is in the cart by checking for the existence of its ID:
        if (in_array($ino, $_SESSION['cart'])) { // The $ino would be 'a123' for your first product
            echo "<p><button type='submit' name='delete' value='$ino'>Remove</button></p>";
        } else {
            echo "<button type='submit' name='buy' value='$ino'>Buy</button> ";
        }
    }
?>
这使您可以更轻松地设置数字显示的格式。或者,您可以使用

展示购物车 这段代码有一些问题

  • 您正在尝试
    回显($\u会话['cart'])
    ,但该回显无效。不能
    echo
    数组
  • 试图使用
    显示值时,您使用的
    foreach($\u SESSION[“cart”]作为$i)
    不正确
  • 您正在使用于
    $total
    值的代码复杂化
  • HTML无效,因为混合中随机抛出了一个

  • 正确的显示方式是:

    // Add
    if (isset ( $_POST ["buy"] )) {
        // Check the item is not already in the cart
        if (!in_array($_POST ["buy"], $_SESSION['cart'])) {
            // Add new item to cart
            $_SESSION ['cart'][] = $_POST["buy"];
        }
    }
    
    <?php
    // Set a default total
    $total = 0;
    foreach ( $_SESSION['cart'] as $ino ) {
        ?>
    <tr>
        <td>
            Name: <?php echo $items[$ino]['name']; ?>
        </td>
        <td>
            Price: <?php echo $items[$ino]["price"]; ?>
        </td>
        <td>
            <button type='submit' name='delete' value='<?php echo $ino; ?>'>Remove</button>
        </td>
    </tr>
    <?php
        $total += $items[$ino]['price'];
    } // end foreach
    ?>
    
    Total: $<?php echo $total; ?>
    
    
    姓名:
    价格:
    总数:$
    
    您不断覆盖此行的购物车内容
    $\u SESSION['cart']=$\u POST
    您需要将当前会话与
    $\u POST
    数组合并。您没有使用php在此处回送:
    value='$ino'
    ,您将需要
    value=''
    ,尽管我看不到您在哪里设置
    $ino
    。也许我只是错过了。我只在上面的循环中看到它…这在循环中不会像预期的那样工作。我添加了一个答案,分解了所需的各种更新。如果我遗漏了什么,请告诉我,或者你想进一步澄清。非常感谢@Kirk Beard的帮助,解释事情是如何/为什么出错比提供解决方案要好得多。我真的很感激你的努力!再次感谢@本:不用担心:)你已经投入了学习的努力,所以我非常高兴在学习的过程中帮助你。祝你好运!
    <?php
    // Set a default total
    $total = 0;
    foreach ( $_SESSION['cart'] as $ino ) {
        ?>
    <tr>
        <td>
            Name: <?php echo $items[$ino]['name']; ?>
        </td>
        <td>
            Price: <?php echo $items[$ino]["price"]; ?>
        </td>
        <td>
            <button type='submit' name='delete' value='<?php echo $ino; ?>'>Remove</button>
        </td>
    </tr>
    <?php
        $total += $items[$ino]['price'];
    } // end foreach
    ?>
    
    Total: $<?php echo $total; ?>