Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: логика корзинки

Сообщения:  [1-10]    [11-20]   [21-30]   [31-40]   [41-50]   [51-60]  ...    [61-61] 

 
 автор: Dmitry1988   (04.03.2010 в 21:53)   письмо автору
 
   для: sim5   (04.03.2010 в 20:08)
 

Все работает! Так я и не понял где у меня какаято ошибка вклинилась в моем коде...
Большое тебе человеческое спасибо, что помог во всем разобраться!

П.С. с этого поста я много чего научился(работа с массивами и сессиями).

  Ответить  
 
 автор: 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
    } 
  } 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>&nbsp;</td> 
    </tr> 
   </table> 
   <input type="submit" name="update" value="Обновить корзину"> 
   </form>'
;
} else print 
"Ваша корзина пуста!";
?>
<hr width="100%" size="1">
<a href="goods.php">Перейти на страницу товаров</a>

  Ответить  
 
 автор: Dmitry1988   (04.03.2010 в 16:25)   письмо автору
 
   для: 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
  }
.
.
?>

  Ответить  
 
 автор: sim5   (04.03.2010 в 16:16)   письмо автору
 
   для: Dmitry1988   (04.03.2010 в 15:51)
 

Не знаю, потому как не вижу всего, что вы делаете.

  Ответить  
 
 автор: Dmitry1988   (04.03.2010 в 15:51)   письмо автору
 
   для: sim5   (04.03.2010 в 14:19)
 

Спасибо за советы, я понимаю, что может быть это не самая динамичная корзина, но просто уже хочется ее доделать, да и уже сил нету сейчас начинать делать новую на аяксе :-(
Все никак понять не могу, почему он мне стал заменять данные в сессии..т.е. добавил я один товар, потом пошел опять на страницу с товарами и добавил еще один а в сессии первый заменяется на второй, не знаете с чем это может быть связано?

  Ответить  
 
 автор: 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 товара, и под ним содержится массив описывающий основные данные об этом товаре.
При этом механизме стоит учитывать то, что пользователь очищая поле ввода формы (удаляет ранее введенное), может таким образом отказаться от этого товара, а может быть он просто редактирует это поле, изменяя количество. Его истинные намерения не могут быть известны вам, а потому лучше не удалять этот товар из корзины, дабы исключить опять повторный запрос к базе, достаточно не учитывать такой товар для краткой корзины и извещения на странице, что данный товар уже имеется в корзине. И только при переходе пользователя на страницу корзины, удалять такие товары из сессионного массива товаров.

Если вы сейчас зациклитесь на массиве (хотя вам обязательно нужно понять как это работает), то в дальнейшем, вы скорее всего напишите корзину, которая никак не будет отвечать характеру торговли вашего магазина. Корзина, это всего лишь инструмент, а каким он должен быть определяют и какие у вас товары, каким образом их лучше выбирать, и так далее, и тому подобное. Вы уже сейчас должны об этом думать.

  Ответить  
 
 автор: Dmitry1988   (04.03.2010 в 14:03)   письмо автору
 
   для: sim5   (04.03.2010 в 13:11)
 

все я передал данные, разобрался наконецтаки :-)))) я просто написал вот так:

<?php
if(isset($_POST['add'])){
worksCart($_POST['prod']);
}
?>

он и кол-во и id переносит, только почему-то удаляется то, что было перед этим товаром, и выписывается только этот, но это я сейчас еще напрягу мозги-)

  Ответить  
 
 автор: Dmitry1988   (04.03.2010 в 13:41)   письмо автору
 
   для: sim5   (04.03.2010 в 13:11)
 

Пытаюсь понять) Можно еще вопрос по массивам?) Я когда из формы передаю данные $_POSTом (я уже убрал $_GET параметр), это передается массив да?

  Ответить  
 
 автор: sim5   (04.03.2010 в 13:11)   письмо автору
 
   для: Dmitry1988   (04.03.2010 в 13:04)
 

Значит вы не понимаете сути, самой простой - что такое массив и с чем его едят. ;-)

  Ответить  
 
 автор: Dmitry1988   (04.03.2010 в 13:04)   письмо автору
 
   для: sim5   (04.03.2010 в 12:40)
 

поле с автоинкрементом есть, я просто думал, что если все эти уникальные номера(id) вставить в массив, чтобы у каждого был свой номер т.е.(0,1,2,3....), то они бы передавались на страницу корзинки правильно. Это я к тому то что у меня у всех товаров передается одно и то id на страницу корзинки. Буду думать дальше...

  Ответить  

Сообщения:  [1-10]    [11-20]   [21-30]   [31-40]   [41-50]   [51-60]  ...    [61-61] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования