在这个期末考察的时候因为老师要求我们做一个在线购物的系统实现其功能,但是在购物车环节遇到了一些问题,主要是提交多个物品得问题,首先购物车肯定有多种物品,那么怎样在一次性表单中提交出去这是一个问题。 不可能让用户在结算界面一个一个挨个点,所以在购物车结算界面采用如下方式: 而考虑到数据的三种传输方式:session,request,post或者get
此时表明这个做法是成功的,因为当我们有多本书的时候,只要保证”name[]”这个数组的name值不同就可以提交了,然后在php页面对其进行遍历,拼接sql语句,但是这样有一个麻烦就是比如我前台有人买了10本不一样的书,那么我在后台要获取这个数组前面的”name”(有10个不相同的)那么我这个时候该怎么办,因为我后台根本无法知道你选的是什么书,比如说,前台有一个页面如下
<form action ="test-2.php" method="post"> 第一行代码 <input type="text" name="第一行[one]" value="0"/><br/> 第二行代码 <input type="text" name="第一行[two]" value="1"/><br/> 第三行代码 <input type="text" name="第一行[three]" value="2"/><br/> 第四行代码 <input type="text" name="第一行[four]" value="3"/><br/> <input type="submit" name="submit" value="提交"/> </form>那么你在后台怎样知道我选择的书这就比较麻烦了,因为我无法用Post获取你的数组名(所有书名) 后来我试着将每次遍历的数组名字(因为是前台通过遍历数据库将信息呈现出来的)提交到php后台,然后在后台页面通过遍历这个数组,获取每本书的书名,然后进行遍历,
<input type="text" name="bookname[<?php echo "从数据库购物车表获取的书名" ?>]"/><br/>最后到php页面先遍历这个bookname的数组,然后将其结果存入一个数组,用$_POST[]获取这个书,遍历这本书,
<?php $names=array(); if(isset($_POST['submit'])) { $books = $_POST['book']; foreach ($books as $key => $val) { $names[]=$val; } echo $names[1]; echo $names[0]; } else { ?> <form action ="test-2.php" method="post"> 第一行代码 <input type="text" name="user[one]" value="0"/><br/> 第二行代码 <input type="text" name="user1[two]" value="1"/><br/> 第三行代码 <input type="text" name="book[three]" value="user"/><br/>//代表的是一本书 第三行代码 <input type="text" name="book[five]" value="user1"/><br/>//代表另外一本书 第四行代码 <input type="text" name="user1[four]" value="3"/><br/> <input type="submit" name="submit" value="提交"/> </form> <?php } ?> 输出结果是user1user表示符合预期,而当你用下面代码开始循环遍历的时候就会提示
$book1=$_POST[$names[0]]; foreach ($books1 as $key => $val) {//这一行报错 echo $val; } Warning: Invalid argument supplied for foreach() in C:\Users\szh\phpfile\phpfile\order\test-2.php on line 19所以就放弃了
当用数组传值失败之后就用session开始传值了 原理就是建立一个类似三维数组的session Session[user][书名][各种属性]; 即在商品浏览页面添加进购物车的时候,加一个Session,当往数据库中插入成功之后保存该session; 这里需要循环遍历数据库购物车表
$_SESSION['book'][$bookname]['name']=$bookname;//代表书名 $_SESSION['book'][$bookname]['num']=$booknum;//书的购买数量 $_SESSION['book'][$bookname]['price']=$price;//书的价格当有了session以后,再回到购物车页面,这时从数据库里面查询出当前购物车的物品,此时为了安全最好再次替换下这些session,然后直接提交,此时我们只需要一个数组提交书名就可以了,因为此时我们的session里面已经有这个书的信息了,具体方式参考前面,
session_start(); $arrayall=$_POST['bname']; $cont=count($arrayall); $time=date("Y-m-d h:i:s"); $times=time(); $randoms=rand(0,10)+$times; $db->autocommit(false); $sql1="insert into orders() values('$randoms','{$_SESSION['username']}','$time','$cont')"; $db->query($sql1); try { foreach ($_SESSION['book'] as $key => $val) { echo $_SESSION['book'][$key]['name']; echo $_SESSION['book'][$key]['num']; echo $_SESSION['book'][$key]['price']; $sql = "insert into orderitem(flagid,username,bookname,booknum,bookprice) VALUES ('$randoms','{$_SESSION['username']}','{$_SESSION['book'][$key]['name']}','{$_SESSION['book'][$key]['num']}','{$_SESSION['book'][$key]['price']}')"; // echo $sql; $db->query($sql); } $sql3="delete from shopcart where username='{$_SESSION['username']}'"; $db->query($sql3); $db->query('commit'); $db->autocommit(true); }catch(Exception $e) { $db->query('rollback'); echo "回滚"; } unset($_SESSION['book']); $db->close(); header("location:../user/userzongdingdan.php")此时就可以了,在php页面开启一个事物,因为我有两个表,所以需要事物,一个是订单表,一个是订单详细表,最后清除session就OK了
