05.04.2014 PHP сортировка массива по значению - array_multisort 02.04.2014 Ошибка php undefined symbol php_json_encode 22.07.2013 Как открыть Excel файл с помощью PHP 29.02.2012 Как проверить пустой массив или нет? 29.02.2012 JQUERY: как вести логи действий пользователя 29.02.2012 PHP: Как через POST передать множественный SELECT 09.04.2011 Работа корзины 22.03.2011 Filter_var или проверка email, url, ip на соответсвие без использования регулярных выражений
#91

Работа корзины

Одна из возможных реализаций корзины на PHP.

Корзина состоит из трех составляющих. Это каталог - папка include - файл catalog.php Корзины - korzina.php в этой же папке. И часть корзины отображается в файле index.php, что отображается вверху сайта (все тоже самое как и при выводе корзины, за исключением того, что данных меньше из базы берется для обработки).
Разберем часть корзины в catalog.php
Каталог формируется посредством цикла, к базе идет запрос на выборку и через цикл выводятся данные.
Внутри цикла, каждый раз как он срабатывает, формируется кнопка "добавить в корзину". Она представляет из себя форму:

  1. <form  action="'.$_SERVER['REQUEST_URI'].'" method="POST" enctype="multipart/form-data">
  2. <input type="hidden" name="tid" value="'.$r['id'].'">
  3. <input type="hidden" name="kol" value="1">
  4. <input type="submit" name="korzina" value="Добавить в корзину">
  5. </form>'

Поле input с именем tid - это id товара, которое берется из бд.
Поле kol - количество равное 1му, т.к. у нас не предусматривается добавление одного и того же модуля в нескольких экземплярах.
Оба поля скрыты поэтому поменять эти данные напрямую нельзя.

 Когда нажимается кнопка "добавить в корзину" то рабатывает скрипт:

  1. // Если значение korzina передается через метод пост
  2. if ($_POST['korzina']) {
  3.     // Если существует tid - id товара
  4.     if (isset($_POST['tid'])) { 
  5. 	// Если не существует сессия goods, создаем сессию goods, которая будет массивом
  6. 	if (!isset($_SESSION['goods'])) $_SESSION['goods'] = array(); 
  7. 	//  Получаем целые значения id товара и его количество
  8. 	$id = intval($_POST['tid']); 
  9. 	$kol = intval($_POST['kol']); 
  10. 	// Если id товара больше нуля то к массиву сессии добавляем новое значение с заданным количеством
  11. 	if ($id > 0) $_SESSION['goods'][$id] = $kol; 
  12.  
  13.     }
  14.     // Через JS скрипт обновляем страницу, чтобы отобразились данные сверху
  15.     echo '<script language="JavaScript">window.location.href = "'.$_SERVER['REQUEST_URI'].'"</script>';
  16.  
  17. }

Разберем korzina.php

