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

Форум PHP

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

 

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

вид форума:
Линейный форум Структурный форум

тема: логика корзинки
 
 автор: Dmitry1988   (27.02.2010 в 14:22)   письмо автору
 
 

Здравствуйте, я извиняюсь, что создаю еще одну подобную тему, но посмотрев все уже существуюшие, я не нашел ответа на свой вопрос(может просто не понял, что это тоже самое).

Вопрос такой, я пишу небольшой магазин, вот дошел до корзинки, проблема в том, что я не понимаю как передать сессии несколько 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 одного товара в сессию и вывожу на экран.

Спасибо большое за помощь

  Ответить  
 
 автор: sim5   (27.02.2010 в 14:30)   письмо автору
 
   для: Dmitry1988   (27.02.2010 в 14:22)
 

А причем тут сессия, если у вас корзина в базе?

  Ответить  
 
 автор: Dmitry1988   (27.02.2010 в 14:42)   письмо автору
 
   для: sim5   (27.02.2010 в 14:30)
 

объясните ,пожалуйста, как тогда ее делать, я просто никогда еще корзину не делал. Я главное не могу понять как и где сохранять несоклько id товаров, чтобы он их запомнил и если ты ушел со страницы корзины, то они гдето были сохранены. Спасибо

  Ответить  
 
 автор: sim5   (27.02.2010 в 15:11)   письмо автору
 
   для: Dmitry1988   (27.02.2010 в 14:42)
 

Что объяснить? Я к тому, что вы постоянно задаете вопрос "как передать несколько id в сессию", но при этом вообще не используете ее для этого.
Сделайте запросы на поиск: "пример корзины на mysql" и "пример корзины на сессии", и получите не мало примеров конкретного кода, да, думаю, и описания работы.
Но прежде ответьте себе же - что значит покинул, а корзина сохранилась? Если это не покупатель вовсе, а случайный посетитель, то стоит ли сохранять? А если сохраняете, то значит нужно как-то очищать такой мусор, в случае корзины на mysql. Если же она на сессии, то об этом можно не беспокоится.
Корзина это комплексный подход, который определяется условиями вашей торговли - способ выбора товаров, возможность отложенной покупки, оформление покупки, бонусы, скидки и т.п.. А уж из этого делать выбор между тем или иным механизмом организации корзины, как удобнее организовать ее работу.

  Ответить  
 
 автор: Dmitry1988   (27.02.2010 в 19:31)   письмо автору
 
   для: sim5   (27.02.2010 в 15:11)
 

Спасибо большое нашел коекакие интерессные темы, буду пробовать с сессиями делать

  Ответить  
 
 автор: Dmitry1988   (01.03.2010 в 12:31)   письмо автору
 
   для: 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   (27.02.2010 в 15:11)
 

Здравствуйте еще раз, просмотрел я много тем, остановился на Вашем коде вот в этом посте http://softtime.ru/forum/read.php?id_forum=1&id_theme=59376&page=3, там вы делаете корзинку с передачей данных с помощью массива. Так как у меня все данные хранятся в ДБ, я попытался сделать так, чтобы при добавлении товара на страницу например (products.php), все данные из ДБ считались в массив, но возникла проблема в том что я не знаю как передать этот массив на страницу корзинки. Посоветуйте пожалуйсто как это сделать. Спасибо

  Ответить  
 
 автор: sim5   (01.03.2010 в 14:16)   письмо автору
 
   для: Dmitry1988   (01.03.2010 в 13:43)
 

Я не понимал о чем вы спрашиваете:
как вывести список товаров на страницу пользователю?
или
как добавить выбранные пользователем товары в корзину (массив выбранных товаров)?

  Ответить  
 
 автор: Dmitry1988   (01.03.2010 в 14:29)   письмо автору
 
   для: sim5   (01.03.2010 в 14:16)
 

второе, как выбрать выбранные пользователем товары в корзину, т.е. как перенести массив со страницы товаров например products.php на страницу корзинки korzinka.php

  Ответить  
 
 автор: sim5   (01.03.2010 в 15:06)   письмо автору
 
   для: 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>

