向Session数组添加元素失败问题排查
问题分析与修复方案
我帮你排查出了几个导致商品ID无法添加到Session购物车数组的关键问题,咱们逐个解决:
1. 请求方式不匹配
你的表单用的是method='post'提交数据,但代码里却试图用$_GET['id']获取输入值——POST提交的内容只会出现在$_POST数组里,这肯定拿不到数据啊!
2. 每次点击都会重置购物车数组
你每次提交表单时都会重新创建一个新数组$myarray = array('0');,这直接把Session里之前保存的购物车内容覆盖了,根本没法实现累积添加商品的功能。正确的做法是先检查Session中的购物车是否存在,不存在再初始化,存在的话直接复用已有数组。
3. 输入框默认值错误
输入框写了value='id',这会导致默认显示字符串id,用户如果不修改就提交,传的是无效的字符串而非数字ID,这显然不符合需求,应该把默认值清空。
修复后的完整代码
<?php session_start(); include("#nav.php"); include("dbconnectie.php"); echo "Plaatsingen: "; $query = $db->prepare("SELECT * FROM shop"); $query->execute(); $result = $query->fetchALL(PDO::FETCH_ASSOC); echo "<table>"; foreach($result as &$data) { echo "<tr>"; $img = $data['img_url']; echo "<td>" . $data["brand"] . "</td>"; echo "<td>" . $data["model"] . "</td>"; echo "<td> Condition: " . $data["cond"] . "/100 </td>"; echo "<td> Prijs: $ " . number_format($data["price"],2,",",".") . "</td>"; echo "<td> <img src='$img' width='400' height='300' ></img> </td>"; echo "<td> Plaatsing nummer: " . $data['id_img'] . "</td>"; echo "</tr>"; echo "<br>"; } echo "</table>"; if(isset($_POST['atc'])) { if($_SESSION['on']){ // 先检查Session购物车是否存在,不存在则初始化空数组 if(!isset($_SESSION['cart']) || !is_array($_SESSION['cart'])){ $_SESSION['cart'] = []; } // 从POST获取ID并转为整数,确保数据有效性 $addtoarray = isset($_POST['id']) ? intval($_POST['id']) : 0; if($addtoarray > 0){ // 只添加有效的正整数ID array_push($_SESSION['cart'], $addtoarray); echo "Toegevoogd aan uw winkelmandje."; var_dump($_SESSION['cart']); } else { echo "Voer een geldig plaatsing nummer in!"; } }else { echo "Log eerst in!"; } } ?> <html> <title>Just for kicks</title> <header> </header> <body> <form method='post' action=''> Plaatsing nummer invoeren: <input type='number' name='id' value=''><br> <button type="submit" class="submit" name="atc" value="atc">Winkelmadje</button><br><br> </form> </body> </html>
额外优化建议
- 可以添加数据库验证,检查用户输入的ID是否真的存在于
shop表中,避免无效ID被加入购物车。 - 如果需要禁止重复添加同一商品,可以用
in_array()先检查该ID是否已在购物车数组中。
内容的提问来源于stack exchange,提问作者Arjen
相关产品推荐
相关产品推荐

