Я создал страницу корзины покупок с помощью PHP. Теперь проблема, с которой я столкнулся, заключалась в том, что когда я добавляю продукт в корзину из списка продуктов, происходит то, что добавляется только 1-й продукт в списке.
Когда я добавляю другой продукт (поскольку каждый продукт в списке имеет свою собственную кнопку «Добавить в корзину»), первый продукт добавляется снова. Неважно, какой элемент я выбираю, он все равно заканчивается добавлением 1-го продукта.
Я что-то упускаю?
Вот мой код:
Список продуктов:
<?php do { ?> <tr> <td colspan="2"><font face="times new roman" size="3"><center><?php echo $prorow['pname']; ?></td> <td colspan="1"><font face="times new roman" size="3"><center><?php echo $prorow['pdesc']; ?></td> <td colspan="1"><font face="times new roman" size="3"><center><?php echo $prorow['price']; ?></td> <td colspan="1"><center><img src="admin/<?php echo $prorow['image']; ?>" width="80" height="80" /> <td colspan="1"> <input type="submit" name="addtocart" value="Add to Cart"> </td> </tr> <?php } while ($prorow = mysqli_fetch_assoc($result)); ?>
Я передаю значения, используя скрытые типы ввода.
Добавить в корзину:
<?php ob_start(); $con = mysqli_connect('localhost', 'abra', 'abra','abra') or die("Could not connect database"); $cname = mysql_escape_string($_POST['user']); $pid=mysql_escape_string($_POST['proID']); $pname=mysql_escape_string($_POST['proName']); $price=mysql_escape_string($_POST['proPRICE']); $qty=mysql_escape_string($_POST['qty']); $addtocart = "INSERT INTO cart_track (bid, cName, pname, price, qty) VALUES ('$pid', '$cname', '$pname', '$price', '$qty')"; mysqli_query($con,$addtocart); header("location:showcart.php"); exit; ob_end_flush() ?>
-<?php ob_start(); $con = mysqli_connect('localhost', 'abra', 'abra','abra') or die("Could not connect database"); $cname = mysql_escape_string($_POST['user']); $pid=mysql_escape_string($_POST['proID']); $pname=mysql_escape_string($_POST['proName']); $price=mysql_escape_string($_POST['proPRICE']); $qty=mysql_escape_string($_POST['qty']); $addtocart = "INSERT INTO cart_track (bid, cName, pname, price, qty) VALUES ('$pid', '$cname', '$pname', '$price', '$qty')"; mysqli_query($con,$addtocart); header("location:showcart.php"); exit; ob_end_flush() ?>
Показать корзину:
<?php $con = mysqli_connect('localhost', 'abra', 'abra','abra') or die("Could not connect database"); //Check if user wants to checkout or shop: if(isset($_POST['checkout'])) { header("location:orders.php"); } if(isset($_POST['shop'])) { header("location:prodtable.php"); } //retrieve items . use session_id and/or datetime //$PHPSESSID=session_id(); $showcart = "SELECT * from cart_track INNER JOIN products ON bid=pId WHERE bid=pId"; $result=mysqli_query($con, $showcart); if(!$result) { $err=true; //i recommend writing this error to a log or some text file, for security reasons. $errmsg=mysql_error(); } else { $err=false; $num=mysqli_num_rows($result); } ?>
Я подозреваю, что ошибка указана в коде списка продуктов, но у меня также есть файл AddtoCart.
Это не ответ на вопрос о OP, но раздел для исправления некоторых ошибок «OP»,
header()
Когда вы отправляете заголовок, убедитесь, что вы exit;
или die;
прямо после того, как вы хотите, чтобы код останавливался и больше не обрабатывался.
header("location:prodtable.php"); die;
mysql
и mysqli
Выберите тот или другой. Предпочтительно mysqli
как mysql
устарел.
Это расширение устарело с PHP 5.5.0 и не рекомендуется для написания нового кода, поскольку оно будет удалено в будущем. Вместо этого следует использовать расширение mysqli или PDO_MySQL.
У вас есть смесь отступов «техники» и дизайна кода. Придерживайтесь одного.
{
в той же строке, что и условие, иногда у вас есть это на новой строке. Вы слишком сильно mysql_real_escape_string()
на mysql_real_escape_string()
который;
Прежде чем пытаться вставить его в базу данных, проверьте его. Это позволит сэкономить головную боль позже, если вы ожидаете, что что-то будет в базе данных, и из-за отсутствия проверки данных ранее, конкретная система может упасть (и иметь эффект постучивания).
Is foo an int -------------- Kill process, tell user. | (NO) | (YES) | | Ok. Do further checks
Пожалуйста, используйте их больше для себя.
Да, я знаю, что это не codereview.se, но их нужно решать. Я видел столько вопросов, на которые должен ссылаться этот пост.
Хорошо, вот список продуктов.
<!----- PHP CODES HERE ----------> <?PHP $con = mysqli_connect('localhost', 'abra', 'abra','abra') or die("Could not connect database"); $result=mysqli_query($con, "SELECT * FROM products"); $prorow = mysqli_fetch_assoc($result); ?>
<!-- TOP BAR --> <div id="top-bar"> <div class="page-full-width cf"> <ul id="nav" class="fl"> <?php session_start(); if(isset($_SESSION['SES_UNAME'])) { echo "<li class='v-sep'><a href='profile.php' class='round button dark menu-user image-left'>Logged in as <strong>".$_SESSION['SES_UNAME']."</strong></a></li>"; } else { header('location: /loraine_mod/index.php'); exit(); } ?> <li class="v-sep"><a class="round button dark" href="index.php">Home</a></li> <li class="v-sep"><a class="round button dark" href="prodtable.php">Product List</a></li> <li class="v-sep"><a class="round button dark" href="cart.php">My Cart</a></li> <li class="v-sep"><a href="logout.php" class="round button dark menu-logoff image-left">Log out</a></li> </ul> <!-- end nav --> </div> <!-- end full-width --> </div> <!-- end top-bar --> <!-- MAIN CONTENT --> <div id="content"> <div class="content-module"> <div class="content-module-main" align='center'> <form method="POST" action="addtocart.php"> <table cols='5'> <font face='algerian'> <thead> <tr> <th colspan="2"><font face='times new roman' size='3'><center>Name</th> <th colspan="1"><font face='times new roman' size='3'><center>Description</th> <th colspan="1"><font face='times new roman' size='3'><center>Price</th> <th colspan="1"><font face='times new roman' size='3'><center>Image</th> <th colspan="1"><font face='times new roman' size='3'><center>Actions</th> </tr> </thead> <input name="proID" type="hidden" value="<?php echo $prorow['pId']?>"> <input name="proName" type="hidden" value="<?php echo $prorow['pname']?>"> <input name="proPRICE" type="hidden" value="<?php echo $prorow['price']?>"> <input name="user" type="hidden" value="<?php echo $_SESSION['SES_UNAME'] ?>"> <?php do { ?> <tr> <td colspan="2"><font face="times new roman" size="3"><center><?php echo $prorow['pname']; ?></td> <td colspan="1"><font face="times new roman" size="3"><center><?php echo $prorow['pdesc']; ?></td> <td colspan="1"><font face="times new roman" size="3"><center><?php echo $prorow['price']; ?></td> <td colspan="1"><center><img src="admin/<?php echo $prorow['image']; ?>" width="80" height="80" /> <td colspan="1"> <input type="submit" name="addtocart" value="Add to Cart"> </td> </tr> <?php } while ($prorow = mysqli_fetch_assoc($result)); ?> </table> </form> </div> <!-- end content-module-main --> </div> <!-- end content-module -->
Спасибо за предложения, я возьму их.
Ваши поля ввода находятся вне вашего цикла do
, поэтому значение всегда будет оставаться неизменным – т.е.: всегда будет первым продуктом.
<?php do { ?> <tr> <td colspan="2"><font face="times new roman" size="3"><center><?php echo $prorow['pname']; ?></td> <td colspan="1"><font face="times new roman" size="3"><center><?php echo $prorow['pdesc']; ?></td> <td colspan="1"><font face="times new roman" size="3"><center><?php echo $prorow['price']; ?></td> <td colspan="1"><center><img src="admin/<?php echo $prorow['image']; ?>" width="80" height="80" /> <td colspan="1"> <input name="proID" type="hidden" value="<?php echo $prorow['pId'] ?>"> <input name="proName" type="hidden" value="<?php echo $prorow['pname'] ?>"> <input name="proPRICE" type="hidden" value="<?php echo $prorow['price'] ?>"> <input name="user" type="hidden" value="<?php echo $_SESSION['SES_UNAME'] ?>"> <input type="submit" name="addtocart" value="Add to Cart"> </td> </tr> <?php } while ($prorow = mysqli_fetch_assoc($result)); ?> </table>
Уже исправлено. Ошибка (логическая) исходила от javascript, используемого для обновления страницы сайта покупок.
<script language="javascript"> function addtocart(pid){ document.form1.productid.value=pid; document.form1.command.value='add'; document.form1.submit(); } </script>
Так или иначе. Спасибо за ваш ответ, ребята. Будем задавать вопрос по этому поводу.