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

Форум PHP

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

 

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

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

тема: Проблемы с сессиями: по разному работают в IE и FF
 
 автор: kukuikar   (28.10.2008 в 12:32)   письмо автору
 
 

Вот код обработки добавления в корзину:

<?php
if(isset($_POST['add2cart']))
    {
    if(!
session_is_registered("order"))
        {
        
session_register("order");
        }
    
    
$order $_SESSION["order"];
    
    
$order[] = array('plot' => $_POST['plot'], 'size' => $_POST['size'], 'color' => $_POST['colo'], 'count' => $_POST['count']);
    
    
$_SESSION['order'] = $order;
    }
?>


Вот код сохранения изменений в заказе:

<?php
if(isset($_POST['recalc']) || isset($_POST['send']))
    {
    
$order $_SESSION["order"];
    
sort($order);
    foreach(
$order as $n => $item)
        {
        
$order[$n]['color'] = $_POST["color"][$n];
        
$order[$n]['size'] = $_POST["size"][$n];
        
$order[$n]['plot'] = $_POST["plot"][$n];
        
        if(
$_POST["cnt"][$n] == 0)    
            unset(
$order[$n]);
        elseif(
is_numeric($_POST["cnt"][$n]))
            
$order[$n]['count'] = $_POST["cnt"][$n];
        else
            
$order[$n]['count'] = 1;
        }
    
$_SESSION['order'] = $order;
    }
?>


Проблема в следующем:

В FF все работает как надо, а вот в IE не так как надо. А именно:
1. При добавлении в заказ последующий пункт перезаписывает предыдущий. Т.е. сколько бы я не добавлял в заказ пунктов, там остается только последний.
2. При пересчете содержимого корзины PHP ругается на строку
sort($order);
. Вот ругань:
Warning: sort() expects parameter 1 to be array, null given in Z:\home\tex_new\www\cart.php on line ##
Warning: Invalid argument supplied for foreach() in Z:\home\tex_new\www\cart.php on line ##


Т.е. пусто. $_SESSION['order'] равно пусто! Почему сломал голову.

session_start() присутствует.

И убивает то, что в FF все работает как надо, добавляется множество пунктов, и при пересчете заказа все считается корректно...

  Ответить  
 
 автор: sim5   (28.10.2008 в 12:46)   письмо автору
 
   для: kukuikar   (28.10.2008 в 12:32)
 

При чем тут браузеры? В первом коде уже если проверять, то:
<?
if(isset($_POST['add2cart'])) { 
  if(!isset(
$_SESSION["order"])) {
    
$_SESSION["order"] = array();
    
$order $_SESSION["order"]; 
    
$order['plot'] = $_POST['plot'];
    
$order['size'] = $_POST['size'];
    
$order['color'] = $_POST['colo'];
    
$order['count'] = $_POST['count']);
  }
}

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

  Ответить  
 
 автор: kukuikar   (28.10.2008 в 12:57)   письмо автору
 
   для: sim5   (28.10.2008 в 12:46)
 

у меня все так и происходит...

и у вас будет если сделать так:


<?php
if(isset($_POST['add2cart'])) { 
  if(!isset(
$_SESSION["order"])) {
    
$_SESSION["order"] = array();
    
$order $_SESSION["order"]; 
    }
    
$order['plot'] = $_POST['plot'];
    
$order['size'] = $_POST['size'];
    
$order['color'] = $_POST['colo'];
    
$order['count'] = $_POST['count']);
}
?>

только проблема не в пересчете, а в том что $_SESSION['order'] пустой. И почему он пуст в одном браузере и не пуст в другом ?

  Ответить  
 
 автор: sim5   (28.10.2008 в 13:08)   письмо автору
 
   для: kukuikar   (28.10.2008 в 12:57)
 

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

  Ответить  
 
 автор: kukuikar   (28.10.2008 в 14:30)   письмо автору
 
   для: sim5   (28.10.2008 в 13:08)
 

<?php
if(isset($_POST['add2cart']))
    {    
    
$order = (isset($_SESSION["order"]) && is_array($_SESSION["order"])) ? $_SESSION["order"] : array();//тут проверяется есть ли массив, а если нету создать. 
    
$order[] = array('plot' => $_POST['plot'], 'size' => $_POST['size'], 'color' => $_POST['color'], 'count' => $_POST['count']);//тут записываем данные поста
    
    
$_SESSION['order'] = $order;
    }
?>



Только ничего не меняется.....

  Ответить  
 
 автор: sim5   (28.10.2008 в 14:34)   письмо автору
 
   для: kukuikar   (28.10.2008 в 14:30)
 

Товар добавляется по одному или произвольное число? Что означают $_POST['size'], $_POST['plot'] и $_POST['color'] ?

  Ответить  
 
 автор: kukuikar   (28.10.2008 в 15:33)   письмо автору
 
   для: sim5   (28.10.2008 в 14:34)
 


<form action="./cart.php" method="post">
Футболка<br />
Цвет: белый<br />
Плотность: 160-170<br />
Размер: 
    <select name="size" class="">
    <option value="M - (46-48)">M - (46-48)</option>
    <option value="L - (50-52)">L - (50-52)</option>
    <option value="XL - (54-56)">XL - (54-56)</option>
    <option value="XXL - (56-58)">XXL - (56-58)</option>
    </select>
    <input name="count" value="" type="text">
    <input name="color" value="Белый" type="hidden">
    <input name="plot" value="160-170" type="hidden">
    <input value="Добавить" name="add2cart" type="submit">