Этот случай рассмотрен на примере редактирования корзины пользователем.

  Ответить  
 
 автор: Dmitry1988   (01.03.2010 в 19:46)   письмо автору
 
   для: 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&#382;i se p&#345;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
  }
?>

Подскажите как туда передать данные. Еще раз извиняюсь за тупость(

  Ответить  
 
 автор: sim5   (01.03.2010 в 20:06)   письмо автору
 
   для: Dmitry1988   (01.03.2010 в 19:46)
 

Данные (массив товаров принятый от формы) передается не в вывод крзины на страницу, а функции worksCart() - она помещает в корзину (массив в сессии) товары. А этот цикл просто выводит массив товаров находящийся в сесси на страницу. При оформлении заказа, товары корзины записываются в таблицу заказов.

  Ответить  
 
 автор: Dmitry1988   (01.03.2010 в 20:28)   письмо автору
 
   для: 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>';
?>

  Ответить  
 
 автор: sim5   (01.03.2010 в 21:00)   письмо автору
 
   для: Dmitry1988   (01.03.2010 в 20:28)
 

Не срабатывает эта функция сама по себе, а при получении формы, массив описывающий выбранные товары, передается фукнции этой. Там же написаны примеры ее вызова.

  Ответить  
 
 автор: Dmitry1988   (01.03.2010 в 21:36)   письмо автору
 
   для: 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']); //на странице корзинки он через эту строчку вызывает функцию
?>

  Ответить  
 
 автор: sim5   (02.03.2010 в 07:05)   письмо автору
 
   для: Dmitry1988   (01.03.2010 в 20:28)
 

Зачем передавать ID товара методом GET, в url скрипту обработчику? Для того, чтобы знать, что вам отправили форму? Так для этого достаточно проверить кнопку SUBMIT, она у вас имеет имя, а значит будут передана на сервер - $_POST['add'].
Спрашивая, как передать массив выбранных пользователем товаров, вы, надо полагать, понимаете, что это не один товар - не один на странице. В вашем примере один.

Представьте, что вы в реальном магазине, в котором корзины стоят на приколе у кассы, и вы вынуждены бегать от полок с товарами к корзине, принося по одному товару в нее. Не удобно, утомительно. В интернет-магазине, это будет способом выбора по одному товару.
Если в этом магазине вам будет разрешено брать уже по несколько различных товаров, и каждого из них в любом количестве, но при этом корзина так и останется на приколе у кассы, то это не принесет вам облегчения, а наоборот будет еще более обременительным.

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

Если у вас покупатель запрашивает, например, категорию "Конфеты", а у вас их сто наименований, то вы будете выводить их на страницу порциями по 10, 15, 20 наименований (эта таже самая постраничная навигация), выводя краткое описание товаров, их фото и т.п.. И все эти товары имеют поля ввода (элементы формы, одной формы). При каждом вводе пользователем некоего количества выбранного им товара, он должен видеть сколько товаров у него в корзине в данный момент и на какую сумму. То есть, ваша корзина должна еще иметь краткое свое представление, чисто информативное (хотя добавление товаров происходит именно в корзину). При этом пользователю не требуется нажимать кнопку "Добавить в корзину". Такой динамический способ добавления товаров в корзину поможет осуществить механизм Ajax. Выбрав товары на этой странице, пользователь может перейти на другую, где таким же образом может добавлять товары - вы опять будуте сообщать ему кратко о количестве их и сумме. При этом, если пользователь перейдет на предыдущую страницу, то форма должна показывать уже выбранные пользователем товары (те, что есть в корзине у него). Пользователь может перейти на страницу и подробного описания товара, на которой тоже может добавить товар в корзину.

А вот просмотреть подробную информацию о своей корзине он сможет по некой ссылке, или кнопке в кратком описании корзины. Здесь уже он может отредактировать свою корзину, либо вообще удалить все товары из нее, перейти по ссылкам на страницу товара и т.п.. Вот это будет удобно для покупателя.

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

  Ответить  
 
 автор: Dmitry1988   (02.03.2010 в 12:05)   письмо автору
 
   для: sim5   (02.03.2010 в 07:05)
 

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

  Ответить  
 
 автор: sim5   (02.03.2010 в 12:34)   письмо автору
 
   для: Dmitry1988   (02.03.2010 в 12:05)
 

Ну а что тут сложного? У вас в сессии находится массив товаров: их ID и количество. Чтобы отобразить полную инофрмацию о корзине, вам необходимо сделать запрос к базе, получив информацию о товарах лежащих в корзине (по их ID) - название товара, цена, и в цикле вывести все это, сделав необходимые расчеты о ценах.
Если корзина будет работать динамически (при каждом изменении пользователем значений в поле ввода), то для того, чтобы не дергать постоянно базу данных, можно получать эту информацию о товарах только для тех товаров, которых нет в корзине, помещая ее в сессионный массив товаров корзины, а выводя корзину пользователю, всю информацию о ней брать уже из сессии.

  Ответить  
 
 автор: Dmitry1988   (02.03.2010 в 14:30)   письмо автору
 
   для: 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;
?>

но при выполнение этого запроса $id равно ничему

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

  Ответить  
 
 автор: Dmitry1988   (02.03.2010 в 15:24)   письмо автору
 
   для: sim5   (02.03.2010 в 14:49)
 

Нет, сессия везде прописана, пока что о проблеме получения id! А можно както посмотреть что у меня находиться в сессионном массиве? Потомучто когда я выписываю просто $_SESSION['cart'] то он пишет просто array. А для получения всех id есть какаято функция или их например через foreach выбрать все?

  Ответить  
 
 автор: sim5   (02.03.2010 в 15:42)   письмо автору
 
   для: Dmitry1988   (02.03.2010 в 15:24)
 


<pre>
<?
print_r
($_SESSION['cart']);
?>
</pre>

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

Вот что пишет, все нормально передается:

<?php
Array
(
    [
14] => 8
    
[13] => 10
    
[12] => 2
)
?>

значит я опять что то не так делал при выборе $id в запрос, а как выбрать id и кол-во из сессионного массива?

  Ответить  
 
 автор: sim5   (02.03.2010 в 16:17)   письмо автору
 
   для: Dmitry1988   (02.03.2010 в 16:05)
 

Ну для начала можете пробежать по массиву и функцией foreach (хотя это конечно не единственное и не лучшее решение), получить список ключей массива (id-товаров). Далее испольуя оператор IN в запросе к базе получить информацию об этих товарах.

  Ответить  
 
 автор: Dmitry1988   (02.03.2010 в 17:51)   письмо автору
 
   для: 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 в строке браузера тот товар он и выводит...

  Ответить  
 
 автор: sim5   (02.03.2010 в 17:54)   письмо автору
 
   для: Dmitry1988   (02.03.2010 в 17:51)
 

А как вы думаете почему толькой последний, вернее почему именно последний?

  Ответить  
 
 автор: Dmitry1988   (02.03.2010 в 18:02)   письмо автору
 
   для: sim5   (02.03.2010 в 17:54)
 

я уже понял потомучто он выберает id из массива, а как ему правильно сказать чтобы он выбрл все id?

  Ответить  
 
 автор: sim5   (02.03.2010 в 18:12)   письмо автору
 
   для: Dmitry1988   (02.03.2010 в 18:02)
 

Я писал - получить список ключей массива как: 12,23,45,67 .... и т.д., и это использовать в ОДНОМ ЕДИНСТВЕННОМ запросе к базе - IN(переменная содержащая этот список).
Вы же в цикле гоняете запросы к базе, при этом использование IN просто бессмысленно.
В раздел MySQL, смотреть примеры запросов, их обработку, изучать....

  Ответить  
 
 автор: Dmitry1988   (02.03.2010 в 20:03)   письмо автору
 
   для: sim5   (02.03.2010 в 18:12)
 

можно еще такой вопрос..с помощью какой функции разделить полученные id запятыми, я все никак найти не могу..

  Ответить  
 
 автор: sim5   (02.03.2010 в 20:17)   письмо автору
 
   для: Dmitry1988   (02.03.2010 в 20:03)
 

Ну если прогонять массив в цикле, то просто добавляя при проходе к полученному ключу запятую:
$key . ",";
Но я вам уже говорил, что прогонять массив циклом и таким образом получить список ключей, не единственный и лучший способ. Нужно заглядывать в мануал, смотреть функции, а их предостаточно. Можно получить вам нужное одной строкой кода, если использовать функции
implode и array_keys. Прочтите о них и попробуйте сами это сделать.

  Ответить  
 
 автор: Trianon   (02.03.2010 в 22:08)   письмо автору
 
   для: sim5   (02.03.2010 в 20:17)
 

implode, array_keys, array_map/walk и intval как минимум.

  Ответить  
 
 автор: sim5   (03.03.2010 в 04:22)   письмо автору
 
   для: Trianon   (02.03.2010 в 22:08)
 

При получении формы уже обработано intval.

  Ответить  
 
 автор: Trianon   (03.03.2010 в 08:59)   письмо автору
 
   для: sim5   (03.03.2010 в 04:22)
 

при получении формы в этом нужда невелика, а при формировании тела SQL-запроса - огромна.

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

  Ответить  
 
 автор: sim5   (03.03.2010 в 09:18)   письмо автору
 
   для: Trianon   (03.03.2010 в 08:59)
 

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

  Ответить  
 
 автор: Dmitry1988   (03.03.2010 в 13:22)   письмо автору
 
   для: 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 прочитал про него, вроде данные передаются правильно

  Ответить  
 
 автор: sim5   (03.03.2010 в 13:34)   письмо автору
 
   для: 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)"); - а это что такое?

  Ответить  
 
 автор: Dmitry1988   (03.03.2010 в 13:38)   письмо автору
 
   для: sim5   (03.03.2010 в 13:34)
 

