|
|
|
|
|
для: sim5
(04.03.2010 в 20:08)
| | Все работает! Так я и не понял где у меня какаято ошибка вклинилась в моем коде...
Большое тебе человеческое спасибо, что помог во всем разобраться!
П.С. с этого поста я много чего научился(работа с массивами и сессиями). | |
|
|
|
|
|
|
|
для: 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 в 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 в 15:51)
| | Не знаю, потому как не вижу всего, что вы делаете. | |
|
|
|
|
|
|
|
для: sim5
(04.03.2010 в 14:19)
| | Спасибо за советы, я понимаю, что может быть это не самая динамичная корзина, но просто уже хочется ее доделать, да и уже сил нету сейчас начинать делать новую на аяксе :-(
Все никак понять не могу, почему он мне стал заменять данные в сессии..т.е. добавил я один товар, потом пошел опять на страницу с товарами и добавил еще один а в сессии первый заменяется на второй, не знаете с чем это может быть связано? | |
|
|
|
|
|
|
|
для: 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 в 13:11)
| | все я передал данные, разобрался наконецтаки :-)))) я просто написал вот так:
<?php
if(isset($_POST['add'])){
worksCart($_POST['prod']);
}
?>
|
он и кол-во и id переносит, только почему-то удаляется то, что было перед этим товаром, и выписывается только этот, но это я сейчас еще напрягу мозги-) | |
|
|
|
|
|
|
|
для: sim5
(04.03.2010 в 13:11)
| | Пытаюсь понять) Можно еще вопрос по массивам?) Я когда из формы передаю данные $_POSTом (я уже убрал $_GET параметр), это передается массив да? | |
|
|
|
|
|
|
|
для: Dmitry1988
(04.03.2010 в 13:04)
| | Значит вы не понимаете сути, самой простой - что такое массив и с чем его едят. ;-) | |
|
|
|
|
|
|
|
для: sim5
(04.03.2010 в 12:40)
| | поле с автоинкрементом есть, я просто думал, что если все эти уникальные номера(id) вставить в массив, чтобы у каждого был свой номер т.е.(0,1,2,3....), то они бы передавались на страницу корзинки правильно. Это я к тому то что у меня у всех товаров передается одно и то id на страницу корзинки. Буду думать дальше... | |
|
|
| |
|