</form>


добавляется количество из поля count

  Ответить  
 
 автор: sim5   (28.10.2008 в 16:00)   письмо автору
 
   для: kukuikar   (28.10.2008 в 15:33)
 

Главное о товаре, что необходимо держать в корзине, это id товара и его количество. ID товара, это уникальный номер, а коли у вас есть список его характеристик, то эти характристики как-то должны быть связаны с товаром по его номеру. От сюда следует, что, если держать в корзине характеристики товаров, то лучше держать не их описание, а уникальные номера этих характеристик - все остальное получать из базы при выводе корзины пользователю.
В свою очередь, корзина должна иметь два представления - динамическая с кратким содержанием (количество товаров в корзине и их обшая цена) и корзина с полным описанием выбранных товаров, в которой можно произвести изменения (добавление, удаление и т.п..).
У вас же в форме и близко нет упоминания на номер товара - как же вы их храните в базе?

Свяжите характеристики товара с id товара, так чтобы товары, его характеристики при получении формы были массивом, ключами которого служили бы номера товаров. Если опираться на естественное (на id товара), то вот пример работы корзины (характеристики и любые другие дополнения, добавлять так, как сказано выше):

<?
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']); //удаление корзины
}

//имеющиеся товары
$goods = array(
  
79  => array('name'=>'Топор','mony'=>120),
  
102 => array('name'=>'Молоток','mony'=>60),
  
89  => array('name'=>'Стаместка','mony'=>35),
  
211 => array('name'=>'Ножовка','mony'=>86)
);

session_start();

//добавление одиночного товара
if (isset($_GET['add'])) worksCart($_GET['add']);
//добавление массива товаров, например,
//с одной страницы группы выбранных
//и обновление корзины (редактирование)
if (isset($_POST['update'])) worksCart($_POST['prod']);
//удаление корзины
if (isset($_POST['clear'])) worksCart(0);


foreach(
$goods as $id => $val) {
  echo 
$val['name'] . ", цена: " .$val['mony']. " руб. <a href=\"?add=" .$id"\">Добавить в корзину</a><br>";
}

echo 
"<hr width=\"100%\" size=\"1\">";

if (!empty(
$_SESSION['cart'])) {
  echo 
"<form method=\"post\">
    <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;
  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;
  }
  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 
"Ваша корзина пуста!";
?>

  Ответить  
 
 автор: kukuikar   (28.10.2008 в 16:14)   письмо автору
 
   для: sim5   (28.10.2008 в 16:00)
 

работа без базы.

все данные о товарах в массиве, их не так много (товаров), поэтому массив статичный.

спасибо. думаю тема исчерпана. по крайней мере для меня. буду чесать репу....

  Ответить  
 
 автор: sim5   (28.10.2008 в 16:24)   письмо автору
 
   для: kukuikar   (28.10.2008 в 16:14)
 

Без базы это плохо. Но даже, если товары в файле, а уж тем более описаны массивом, то и ориентируйтесь по индексу массива - пусть это и будет ID товара, ну и далее все привязывать к нему. Это облегчит все.

  Ответить  
 
 автор: kukuikar   (28.10.2008 в 16:49)   письмо автору
 
   для: sim5   (28.10.2008 в 16:24)
 

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

может я и не прав...

  Ответить  
 
 автор: sim5   (28.10.2008 в 17:17)   письмо автору
 
   для: kukuikar   (28.10.2008 в 16:49)
 

Нет, почему же. Если товаров всего с десток, не предполагается их добавление и т.п., то вполне хватит и статического массива, и вполне можно использовать характеристики как значание опшенов. Только свяжите список характеристик в форме по номеру товара (по индексу в массиве), и будет достаточно.
Но, если база товаров будет расти, то...

  Ответить  
 
 автор: kukuikar   (28.10.2008 в 21:06)   письмо автору
 
   для: sim5   (28.10.2008 в 17:17)
 

>Но, если база товаров будет расти, то...

эт ясно.... :)

  Ответить  
 
 автор: Bvz   (06.04.2010 в 10:14)   письмо автору
 
   для: sim5   (28.10.2008 в 16:00)
 

но у вас тут не реализована возможность перехода на страницу оформления заказа и невозможно со страницы заказа положить в корзину более 1 предмета, а как это можно сделать?

  Ответить  
 
 автор: Trianon   (28.10.2008 в 12:47)   письмо автору
 
   для: kukuikar   (28.10.2008 в 12:32)
 

Вот это вот дерьсырьё уберите.
if(!session_is_registered("order"))
{
session_register("order");
}

$order = $_SESSION["order"];
И напишите вместо него:
 $order = (isset($_SESSION["order"]) && is_array($_SESSION["order"])) 
        ? $_SESSION["order"] 
        : array();

  Ответить  
 
 автор: kukuikar   (28.10.2008 в 12:59)   письмо автору
 
   для: Trianon   (28.10.2008 в 12:47)
 

жестко, только это не поможет

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

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