запрос, извиняюсь забыл print поменять на mysql_query, я просто смотрел чего он видит в запросе

  Ответить  
 
 автор: sim5   (03.03.2010 в 13:48)   письмо автору
 
   для: Dmitry1988   (03.03.2010 в 13:38)
 

Запрос вам вернет ресурс (если конечно в базе будут обнаружены записи для требуемых id), получайте из него данные. Вы запрос для чего делали - для вывода корзины, значит в ЦИКЛЕ обрабатывающем полученный ресурс, вы должны по id из ресурса находить количество этого товара в массиве $_SESSION['cart'], умножать на это количество полученную цену за единицу товара, одновременно подсчитывая общую сумму покупки. В примере корзины (которую вы и изучаете, таковое есть, с разницей лишь в том, что там вместо таблицы в базе, используется массив товаров, имитирующий базу).
Вот у вас и получится вывод корзины.

  Ответить  
 
 автор: Dmitry1988   (03.03.2010 в 14:43)   письмо автору
 
   для: 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&#225;zev</b>:&nbsp;'.$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...

  Ответить  
 
 автор: sim5   (03.03.2010 в 14:55)   письмо автору
 
   для: Dmitry1988   (03.03.2010 в 14:43)
 

Я вам уже указывал на эту хрень:
kosik1.php?add='.$r_blue['id'].'"
и вы все равно упорно ее туда пишите. Зачем?