Следующий скрипт формирует саму корзину на странице ?action=korzina

  1. // Если action=korzina то отображать эти данные
  2. if ($_GET['action']=='korzina') { 
  3.  
  4. 	// Если запрос на удаление корзины, удаляем сессию-массив 
  5. 	if (isset($_POST['clear'])) unset($_SESSION['goods']); 
  6.  
  7. 	// Если сессия goods не пуста продолжаем
  8. 	if (!empty($_SESSION['goods'])) { 
  9.  
  10. 	  // Задаем эти значения равными нулю, чтобы далее количество товара 
  11. 	  // и общая стоимость считались нормально (на самом деле не обязательно)
  12. 	  $k = 0; 
  13. 	  $m = 0; 
  14.  
  15. 	  // Формируем таблицу для отображения корзины
  16. 	  echo '<table bgcolor=#F2F2F2 width=100%><tr>
  17. 	  <td style="padding: 10px;"><b>Модуль</b></td>
  18. 	  <td style="padding: 10px;"><b>Описание</b></td>
  19. 	  <td style="padding: 10px;"><b>Стоимость</b></td>
  20. 	  <td style="padding: 10px;"></td></tr>';
  21.  
  22. 	  // Цикл обхода массива, разбираем данные где $key это тот id и $val то количество 
  23. 	  // которые добавляются в массив при добавление товара в корзину на этапе работы с каталогом.
  24. 	  foreach($_SESSION['goods'] as $key => $val) { 
  25.  
  26. 	  // Звпрос к базе и формирование данных на основе этого запроса
  27. 	  $qat=mysql_query("SELECT * FROM catalog WHERE id='$key'");
  28. 	  $cat=mysql_fetch_array($qat);
  29.  
  30. 	      // Количество увеличивается на значение $val которое является количеством данного товара
  31. 	      $k += $val; 
  32. 	      // Общая стоимость - количество умножается на цену взятую из базы
  33. 	      $m += $cat['price']*$val; 
  34. 	      // Счетчик требуется для того чтобы каждый новый пункт рисовать другим цветов
  35. 	      $count++;
  36. 	      // Собственно делим на 2 чтобы получить четное или нечетное значение
  37. 	      if($count%2) { echo ("<tr bgcolor=#DEEFF9 valign=top>"); } else { echo ('<tr bgcolor=#F0F1F1 valign=top>'); }
  38.  
  39. 	      // Далее просто подставляем полученные значения в необходимые поля для вывода
  40. 	      // Также формируем форму с кнопкой удалить где два поля одно с количеством, другое с id товара.
  41. 	      echo '<td style="padding: 10px;">'.$cat['title'].'</td><td style="padding: 10px;">'.$cat['text'].'</td>
  42. 	      <td style="padding: 10px;">'.$cat['price'].'</td><td style="padding: 10px;">
  43. 	      <form method="post"> 
  44. 	      <input type="hidden" size=8 name="prod[' .$key. ']" value="' .$val. '">
  45. 	      <input type=hidden name="del[]" value="' .$key. '">
  46. 	      <input type=submit name="update" value="Удалить"></form>
  47. 	      </td></tr>'; 
  48.  
  49.  
  50. 	  } 
  51. 	  // Цикл заканчивается и выводим общие данные и заканчиваем формирование таблицы
  52. 	  echo "</table><br>
  53. 	      Вы выбрали модулей: ".$k. "<br>Общая стоимость заказа " .$m. "<br><br>
  54. 	      <form method=\"post\"> 
  55. 	      <input type=\"submit\" name=\"clear\" value=\"Очистить корзину\"> 
  56. 	      <input type=\"submit\" name=\"zakaz\" value=\"Заказать\">
  57. 	      </form>"; 
  58.  
  59.  
  60.      }
  61.      else echo '<b>Ваша корзина пуста!</b>';
  62. }
  63.  
  64. // Далее если запрос на обновление корзины
  65. if (isset($_POST['update'])) { 
  66.  
  67.     // Опять цикл обхода массива
  68.    foreach($_POST['prod'] as $key => $val) { 
  69.       // Приводим к целому значению
  70.       $key = intval($key); 
  71. 	// Если id товара больше нуля
  72. 	if ($key > 0) { 
  73. 	    // Количество приводим к целому значениею
  74. 	    $val = intval($val); 
  75. 	    // Если было передано значение del в случае удаления товара из корзины
  76. 	    // и в массиве присутствуют необходимые значения 
  77. 	    if (isset($_POST['del']) && in_array($key, $_POST['del']) || !$val) { 
  78. 	      // Если ключ в массиве существует, то удаляем из массива сессии goods, значение с ключом равном id товара
  79. 	      if (array_key_exists($key, $_SESSION['goods'])) unset($_SESSION['goods'][$key]); 
  80. 	    } 
  81. 	    // Иначе добавляем новое количество к существующему id (в нашем случае это рудимент, тк подразумевается 
  82. 	    // что в корзине можно было бы обновлять количество того или иного товара, а у нас кол-во товара 
  83. 	    // может быть только равное 1му)
  84. 	    else $_SESSION['goods'][$key] = $val; 
  85. 	} 
  86.     }
  87.     // Обновляем страницу посредством JS
  88.     echo '<script language="JavaScript">window.location.href = "'.$_SERVER['REQUEST_URI'].'"</script>';
  89. }
  90.  
  91. // Если запрос на очистку корзины
  92. if (isset($_POST['clear'])) {
  93.     // Рассформировываем сессию-массив
  94.     unset($_SESSION['goods']);
  95.     // Обновляем страницу посредством JS
  96.     echo '<script language="JavaScript">window.location.href = "'.$_SERVER['REQUEST_URI'].'"</script>';
  97. }

30.12.2010 PHP обработчик ошибок - php.ini error_reporting 17.12.2009 GDLib и php.ini, как проверить какие форматы поддерживает сервер: 22.03.2011 Засекаем время генерации страницы 22.03.2011 Как определить количество посетителей на сайте онлайн 16.12.2009 О картинках средствами PHP
О сайте