массивы — Проблемы с передачей переменных URL Переполнение стека

У меня есть код для корзины покупок, который использует сеансы для хранения информации о корзине для посетителей / гостей.

Я не хочу, чтобы посетители создавали учетную запись и входили в систему только для того, чтобы добавить несколько товаров в корзину, так что это причина, по которой гостевая корзина использует сеансы.

Я использовал php, и проблема в том, что он небезопасен, потому что я передаю идентификатор продукта через URL.

Кроме того, когда количество корзин обновляется, через URL проходит больше значений.

Ниже приведены ссылки .text-файлы кода, который я использую

https://jameshamilton.eu/sites/default/files/products.txt

https://jameshamilton.eu/sites/default/files/cart.txt

если кто-то переходит на страницу корзины и просматривает URL-адрес (URL-адрес выглядит следующим образом >>>> www.mywebsite.whwhat / cart.php? action = remove&ID = 2
) и обновляет страницу корзины, когда товар добавляется в корзину, его количество будет увеличиваться только за счет обновления страницы.


Это настоящая проблема? если так, то как можно противостоять?

Я думал о настройке сеанса, который автоматически увеличивается со случайными целыми числами (чтобы его нельзя было угадать).

Сеанс начинается немедленно, когда пользователь / посетитель посещает веб-сайт, и он вставляется в базу данных MySQL, используя автоматически увеличенное значение сеанса.

С этого момента все, что пользователь / посетитель добавляет в корзину, попадает непосредственно в таблицу базы данных mysql под значением сеанса.

Таким образом, элементы корзины будут отображаться путем повторения элементов, добавленных в таблицу базы данных, ГДЕ сессия = значение сеанса.

как только пользователь покинет страницу, сеанс будет уничтожен, и целое число / значение сеанса, добавленные в базу данных, также будут удалены

это хороший подход? Существуют ли гораздо более простые и безопасные способы реализации гостевой корзины

Товар

<?php
//connect to your database here
?>

</head>

<body>


<table border="1">

<?php

$sql = "SELECT id, name, description, price FROM php_shop_products;";

$result = mysql_query($sql);

while(list($id, $name, $description, $price) = mysql_fetch_row($result)) {

echo "<tr>";

echo "<td>$name</td>";
echo "<td>$description</td>";
echo "<td>$price</td>";
echo "<td><a href=\"cart.php?action=add&id=$id\">Add To Cart</a></td>";

echo "</tr>";
}

?>
</table>


<a href="cart.php">View Cart</a>

</body>
</html>

телега

<?php session_start(); ?>



<?php
//connect to your database here
?>


</head>
<body>


<?php

$product_id = $_GET[id];     //the product id from the URL
$action     = $_GET[action]; //the action from the URL

//if there is an product_id and that product_id doesn't exist display an error message
if($product_id && !productExists($product_id)) {
die("Error. Product Doesn't Exist");
}

switch($action) {   //decide what to do

case "add":
$_SESSION['cart'][$product_id]++; //add one to the quantity of the product with id $product_id
break;

case "remove":
$_SESSION['cart'][$product_id]--; //remove one from the quantity of the product with id $product_id
if($_SESSION['cart'][$product_id] == 0) unset($_SESSION['cart'][$product_id]); //if the quantity is zero, remove it completely (using the 'unset' function) - otherwise is will show zero, then -1, -2 etc when the user keeps removing items.
break;

case "empty":
unset($_SESSION['cart']); //unset the whole cart, i.e. empty the cart.
break;

}

?>


<?php

if($_SESSION['cart']) { //if the cart isn't empty
//show the cart

echo "<table border=\"1\" padding=\"3\" width=\"40%\">";    //format the cart using a HTML table

//iterate through the cart, the $product_id is the key and $quantity is the value
foreach($_SESSION['cart'] as $product_id => $quantity) {

//get the name, description and price from the database - this will depend on your database implementation.
//use sprintf to make sure that $product_id is inserted into the query as a number - to prevent SQL injection
$sql = sprintf("SELECT name, description, price FROM php_shop_products WHERE id = %d;",
$product_id);

$result = mysql_query($sql);

//Only display the row if there is a product (though there should always be as we have already checked)
if(mysql_num_rows($result) > 0) {

list($name, $description, $price) = mysql_fetch_row($result);

$line_cost = $price * $quantity;        //work out the line cost
$total = $total + $line_cost;           //add to the total cost

echo "<tr>";
//show this information in table cells
echo "<td align=\"center\">$name</td>";
//along with a 'remove' link next to the quantity - which links to this page, but with an action of remove, and the id of the current product
echo "<td align=\"center\">$quantity <a href=\"$_SERVER[PHP_SELF]?action=remove&id=$product_id\">X</a></td>";
echo "<td align=\"center\">$line_cost</td>";

echo "</tr>";

}

}

//show the total
echo "<tr>";
echo "<td colspan=\"2\" align=\"right\">Total</td>";
echo "<td align=\"right\">$total</td>";
echo "</tr>";

//show the empty cart link - which links to this page, but with an action of empty. A simple bit of javascript in the onlick event of the link asks the user for confirmation
echo "<tr>";
echo "<td colspan=\"3\" align=\"right\"><a href=\"$_SERVER[PHP_SELF]?action=empty\" onclick=\"return confirm('Are you sure?');\">Empty Cart</a></td>";
echo "</tr>";
echo "</table>";



}else{
//otherwise tell the user they have no items in their cart
echo "You have no items in your shopping cart.";

}

//function to check if a product exists
function productExists($product_id) {
//use sprintf to make sure that $product_id is inserted into the query as a number - to prevent SQL injection
$sql = sprintf("SELECT * FROM php_shop_products WHERE id = %d;",
$product_id);

return mysql_num_rows(mysql_query($sql)) > 0;
}
?>

<a href="products.php">Continue Shopping</a>


<?php

/*

products table:
CREATE TABLE `products` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 255 ) NOT NULL ,
`description` TEXT,
`price` DOUBLE DEFAULT '0.00' NOT NULL ,
PRIMARY KEY ( `id` )
);

*/

?>



</body>
</html>

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]