mysql_fetch_array, и использовать mysql_fetch_assoc.

Одинаковы потому, что вы где-то не верно массив обрабатываете. Проверьте, что вы получаете, проследите как обрабатываете его далее. Посмотрите исходный код (HTML) страницы с формой.

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

я просто не понимаю как я передам данные на страницу корзинки без этой строчки...
Посмотрел html код и как ни странно он в нем пишет правильные id т.е. везде разные

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

Данные на страницу передает не GET-переменная add, которую вы боитесь потерять, а форма методом POST.
Проверяйте почему у вас добавляется только один товар - вы что-то не верно делаете.

  Ответить  
 
 автор: Dmitry1988   (03.03.2010 в 15:49)   письмо автору
 
   для: sim5   (03.03.2010 в 15:27)
 

удалил я $_GET параметр, оставил только ссылку на корзинку, теперь при передаче данных ничего не происходит...я написал чтобы он выписал мне массив, но массив пустой..
Как вы думаете где искать ошибку на странице товаров или на странице корзинки?

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

Вы просто не проанализировали как следует работу скрипта моего примера. В нем:
1. GET-переменная add дает знать скрипту обработчику, что добавляется одиночный товар (определяется ссылкой). Вам она совсем не нужна.
2. POST-переменной update определяется, что скрипту передан массив. И хотя он не со страницы с товарами пришел, а во время редактирования корзины пользователем, суть от этого не меняется. Можно и просто проверять - пришел или нет POST массив prod.
3. POST-переменная del - сообщает об удалении выбранного товара
4. POST-переменная clear - сообщает, что пользователь удаляет корзину.

