Короткий ответ: Ваш вопрос не то, что вы не добавляете элемент в массив , вы не понимаете, как работают массивы. Массивы не сохраняются на разных страницах, они создаются в единую среду выполнения одного сценария, если не указано иное.
MAJOR безопасности изъян # 1 - Отправка cartid в URL:
Edit: я понял это. Ваша переменная cartid
относится к product_id
. Это очень плохое имя переменной, любой программист предполагает, что это относится к идентификатору корзины покупок. Хотя этот недостаток безопасности не имеет отношения к этому случаю, я оставляю его здесь для тех, кто неправильно понимает ваш код и решает его скопировать.
Во-первых, это URL проблема:
echo '<a href="cart-page.php?action=add&cartid='.$row[0].'">ADD</a>'
Это означает, что, если я могу угадать другого пользователя корзины ID, я могу добавить элементы в своей корзине, посетив cart-page.php?action=add&cartid=100
где 100
является телегу другого пользователя ID ,Вы должны обрабатывать переменную $cart
с использованием утвержденного session, а не отправлять их через Интернет через GET
или POST
запросы, с которыми можно манипулировать пользователем.
MAJOR недостаток безопасности # 2 - Уязвимость к инъекциям SQL:
Заявление
$SQL = "SELECT * FROM tbl_product where id ='$cart'";
невероятно опасно. Скажем, я представить это в моем URL (правильно закодированы, конечно):
cartid = 2'; DROP TABLE tbl_product; SELECT * FROM tbl_product WHERE cartid='
Это будет затем выполнить следующий запрос на вашей базе данных:
SELECT * FROM tbl_product where id ='2'; DROP TABLE tbl_product; SELECT * FROM tbl_product WHERE cartid='';
Если вы хотите, чтобы избежать этого, у вас есть несколько вариантов. Лучшие из этих вариантов является переход к использованию prepared statements, самый простой из этих вариантов является использование mysql_real_escape_string
на все, что вы положили в вашу базу данных, как это:
$SQL = "SELECT * FROM tbl_product where id ='" . mysql_real_escape_string($cart) . "';";
После того, как вы исправили выше, мы можем исправить остальную часть кода:
Сначала мы хотим поместить ваши результаты в массив. Как $results
уже ассоциативный массив, вы можете использовать его непосредственно или хранить его, как это:
$cartData = $results;
Keeping продуктов в корзине
Edit: я понял, что вы делаете, вы» повторно используя переменную, называемую $cart
, чтобы сохранить идентификатор продукта, вам нужно отсортировать имена переменных.
Для того, чтобы иметь массив, который будет сохраняться на нескольких загрузке страницы, вам нужно будет сделать его переменной сеанса, сначала вы должны начать PHP сессии:
session_start();
использовать переменную сессии как это:
$_SESSION['shopping_cart'] = array();
Затем, когда вы добавить "продукт, сделать это:
$_SESSION['shopping_cart'][$cartData['id']] = array(
'name'=>$cartData['name'],
'quantity'=>1
);
При изменении количества, это:
$_SESSION['shopping_cart'][$productId]['quantity'] = $newQuantity;
Теперь, когда вы показываете тележку, вместо отображения непосредственно из продуктов, вставить в массив с помощью выше первого, а затем вернуть содержимое $_SESSION['shopping_cart']
.
foreach
изготовлен для массива поперечной, используйте его!
Наконец, не следует использовать некрасивый for
цикл для перебора массива, просто сделать:
<?php foreach($_SESSION['shopping_cart'] as $product): ?>
<tr>
<td><?php echo $product['name'] ?></td>
<td><input type='text' value='<?php echo $product['quantity'] ?>'></input></td>
</tr>
<?php endforeach; ?>
Надеется, что это помогает, я не сделал всю работу за вас, но я дал вам много указателей в правильном направлении и определили некоторые серьезные проблемы, которые имеют значение.
Рекомендации по данному проекту:
Торговый сайт является важным мероприятием, вы должны потратить некоторое время на чтение о таких понятиях, как PHP безопасности, сессий, реляционных баз данных и т.д. Это может показаться ненужным хлопот, но писать чистый и безопасный код теперь означает, что когда вы должны отлаживать его и вносить изменения, вы сможете сделать это намного проще.
Я также предлагаю вам ознакомиться с некоторыми (свободными, с открытым исходным кодом) средами MVC, такими как Zend и CakePHP. Они не будут делать всю работу за вас, но они упростят вашу работу, чтобы ваш код был хорошо сохранен и читабельным.
Вы должны вставить его – Ven
'cartid =" 'или' 1 '=' 1 '"' Boooom! – elclanrs
как @elcanrs написал BOOM и ваш Db не существует – Robert