|
|
|
| Здравствуйте, я извиняюсь, что создаю еще одну подобную тему, но посмотрев все уже существуюшие, я не нашел ответа на свой вопрос(может просто не понял, что это тоже самое).
Вопрос такой, я пишу небольшой магазин, вот дошел до корзинки, проблема в том, что я не понимаю как передать сессии несколько id товаров, тоесть когда я передал id какогото товара, то он отображается, но когда я хочу добавить в корзину еще один то уже надо передать два id и вот тут я не знаю как это сделать, помогите пожалуйсто.
вот простенький код, как я это представляю:
<?php
$q_blue = mysql_query("SELECT * FROM tbl_products WHERE type='blue_adap'");
if(mysql_num_rows($q_blue)>0)
{
while($r_blue=mysql_fetch_array($q_blue))
{
echo'<table><tr><td>';
echo'<img src="avatar/'.$r_blue['img_url'].'" width="200px" height="200px"></td></tr><tr><td>';
echo'<a href="kosik.php?id='.$r_blue['id'].'">добавить в корзину</a></td></tr></table>';
}
}else{echo 'Товара нету';}
?>
|
это код на странице, где находится список товаров, тут я через href передаю id на страницу корзинки
<?php
if($_SESSION['id_p']=='')
{
$id = isset($_GET['id'])?mysql_escape_string($_GET['id']):NULL;
$_SESSION['id_p'] = $id;
}else{
$q_prod = mysql_query("SELECT * FROM tbl_products WHERE id='".$_SESSION['id_p']."'");
$r_prod = mysql_fetch_array($q_prod);
echo '<table><tr><td>';
echo '<img src="avatar/'.$r_prod['img_url'].'" width="200px" height="200px"></td></tr><tr><td>';
echo 'Name'.$r_prod['name'].'</td></tr></table>';
echo '<a href="kosik.php?vyprazdnit=1">Очистить</a>';
}
if($_GET['vyprazdnit']){
session_destroy();
unset($_GET['vyprazdnit']);
mysql_close($link);
}
?>
|
тут я добавляю id одного товара в сессию и вывожу на экран.
Спасибо большое за помощь | |
|
|
|
|
|
|
|
для: Dmitry1988
(27.02.2010 в 14:22)
| | А причем тут сессия, если у вас корзина в базе? | |
|
|
|
|
|
|
|
для: sim5
(27.02.2010 в 14:30)
| | объясните ,пожалуйста, как тогда ее делать, я просто никогда еще корзину не делал. Я главное не могу понять как и где сохранять несоклько id товаров, чтобы он их запомнил и если ты ушел со страницы корзины, то они гдето были сохранены. Спасибо | |
|
|
|
|
|
|
|
для: Dmitry1988
(27.02.2010 в 14:42)
| | Что объяснить? Я к тому, что вы постоянно задаете вопрос "как передать несколько id в сессию", но при этом вообще не используете ее для этого.
Сделайте запросы на поиск: "пример корзины на mysql" и "пример корзины на сессии", и получите не мало примеров конкретного кода, да, думаю, и описания работы.
Но прежде ответьте себе же - что значит покинул, а корзина сохранилась? Если это не покупатель вовсе, а случайный посетитель, то стоит ли сохранять? А если сохраняете, то значит нужно как-то очищать такой мусор, в случае корзины на mysql. Если же она на сессии, то об этом можно не беспокоится.
Корзина это комплексный подход, который определяется условиями вашей торговли - способ выбора товаров, возможность отложенной покупки, оформление покупки, бонусы, скидки и т.п.. А уж из этого делать выбор между тем или иным механизмом организации корзины, как удобнее организовать ее работу. | |
|
|
|
|
|
|
|
для: sim5
(27.02.2010 в 15:11)
| | Спасибо большое нашел коекакие интерессные темы, буду пробовать с сессиями делать | |
|
|
|
|
|
|
|
для: sim5
(27.02.2010 в 15:11)
| | Здравствуйте еще раз, просмотрел я много тем, остановился на Вашем коде вот в этом посте http://softtime.ru/forum/read.php?id_forum=1&id_theme=59376&page=3, там вы делаете корзинку с передачей данных с помощью массива. Так как у меня все данные хранятся в ДБ, я попытался сделать так, чтобы при добавлении товара на страницу например (products.php), все данные из ДБ считались в массив, но возникла проблема в том что я не знаю как передать этот массив на страницу корзинки. Посоветуйте пожалуйсто как это сделать. Спасибо | |
|
|
|
|
|
|
|
для: sim5
(27.02.2010 в 15:11)
| | Здравствуйте еще раз, просмотрел я много тем, остановился на Вашем коде вот в этом посте http://softtime.ru/forum/read.php?id_forum=1&id_theme=59376&page=3, там вы делаете корзинку с передачей данных с помощью массива. Так как у меня все данные хранятся в ДБ, я попытался сделать так, чтобы при добавлении товара на страницу например (products.php), все данные из ДБ считались в массив, но возникла проблема в том что я не знаю как передать этот массив на страницу корзинки. Посоветуйте пожалуйсто как это сделать. Спасибо | |
|
|
|
|
|
|
|
для: Dmitry1988
(01.03.2010 в 13:43)
| | Я не понимал о чем вы спрашиваете:
как вывести список товаров на страницу пользователю?
или
как добавить выбранные пользователем товары в корзину (массив выбранных товаров)? | |
|
|
|
|
|
|
|
для: sim5
(01.03.2010 в 14:16)
| | второе, как выбрать выбранные пользователем товары в корзину, т.е. как перенести массив со страницы товаров например products.php на страницу корзинки korzinka.php | |
|
|
|
|
|
|
|
для: Dmitry1988
(01.03.2010 в 14:29)
| | Второе не выбрать, а добавить. Товары в корзину добавляются, а выбираются они на странице (в реальном магазине на прилавке).
Добавления масссива товаров в корзину со страницы несложная задача, но она будет зависеть от того, как выбирается сам товар. Например, вы торгуете автомобилями, и вряд ли кто у вас будет покупать: BMW - 3 шт., FIAT - 5 шт... Но если вы торгуете сигаретами, то вполне могут купить 5 пачек. То есть, в первом случае можно списку товаров на странице сопоставить чекбоксы, выбор которых и будут определять выбранный товар. А во втором случае такое будет не удобно для покупателя, ведь ему, в таком случае, придется пять раз заходить на страницу, чтобы купить у вас 5 пачек сигарет. Значит во втором случае это должно быть поле ввода, в котором покупатель сможет указать необходимое число выбранного им товара.
Сама же организация формы для выбора товаров на странице выглядит просто - элементам формы, определяющим выбранные товары, дается имя описывающее массив:
<form action="" method="post">
BMW <input type="checkbox" name="prod[]" value="12">
....
FIAT <input type="checkbox" name="prod[]" value="13">
<input type="submit" name="add" value="Добавить в корзину">
</form>
|
Здесь чекбосами определяется выбранный пользователем товар. Его количество не указано, и по умолчанию принимается равное единице. Атрибут value чекбоксов содержит уникальный ID-номер товара. При получении формы, вы получите массив $_POST['prod'], и по значениям его будете знать какие товары выбрал пользователь, добавив их в корзину.
Эта ситуация в примере корзины не предусматривается, хотя реализовать ее несложно, нужно лишь слегка доработать функцию. В примере, одиночный товар добавляется ссылкой, что естественно не удобно, но это был просто пример для автора той темы.
В случае когда пользователь может указывать на странице количество товаров, то принцип именования элементов формы не изменится, только в этом случае, индексами элементов массива формы будут служить уникальные ID-номера товаров, а их атрибуты value будут принимать введенные пользователем значения:
<form action="" method="post">
Прима <input type="text" name="prod[23]" />
....
Беломор <input type="text" name="prod[45]" />
<input type="submit" name="add" value="Добавить в корзину">
</form>
|
Этот случай рассмотрен на примере редактирования корзины пользователем. | |
|
|
|
|
|
|
|
для: sim5
(01.03.2010 в 15:06)
| | я очень извиняюсь, но я не могу понять сам процесс передачи данных с формы в массив, я пробовал и тот и тот мотод, но у меня так и не получилось чтобы чтото появилось в корзинке...
вот тут я код страницы products.php тут выписываются товары:
<?php
$q_blue = mysql_query("SELECT * FROM tbl_products WHERE type='blue_adap' ORDER BY id DESC");
if(mysql_num_rows($q_blue)>0)
{
while($r_blue=mysql_fetch_array($q_blue))
{
echo '<form action="kosik1.php?add='.$r_blue['id'].'" method="POST">';
echo 'Name:'.$r_blue['name'].'<br />';
echo 'Price:'.$r_blue['price'].'<br />';
echo 'Kolichestvo:<input type="text" name="prod['.$r_blue['id'].']"><br />';
echo '<input type="submit" name="add" value="Добавить в корзину">';
echo '<form>';
}
}else{echo'Zboži se připravuje';}
?>
|
может я не правильно понял и не так пишу форму?
я пытаюсь передать данные вот сюда(это Ваш код для воспроизведения корзины):
<?php
foreach($_SESSION['cart'] as $key => $val) {
$k += $val;
echo "<tr bgcolor=\"#ffffff\">
<td><a href=\"goods.php?id=" .$key. "\">" .$goods[$key]['name']. "</a></td>
<td>" .$goods[$key]['mony']. "</td>
<td><input type=\"text\" name=\"prod[" .$key. "]\" value=\"" .$val. "\"></td>
<td>" .$goods[$key]['mony']*$val. "</td>
<td><input type=\"checkbox\" name=\"del[]\" value=\"" .$key. "\"></td>
</tr>";
$m += $goods[$key]['mony']*$val;
}
?>
|
Подскажите как туда передать данные. Еще раз извиняюсь за тупость( | |
|
|
|
|
|
|
|
для: Dmitry1988
(01.03.2010 в 19:46)
| | Данные (массив товаров принятый от формы) передается не в вывод крзины на страницу, а функции worksCart() - она помещает в корзину (массив в сессии) товары. А этот цикл просто выводит массив товаров находящийся в сесси на страницу. При оформлении заказа, товары корзины записываются в таблицу заказов. | |
|
|
|
|
|
|
|
для: sim5
(01.03.2010 в 20:06)
| | Спасибо, теперь я понимаю весь код.
Т.е. когда данные приходят на страницу срабатывает вот эта часть функции?
<?php
if($prod) { //добавление товаров и обновление корзины
if (!isset($_SESSION['cart'])) $_SESSION['cart'] = array();
$cart = &$_SESSION['cart'];
if (is_array($prod)) { //добавление массива товаров
foreach($prod as $key => $val) {
$key = intval($key);
if ($key) {
$val = intval($val);
?>
|
она же передает данные в ту часть кода, которую я указал перед этим. Логически я вроде к этому пришел!
А правильно ли я передаю данные?
<?php
echo '<form action="kosik1.php?add='.$r_blue['id'].'" method="POST">';
echo 'Name:'.$r_blue['name'].'<br />';
echo 'Price:'.$r_blue['price'].'<br />';
echo 'Kolichestvo:<input type="text" name="prod['.$r_blue['id'].']"><br />';
echo '<input type="submit" name="add" value="Добавить в корзину">';
echo '<form>';
?>
|
| |
|
|
|
|
|
|
|
для: Dmitry1988
(01.03.2010 в 20:28)
| | Не срабатывает эта функция сама по себе, а при получении формы, массив описывающий выбранные товары, передается фукнции этой. Там же написаны примеры ее вызова. | |
|
|
|
|
|
|
|
для: sim5
(01.03.2010 в 21:00)
| | это я понимаю, я в форме через action передаю :
<?php
echo '<form action="korzina.php?add='.$r_blue['id'].'" method="POST">';
if (isset($_GET['add'])) worksCart($_GET['add']); //на странице корзинки он через эту строчку вызывает функцию
?>
|
| |
|
|
|
|
|
|
|
для: Dmitry1988
(01.03.2010 в 20:28)
| | Зачем передавать ID товара методом GET, в url скрипту обработчику? Для того, чтобы знать, что вам отправили форму? Так для этого достаточно проверить кнопку SUBMIT, она у вас имеет имя, а значит будут передана на сервер - $_POST['add'].
Спрашивая, как передать массив выбранных пользователем товаров, вы, надо полагать, понимаете, что это не один товар - не один на странице. В вашем примере один.
Представьте, что вы в реальном магазине, в котором корзины стоят на приколе у кассы, и вы вынуждены бегать от полок с товарами к корзине, принося по одному товару в нее. Не удобно, утомительно. В интернет-магазине, это будет способом выбора по одному товару.
Если в этом магазине вам будет разрешено брать уже по несколько различных товаров, и каждого из них в любом количестве, но при этом корзина так и останется на приколе у кассы, то это не принесет вам облегчения, а наоборот будет еще более обременительным.
В интернет-магазине бегать от прилавка к корзине вас будут заставлять кнопка SUBMIT, ибо при каждом добавлении товра, покупатель будет попадать на страницу корзины. А так ли она важна ему в процессе выбора товаров?
Как вы делаете покупку в магазине - вы просто отбираете товар в корзину, просчитывая в уме (либо заглянув в корзину, бегло просмотрев цену товаров) на какую сумму вы набрали их, сравнивая ее с той, которой вы располагаете. И только отобрав все, вы можете сделать детальную ревизию своей корзины, что-то убрав из нее, чтобы сэкономить на пиво, по пути домой, или наоборот чего-то доложив в нее. И уже после этого оплачиваете свою покупку.
Так и в интернет-магазине, вы должны создавать максимум удобств для покупателя.
Если у вас покупатель запрашивает, например, категорию "Конфеты", а у вас их сто наименований, то вы будете выводить их на страницу порциями по 10, 15, 20 наименований (эта таже самая постраничная навигация), выводя краткое описание товаров, их фото и т.п.. И все эти товары имеют поля ввода (элементы формы, одной формы). При каждом вводе пользователем некоего количества выбранного им товара, он должен видеть сколько товаров у него в корзине в данный момент и на какую сумму. То есть, ваша корзина должна еще иметь краткое свое представление, чисто информативное (хотя добавление товаров происходит именно в корзину). При этом пользователю не требуется нажимать кнопку "Добавить в корзину". Такой динамический способ добавления товаров в корзину поможет осуществить механизм Ajax. Выбрав товары на этой странице, пользователь может перейти на другую, где таким же образом может добавлять товары - вы опять будуте сообщать ему кратко о количестве их и сумме. При этом, если пользователь перейдет на предыдущую страницу, то форма должна показывать уже выбранные пользователем товары (те, что есть в корзине у него). Пользователь может перейти на страницу и подробного описания товара, на которой тоже может добавить товар в корзину.
А вот просмотреть подробную информацию о своей корзине он сможет по некой ссылке, или кнопке в кратком описании корзины. Здесь уже он может отредактировать свою корзину, либо вообще удалить все товары из нее, перейти по ссылкам на страницу товара и т.п.. Вот это будет удобно для покупателя.
А ведь еще у вас могут быть системы скидок, бонусов, и прочего, и прочего... И чтобы написать корзину для магазина, нужно все это учесть, начиная с того, чем и как вы торгуете, кончая некими сервисными возможностями. Вот таким образом нужно решать вопрос этот. А то, что у вас выше (и мой пример), ну это только для ознакомления годится, как пример механизма работы. | |
|
|
|
|
|
|
|
для: sim5
(02.03.2010 в 07:05)
| | естественно я все понимаю, что вы написали, я потом буду усовершенствовать корзинку под себя. Просто моя первичная задача это перенести правильно данные в корзинку чтобы они отобразились в ней. Но так как у меня мало практики с массивами и сессиями я пытаюсь, сделать свою первую корзинку с помощью Вашего кода, просто потом когда я ее сделаю я пойму все принципы и буду все менять под себя и естественно писать корзинки сам. Впринципе я уже понял весь код, научился с помощью этого поста работать с сессиями(спасибо Вам), у меня осталась только одна проблема, воспроизвести( в корзине) переданные данные из формы.. | |
|
|
|
|
|
|
|
для: Dmitry1988
(02.03.2010 в 12:05)
| | Ну а что тут сложного? У вас в сессии находится массив товаров: их ID и количество. Чтобы отобразить полную инофрмацию о корзине, вам необходимо сделать запрос к базе, получив информацию о товарах лежащих в корзине (по их ID) - название товара, цена, и в цикле вывести все это, сделав необходимые расчеты о ценах.
Если корзина будет работать динамически (при каждом изменении пользователем значений в поле ввода), то для того, чтобы не дергать постоянно базу данных, можно получать эту информацию о товарах только для тех товаров, которых нет в корзине, помещая ее в сессионный массив товаров корзины, а выводя корзину пользователю, всю информацию о ней брать уже из сессии. | |
|
|
|
|
|
|
|
для: sim5
(02.03.2010 в 12:34)
| | я кажется понял в чем проблема, у меня не передаются данные на страницу корзинки, в сессии нету информации о id и количестве, я попытался выписать:
<?php
$q_prod = mysql_query("SELECT name,price FROM tbl_products WHERE id='".$id."'");
if($q_prod){
$r_prod = mysql_fetch_array($q_prod);
}
//имеющиеся товары
$goods = array(
$r_prod['id'] =>array('name'=>$r_prod['name'],'mony'=>$r_prod['price'])
);
?>
|
где $id берется из функции:
<?php
$id = intval($prod);
if ($id) $cart[$id] = array_key_exists($id, $cart) ? $cart[$id] + 1 : 1;
?>
|
но при выполнение этого запроса $id равно ничему | |
|
|
|
|
|
|
|
для: Dmitry1988
(02.03.2010 в 14:30)
| | Какие данные?
В сессии всегда будут данные о ID товара и его количестве, ибо добавление товара, это как раз занесение в сессию этих данных. Если они у вас потерялись, значит вы либо забыли продолжить сессию на другой странице, либо что-то где-то напутали.
Если вы речь ведете о выводе корзины пользователю, то $id никак нельзя уже получить из
id = intval($prod);
if ($id) $cart[$id] = array_key_exists($id, $cart) ? $cart[$id] + 1 : 1;
эта функция к выводу корзины никакого отношения не имеет, и не должна иметь - ее задача добавить товар (id, количество) в корзину. А id товаров нужно получать из сессионного массива, и лучше сразу все, а не в цикле вывода корзины делать множество обращений к базе.
Или вы говорите о проблеме добавления доп. информации о товаре в сессию при его добавлении?
Поконкретней пишите, чего вы делаете. | |
|
|
|
|
|
|
|
для: sim5
(02.03.2010 в 14:49)
| | Нет, сессия везде прописана, пока что о проблеме получения id! А можно както посмотреть что у меня находиться в сессионном массиве? Потомучто когда я выписываю просто $_SESSION['cart'] то он пишет просто array. А для получения всех id есть какаято функция или их например через foreach выбрать все? | |
|
|
|
|
|
|
|
для: Dmitry1988
(02.03.2010 в 15:24)
| |
<pre>
<?
print_r($_SESSION['cart']);
?>
</pre>
|
| |
|
|
|
|
|
|
|
для: sim5
(02.03.2010 в 15:42)
| | Вот что пишет, все нормально передается:
<?php
Array
(
[14] => 8
[13] => 10
[12] => 2
)
?>
|
значит я опять что то не так делал при выборе $id в запрос, а как выбрать id и кол-во из сессионного массива? | |
|
|
|
|
|
|
|
для: Dmitry1988
(02.03.2010 в 16:05)
| | Ну для начала можете пробежать по массиву и функцией foreach (хотя это конечно не единственное и не лучшее решение), получить список ключей массива (id-товаров). Далее испольуя оператор IN в запросе к базе получить информацию об этих товарах. | |
|
|
|
|
|
|
|
для: sim5
(02.03.2010 в 16:17)
| | вот сделал так:
<?php
foreach($_SESSION['cart'] as $id_p=>$val) {
$q_prod = mysql_query("SELECT * FROM tbl_products WHERE id IN('".$id_p."')");
if($q_prod){
$r_prod = mysql_fetch_array($q_prod);
}
//имеющиеся товары
$goods = array(
$r_prod['id'] =>array('name'=>$r_prod['name'],'mony'=>$r_prod['price'])
);
}
?>
|
и наконец он мне вывел чтото в корзинку) Но почемуто он выводит только последний добавленный товар, тоесть какое $id в строке браузера тот товар он и выводит... | |
|
|
|
|
|
|
|
для: Dmitry1988
(02.03.2010 в 17:51)
| | А как вы думаете почему толькой последний, вернее почему именно последний? | |
|
|
|
|
|
|
|
для: sim5
(02.03.2010 в 17:54)
| | я уже понял потомучто он выберает id из массива, а как ему правильно сказать чтобы он выбрл все id? | |
|
|
|
|
|
|
|
для: Dmitry1988
(02.03.2010 в 18:02)
| | Я писал - получить список ключей массива как: 12,23,45,67 .... и т.д., и это использовать в ОДНОМ ЕДИНСТВЕННОМ запросе к базе - IN(переменная содержащая этот список).
Вы же в цикле гоняете запросы к базе, при этом использование IN просто бессмысленно.
В раздел MySQL, смотреть примеры запросов, их обработку, изучать.... | |
|
|
|
|
|
|
|
для: sim5
(02.03.2010 в 18:12)
| | можно еще такой вопрос..с помощью какой функции разделить полученные id запятыми, я все никак найти не могу.. | |
|
|
|
|
|
|
|
для: Dmitry1988
(02.03.2010 в 20:03)
| | Ну если прогонять массив в цикле, то просто добавляя при проходе к полученному ключу запятую:
$key . ",";
Но я вам уже говорил, что прогонять массив циклом и таким образом получить список ключей, не единственный и лучший способ. Нужно заглядывать в мануал, смотреть функции, а их предостаточно. Можно получить вам нужное одной строкой кода, если использовать функции
implode и array_keys. Прочтите о них и попробуйте сами это сделать. | |
|
|
|
|
|
|
|
для: sim5
(02.03.2010 в 20:17)
| | implode, array_keys, array_map/walk и intval как минимум. | |
|
|
|
|
|
|
|
для: Trianon
(02.03.2010 в 22:08)
| | При получении формы уже обработано intval. | |
|
|
|
|
|
|
|
для: sim5
(03.03.2010 в 04:22)
| | при получении формы в этом нужда невелика, а при формировании тела SQL-запроса - огромна.
Когда укол делают, иглу шприца (и задницу) эфиром протирают непосредственно перед уколом, а не после приглашения в процедурный кабинет. | |
|
|
|
|
|
|
|
для: Trianon
(03.03.2010 в 08:59)
| | Ну так тут конкретный пример рассматирвается - запрос по данным из сессионного массива, который при получении формы устанавливается, и при помещении в нее, данные из формы уже проходят соответствующую обработку.
В данном случае, чтобы сделать укол, нужно завладеть сессией, изменить ее, либо подменить сам запрос (стать владельцем скрипта). Или я не прав? | |
|
|
|
|
|
|
|
для: sim5
(02.03.2010 в 20:17)
| | Спасибо большое массив в запрос передал вот так:
<?php
$arr = $_SESSION['cart'];
$arr_a = array_keys($arr);
$arr_i = implode(",",$arr_a);
$q_prod = print("SELECT id,name,price FROM tbl_products WHERE id IN($arr_i)");
?>
|
но теперь запрос читает только первое значение, я использовал оператор IN прочитал про него, вроде данные передаются правильно | |
|
|
|
|
|
|
|
для: Dmitry1988
(03.03.2010 в 13:22)
| | $arr_i = implode(",",array_keys($_SESSION['cart']);
$q_prod = print("SELECT id,name,price FROM tbl_products WHERE id IN($arr_i)"); - а это что такое? | |
|
|
|
|
|
|
|
для: sim5
(03.03.2010 в 13:34)
| | запрос, извиняюсь забыл print поменять на mysql_query, я просто смотрел чего он видит в запросе | |
|
|
|
|
|
|
|
для: Dmitry1988
(03.03.2010 в 13:38)
| | Запрос вам вернет ресурс (если конечно в базе будут обнаружены записи для требуемых id), получайте из него данные. Вы запрос для чего делали - для вывода корзины, значит в ЦИКЛЕ обрабатывающем полученный ресурс, вы должны по id из ресурса находить количество этого товара в массиве $_SESSION['cart'], умножать на это количество полученную цену за единицу товара, одновременно подсчитывая общую сумму покупки. В примере корзины (которую вы и изучаете, таковое есть, с разницей лишь в том, что там вместо таблицы в базе, используется массив товаров, имитирующий базу).
Вот у вас и получится вывод корзины. | |
|
|
|
|
|
|
|
для: sim5
(03.03.2010 в 13:48)
| | Все, я понял где у меня была ошибка и все выводится, спасибо Вам огромное)
Но теперь возникла еще одна трудность, почемуто на странице, где я выписываю товары:
<?php
$q_blue = mysql_query("SELECT * FROM tbl_products WHERE type='blue_adap' ");
if(mysql_num_rows($q_blue)!=0)
{
while($r_blue=mysql_fetch_array($q_blue))
{
echo'<div class="float">';
echo'<form action="kosik1.php?add='.$r_blue['id'].'" method="POST">';
echo'<table class="prod_tbl" ><tr><td class="prod">';
echo'<b>Název</b>: '.$r_blue['name'].'</td></tr><tr><td class="prod">';
.
.
.
echo'<a style="text-decoration:underline; color:#3399FF;" href="more.php?id='.$r_blue['id'].'">подробнее>></a></td></tr></table>';
echo 'Кол-во:<input type="text" name="prod['.$r_blue['id'].']" size="10"><br />';
echo '<input type="submit" name="add" value="Добавить"><br />';
echo '<form>';
echo'</div>';
}
}
?>
|
при добавление у всех товаров пишется одно и тоже id, но в тоже время в строчке:
<?php
echo'<a style="text-decoration:underline; color:#3399FF;" href="more.php?id='.$r_blue['id'].'">подробнее>></a></td></tr></table>';
?>
|
подробное описание товара, пишутся разные id... | |
|
|
|
|
|
|
|
для: Dmitry1988
(03.03.2010 в 14:43)
| | Я вам уже указывал на эту хрень:
kosik1.php?add='.$r_blue['id'].'"
и вы все равно упорно ее туда пишите. Зачем?
mysql_fetch_array, и использовать mysql_fetch_assoc.
Одинаковы потому, что вы где-то не верно массив обрабатываете. Проверьте, что вы получаете, проследите как обрабатываете его далее. Посмотрите исходный код (HTML) страницы с формой. | |
|
|
|
|
|
|
|
для: sim5
(03.03.2010 в 14:55)
| | я просто не понимаю как я передам данные на страницу корзинки без этой строчки...
Посмотрел html код и как ни странно он в нем пишет правильные id т.е. везде разные | |
|
|
|
|
|
|
|
для: Dmitry1988
(03.03.2010 в 15:19)
| | Данные на страницу передает не GET-переменная add, которую вы боитесь потерять, а форма методом POST.
Проверяйте почему у вас добавляется только один товар - вы что-то не верно делаете. | |
|
|
|
|
|
|
|
для: sim5
(03.03.2010 в 15:27)
| | удалил я $_GET параметр, оставил только ссылку на корзинку, теперь при передаче данных ничего не происходит...я написал чтобы он выписал мне массив, но массив пустой..
Как вы думаете где искать ошибку на странице товаров или на странице корзинки? | |
|
|
|
|
|
|
|
для: Dmitry1988
(03.03.2010 в 15:49)
| | Вы просто не проанализировали как следует работу скрипта моего примера. В нем:
1. GET-переменная add дает знать скрипту обработчику, что добавляется одиночный товар (определяется ссылкой). Вам она совсем не нужна.
2. POST-переменной update определяется, что скрипту передан массив. И хотя он не со страницы с товарами пришел, а во время редактирования корзины пользователем, суть от этого не меняется. Можно и просто проверять - пришел или нет POST массив prod.
3. POST-переменная del - сообщает об удалении выбранного товара
4. POST-переменная clear - сообщает, что пользователь удаляет корзину.
Вы что-то не так делаете, а что, мне трудно сказать. | |
|
|
|
|
|
|
|
для: sim5
(03.03.2010 в 16:02)
| | я понял почему он так делает, я выписал массивом все id и оказалось, что я ведь когда выписываю данные из БД то порядковый номер у каждого id равен 0, т.е. при добавление в корзину у каждого id один и тот же номер в массиве, поэтому он добавлял в нее только первое значение!
Подскажите пожалуйсто как можно записать сначало все id из запроса, чтобы они стояли в массиве каждый под своим номером. Если просто сказать, что id(из запроса) является массивом, то он выпишет только одно значение.. Спасибо | |
|
|
|
|
|
|
|
для: Dmitry1988
(04.03.2010 в 12:18)
| | Каждый товар должен иметь уникальный номер, а не номер порядковый. Такую уникальность вам обеспечит поле с автоинкрементом, вот это и будет id товара. И этот номер никак не может быть массивом, это массив может содержать такие номера. А как они в массиве располагаются (по ранжиру) роли никакой не играет. ID товаров в этом массиве служат ключами, а под этими ключами могут содеражтся также массивы, например, количество товара, его название, цена...
Вы либо так и не поняли сути всего, либо что-то не так делаете. | |
|
|
|
|
|
|
|
для: sim5
(04.03.2010 в 12:40)
| | поле с автоинкрементом есть, я просто думал, что если все эти уникальные номера(id) вставить в массив, чтобы у каждого был свой номер т.е.(0,1,2,3....), то они бы передавались на страницу корзинки правильно. Это я к тому то что у меня у всех товаров передается одно и то id на страницу корзинки. Буду думать дальше... | |
|
|
|
|
|
|
|
для: Dmitry1988
(04.03.2010 в 13:04)
| | Значит вы не понимаете сути, самой простой - что такое массив и с чем его едят. ;-) | |
|
|
|
|
|
|
|
для: sim5
(04.03.2010 в 13:11)
| | Пытаюсь понять) Можно еще вопрос по массивам?) Я когда из формы передаю данные $_POSTом (я уже убрал $_GET параметр), это передается массив да? | |
|
|
|
|
|
|
|
для: Dmitry1988
(04.03.2010 в 13:41)
| | Если вы именуете поля формы как элементы массива (как ранее, выше, я показывал) , то конечно вы получите массив. Но в случае, если вы будете все писать никак в примере, а серьезную корзину, в которой будет и динамическое ее отображение (а оно нужно покупателям), с применением Ajax, то совсем не обзятелен массив (передача массива), достаточно на сервер передавать id того товара, количество которого пользователь вводит в поле формы (по событию onchange поля ввода). В этом случае у формы вообще не будет кнопки SUBMIT.
То есть, зацикливаться на массиве вам не стоит, важно только понять, что сессия будет хранить именно массив выбранных пользователем товаров, и ключами этого массива будут уникальные id номера товаров. Как они располагаются в массиве, в каком порядке, это совсем не важно.
Используя Ajax, можно будет при добавлении товара (его id и количества, что означает ключ=>значение), забирать из базы в этот же массив (сессионный) наименование товара и его цену, если у данного товара этой информации ранее еще не добавлялось (то есть, это проверяется). В этом случае сессионный массив может иметь уже такой вид, например:
13=>array('name'=>'Персики', 'money'=>50, 'count'=>2)
и т.д., где 13 это ключ, являющийся id товара, и под ним содержится массив описывающий основные данные об этом товаре.
При этом механизме стоит учитывать то, что пользователь очищая поле ввода формы (удаляет ранее введенное), может таким образом отказаться от этого товара, а может быть он просто редактирует это поле, изменяя количество. Его истинные намерения не могут быть известны вам, а потому лучше не удалять этот товар из корзины, дабы исключить опять повторный запрос к базе, достаточно не учитывать такой товар для краткой корзины и извещения на странице, что данный товар уже имеется в корзине. И только при переходе пользователя на страницу корзины, удалять такие товары из сессионного массива товаров.
Если вы сейчас зациклитесь на массиве (хотя вам обязательно нужно понять как это работает), то в дальнейшем, вы скорее всего напишите корзину, которая никак не будет отвечать характеру торговли вашего магазина. Корзина, это всего лишь инструмент, а каким он должен быть определяют и какие у вас товары, каким образом их лучше выбирать, и так далее, и тому подобное. Вы уже сейчас должны об этом думать. | |
|
|
|
|
|
|
|
для: sim5
(04.03.2010 в 14:19)
| | Спасибо за советы, я понимаю, что может быть это не самая динамичная корзина, но просто уже хочется ее доделать, да и уже сил нету сейчас начинать делать новую на аяксе :-(
Все никак понять не могу, почему он мне стал заменять данные в сессии..т.е. добавил я один товар, потом пошел опять на страницу с товарами и добавил еще один а в сессии первый заменяется на второй, не знаете с чем это может быть связано? | |
|
|
|
|
|
|
|
для: Dmitry1988
(04.03.2010 в 15:51)
| | Не знаю, потому как не вижу всего, что вы делаете. | |
|
|
|
|
|
|
|
для: sim5
(04.03.2010 в 16:16)
| | Из формы отправляю данные:
<?
$q_blue = mysql_query("SELECT * FROM tbl_products WHERE type='blue_adap'");
if(mysql_num_rows($q_blue)>0)
{
while($r_blue=mysql_fetch_assoc($q_blue)){
echo'<div class="float">';
echo'<form action="korzinka.php" method="POST">';
echo 'Kol-vo:<input type="text" name="prod['.$r_blue['id'].']" size="10" value="0"><br />';
echo '<input type="submit" name="add" value="Добавить"><br />';
echo '<form>';
echo'</div>';
}
}else{echo'Nichego netu';}
?>
|
потом на странице корзинки обрабатываю их:
<?php
if(isset($_POST['add'])) {worksCart($_POST['prod']); } //добавление через функцию(Вашу)
?>
|
и вывожу в корзинку данные:
<?php
.
.
foreach($_SESSION['cart'] as $key => $val) {
$q = mysql_query("SELECT * FROM tbl_products WHERE id='".$key."'");
if($q)
{$r_prod1 = mysql_fetch_array($q);}
else
{echo mysql_errno().'.'.mysql_error()."\n";}
$k += $val;
echo "<tr bgcolor=\"#ffffff\">
<td><a href=\"goods.php?id=" .$key. "\">" .$r_prod1['name']. "</a></td>
<td>" .$r_prod1['price']. "</td>
<td><input type=\"text\" name=\"prod[" .$key. "]\" value=\"" .$val. "\"></td>
<td>" .$r_prod1['price']*$val. "</td>
<td><input type=\"checkbox\" name=\"del[]\" value=\"" .$key. "\"></td>
</tr>";
$m += $r_prod1['price']*$val;
}
.
.
?>
|
| |
|
|
|
|
|
|
|
для: Dmitry1988
(04.03.2010 в 16:25)
| | Для кратости в примере опущены выводы ошибок при не удачах, проверка не пустой ли запрос возвращается и т.п., так как заведомо известно, что все есть и...
В примере идет обращение к базе `test` с таблицей товаров `goods` имещей три поля: id, name, money.
Страница с товарами условно названа goods.php, а обработчик добавления товаров и вывода корзины на страницу cart.php.
goods.php
<?
session_start();
mysql_connect('localhost','main','pass');
mysql_select_db('test');
$q = mysql_query("SELECT * FROM goods ORDER BY name");
echo '<form method="post" action="cart.php">';
while ($row = mysql_fetch_assoc($q)) {
echo $row['name']."<br>";
//если в корзине есть этот товар, выводим об этом информацию
//и количество его в корзине, иначе предложение о выборе
echo (isset($_SESSION['cart']) && array_key_exists($row['id'],$_SESSION['cart'])) ?
'В корзине: <input type="text" name="prod['.$row['id'].']" value="'.$_SESSION['cart'][$row['id']].'"> шт.' :
'Выбрать: <input type="text" name="prod['.$row['id'].']"> шт.';
echo '<hr width="100%" size="1">';
}
?>
<input type="submit" name="add" value="Добавить в корзину">
</form>
|
cart.php
<?
function worksCart ($prod) {
if($prod) { //добавление товаров и обновление корзины
if (!isset($_SESSION['cart'])) $_SESSION['cart'] = array();
$cart = &$_SESSION['cart'];
if (is_array($prod)) { //добавление массива товаров
foreach($prod as $key => $val) {
$key = intval($key);
if ($key) {
$val = intval($val);
if (isset($_POST['del']) && in_array($key, $_POST['del']) || !$val) {
//удаление товара из корзины
if (array_key_exists($key, $cart)) unset($cart[$key]);
} else $cart[$key] = $val; //добавление, обновление
}
}
} else {
//добавление одиночного товара
$id = intval($prod);
if ($id) $cart[$id] = array_key_exists($id, $cart) ? $cart[$id] + 1 : 1;
}
} else unset($_SESSION['cart']); //удаление корзины
}
session_start();
//добавление товаров в корзину
if (isset($_POST['add'])) worksCart($_POST['prod']);
//редактирование корзины
if (isset($_POST['update'])) worksCart($_POST['cart']);
//удаление корзины
if (isset($_POST['clear'])) worksCart(0);
echo '<hr width="100%" size="1">';
if (!empty($_SESSION['cart'])) {
mysql_connect('localhost','main','pass');
mysql_select_db('test');
//получаем id товаров имеющихся в корзине
$ids = implode(',',array_keys($_SESSION['cart']));
//получаем информацию об этих товарах
$q = mysql_query("SELECT * FROM goods WHERE id IN(".$ids.") ORDER BY name");
//выводим корзину
echo '<form method="post" action="cart.php">
<input type="submit" name="clear" value="Очистить корзину">
<table bgcolor="#696969" cellspacing="1" cellpadding="4" width="100%">
<tr bgcolor="#f5f5f5">
<td>Товар</td>
<td>Цена, руб</td>
<td>Выбрано, шт</td>
<td>Стоимость, руб</td>
<td>Удалить</td>
</tr>';
$k = 0; //всего товаров в корзине
$m = 0; //всего цена за товары
while ($row = mysql_fetch_assoc($q)) {
$cnt = $_SESSION['cart'][$row['id']]; //получаем число товаров в корзине
$k += $cnt;
echo '<tr bgcolor="#ffffff">
<td><a href="goods.php?id=' .$row['id']. '">' .$row['name']. '</a></td>
<td>' .$row['money']. '</td>
<td><input type="text" name="cart[' .$row['id']. ']" value="' .$cnt. '"></td>
<td>' .$row['money']*$cnt. '</td>
<td><input type="checkbox" name="del[]" value="' .$row['id']. '"></td>
</tr>';
$m += $row['money']*$cnt;
}
echo '<tr bgcolor="#ffffff">
<td colspan="2">Всего</td>
<td>' .$k. '</td>
<td>' .$m. '</td>
<td> </td>
</tr>
</table>
<input type="submit" name="update" value="Обновить корзину">
</form>';
} else print "Ваша корзина пуста!";
?>
<hr width="100%" size="1">
<a href="goods.php">Перейти на страницу товаров</a>
|
| |
|
|
|
|
|
|
|
для: sim5
(04.03.2010 в 20:08)
| | Все работает! Так я и не понял где у меня какаято ошибка вклинилась в моем коде...
Большое тебе человеческое спасибо, что помог во всем разобраться!
П.С. с этого поста я много чего научился(работа с массивами и сессиями). | |
|
|
|
|
|
|
|
для: sim5
(04.03.2010 в 13:11)
| | все я передал данные, разобрался наконецтаки :-)))) я просто написал вот так:
<?php
if(isset($_POST['add'])){
worksCart($_POST['prod']);
}
?>
|
он и кол-во и id переносит, только почему-то удаляется то, что было перед этим товаром, и выписывается только этот, но это я сейчас еще напрягу мозги-) | |
|
|
|
|
|
|
|
для: sim5
(27.02.2010 в 15:11)
| | простите за 2 сообщения | |
|
|
|
|
|
|
|
для: Dmitry1988
(27.02.2010 в 14:22)
| | в сессии необходимо хранить сериализованный массив, то есть его строковое представление | |
|
|
|
|
|
|
|
для: Ури Геллер
(01.03.2010 в 18:44)
| | если не понятно, пример
1.php
<?php
session_start();
$array = array("хер", "хор", "хир");
$s = serialize($array);
$_SESSION["x"] = $s;
?>
|
2.php
<?php
session_start();
$array = unserialize($_SESSION["x"]);
print_r($array);
?>
|
Если есть желание меня отблагодарить могу дать номер кошелька. | |
|
|
|
|
|
|
|
для: Ури Геллер
(01.03.2010 в 18:49)
| |
<?
$s = serialize($array);
$_SESSION["x"] = $s;
|
>Если есть желание меня отблагодарить могу дать номер кошелька.
За подобное с Вас деньги надо брать.... | |
|
|
|
|
|
|
|
для: Ури Геллер
(01.03.2010 в 18:44)
| | Зачем? | |
|
|
|
|