Вы что-то не так делаете, а что, мне трудно сказать.

  Ответить  
 
 автор: Dmitry1988   (04.03.2010 в 12:18)   письмо автору
 
   для: sim5   (03.03.2010 в 16:02)
 

я понял почему он так делает, я выписал массивом все id и оказалось, что я ведь когда выписываю данные из БД то порядковый номер у каждого id равен 0, т.е. при добавление в корзину у каждого id один и тот же номер в массиве, поэтому он добавлял в нее только первое значение!
Подскажите пожалуйсто как можно записать сначало все id из запроса, чтобы они стояли в массиве каждый под своим номером. Если просто сказать, что id(из запроса) является массивом, то он выпишет только одно значение.. Спасибо

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

Каждый товар должен иметь уникальный номер, а не номер порядковый. Такую уникальность вам обеспечит поле с автоинкрементом, вот это и будет id товара. И этот номер никак не может быть массивом, это массив может содержать такие номера. А как они в массиве располагаются (по ранжиру) роли никакой не играет. ID товаров в этом массиве служат ключами, а под этими ключами могут содеражтся также массивы, например, количество товара, его название, цена...
Вы либо так и не поняли сути всего, либо что-то не так делаете.

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

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

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

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

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

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

  Ответить  
 
 автор: 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 в 15:51)   письмо автору
 
   для: sim5   (04.03.2010 в 14:19)
 

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

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

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

  Ответить  
 
 автор: 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 в 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 в 21:53)   письмо автору
 
   для: sim5   (04.03.2010 в 20:08)
 

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

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

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

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

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

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

  Ответить  
 
 автор: Dmitry1988   (01.03.2010 в 13:44)   письмо автору
 
   для: sim5   (27.02.2010 в 15:11)
 

простите за 2 сообщения

  Ответить  
 
 автор: Ури Геллер   (01.03.2010 в 18:44)   письмо автору
 
   для: Dmitry1988   (27.02.2010 в 14:22)
 

в сессии необходимо хранить сериализованный массив, то есть его строковое представление

  Ответить  
 
 автор: Ури Геллер   (01.03.2010 в 18:49)   письмо автору
 
   для: Ури Геллер   (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);

?>



Если есть желание меня отблагодарить могу дать номер кошелька.

  Ответить  
 
 автор: Loki   (01.03.2010 в 19:44)   письмо автору
 
   для: Ури Геллер   (01.03.2010 в 18:49)
 

<?
$s 
serialize($array); 
$_SESSION["x"] = $s

>Если есть желание меня отблагодарить могу дать номер кошелька.
За подобное с Вас деньги надо брать....

  Ответить  
 
 автор: sim5   (01.03.2010 в 19:11)   письмо автору
 
   для: Ури Геллер   (01.03.2010 в 18:44)
 

Зачем?

  Ответить  
Rambler's Top100
вверх

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