|
|
|
| При первом вызове функции все присваивается нормально, когда $b = 5
$_SESSION['order'][$b]['quantity'] = $_POST['quantity'];
|
А при втором когда $b = 65 выходит ошибка Cannot use string offset as an array in
Как понял в первом случае строка слева с сессией считаеся массивом, а во втором строкой, что делать? | |
|
|
|
|
|
|
|
для: Артем125
(18.07.2009 в 20:50)
| | print_r($_SESSION['order'][$b65]);
перед присваиванием. | |
|
|
|
|
|
|
|
для: Trianon
(18.07.2009 в 20:54)
| | выводит пустую строку
$b=65
Fatal error: Cannot use string offset as an array in Z:\xxx.php on line
А вот эту строку $b=65 в ответ на мой запрос
Если написать print_r($_SESSION['order'][$b]); то выводит 1
Если написать print_r($_SESSION); то выводит кучу всего
Array ( [captcha_keystring] => e9n29 [user] => ............. ) [order] => 1 ) | |
|
|
|
|
|
|
|
для: Артем125
(18.07.2009 в 21:16)
| | итак $_SESSION['order'] = 1
B как в таком случае понимать это Ваше 1[65] = ... ?
И долго ли мы будем тормозить?
Если никак не получается понять, вот Вам абсолютно истинное утверждение.
В php, как и в прочих С-подобных языках, нет многомерных массивов. Никогда не было, нет и не будет.
Есть только одномерные, значениями которых могут быть другие (тоже одномерные) массивы. И так далее.
Что бы ни писали по этому поводу различные руководства и учебники. | |
|
|
|
|
|
|
|
для: Trianon
(18.07.2009 в 21:22)
| | Получается для инициализации псевдомногомерных массивов необходимо использовать вложенные конструкции array()? http://softtime.ru/bookphp/gl4_3.php
Получается, массив $_SESSION у нас уже есть, остается создать еще подмассив и подподмасиив
как-нибудь так:
$_SESSION['order']['b'] = array();
и
$_SESSION['order']['b']['quantity'] = array();
|
И после этого их можно заполнять, я прав? | |
|
|
|
|
|
|
|
для: Артем125
(18.07.2009 в 21:47)
| | первая строка да.
а вторая - только если Вы хотите открыть четвертое измерение.
Скажем так. Если элемента нет, то можно и как раньше. Хотя лучше именно так.
Но еесли элемент есть, но массивом не является, то создать массив нужно обязательно. | |
|
|
|
|
|
|
|
для: Артем125
(18.07.2009 в 21:47)
| | $_SESSION['order']['b']['quantity'] - надо полагать количество товара. Как оно может быть массивом? | |
|
|
|
|
|
|
|
для: sim5
(19.07.2009 в 06:24)
| | может
$_SESSION['order'][1']['quantity'] = 5
$_SESSION['order'][2']['quantity'] = 53
$_SESSION['order'][3']['quantity'] = 54
|
а остановился на этом выборе, и отлично работает
// Если еще нет не одного заказа, то создание массива для хранения заказов
if (!isset($_SESSION['order'])) $_SESSION['order']['body_id'] = array();
потом заполнение
foreach($_SESSION['order'] as $key => $type){....}
|
| |
|
|
|
|
|
|
|
для: Артем125
(19.07.2009 в 11:41)
| | Если вы храните в корзине (а хранение товаров в сессии это пока корзина) только количество товаров, то достаточно и:
$_SESSION['order'][ID товара'] = количество.
Если же вы еще в эту корзину передаете и цену за единицу товара (через форму), тогда еще оправдано будет:
$_SESSION['order'][ID товара]['quantity'] = количество
$_SESSION['order'][ID товара]['mony'] = цена | |
|
|
|
|
|
|
|
для: sim5
(19.07.2009 в 12:32)
| | Да, Вы совершенно правы, я так и сделал ($_SESSION['order'][ID товара'] = количество), просто не уточнил. Спасибо | |
|
|
|
|
|
|
|
для: Артем125
(19.07.2009 в 12:34)
| | >if (!isset($_SESSION['order'])) $_SESSION['order']['body_id'] = array();
if (!isset($_SESSION['order'])) $_SESSION['order'] = array(); | |
|
|
|
|
|
|
|
для: sim5
(19.07.2009 в 12:36)
| | Вот и поэтому, наверно у меня щас и появилась небольшая проблема, в корзине есть кнопочки для удаления $_SESSION['order']['body_id'] , где body_id передаются POSTом, так вот, когда все удаляется остается вот этот остаток [order] => Array ( ), если набрать print_r($_SESSION);
а как быть с тем, когда зарегестрироавнный пользователь уходит, ничего не покупает, необходимо удалить сессию $_SESSION['order'] , ведь $_SESSION просто не удалить, там много других переменных | |
|
|
|
|
|
|
|
для: Артем125
(19.07.2009 в 12:41)
| | Вы сперва объясните, что вот этим вы хотели добиться (из темы о сессии):
foreach($_SESSION['order'] as $key => $type) {
foreach($type as $_SESSION['order']) {
У вас неверно либо само представление формы с товаром/товарами, либо вы неверно понимаете массивы - добавление и извлечение из них данных.
PS. Сессия будет удалена сборщиком мусора, вам что об этом беспокоится? | |
|
|
|
|
|
|
|
для: sim5
(19.07.2009 в 12:45)
| | По мере освоения приемов программирования изменяются принципы реализации, поэтому такой и разнос в топике. А задача такая(тоже переосмыслялась) - есть группа таблиц с разным товаром, в каждой таблице свой артикул. За одну сессию пользователь может набрать разных артикулов. Необходимо в конкретный артикул заносить количество товара. Поэтому необходим только лишь один массив с артикулами, и каждому артиклу соответствует количество товара. Поэтому тут подойдет вообще одномерный массив | |
|
|
|
|
|
|
|
для: Артем125
(19.07.2009 в 12:53)
| | В общем артикул, это просто уникальный id товара. Если ваша форма выбора товаров имеет вид типа:
<input type="text" name="good[125]" value="3">
<input type="text" name="good[748]" value="12">
то проблем добавления количества товара под ключом его уникального id не будет. Вот только так как вы привели:
foreach($array as $key=>$type)
товар в корзину не добавляют. Это немного сложнее процедура.
Товары в сессии, это корзина, именно корзина, а не заказ. Заказом она станет только тогда, когда покупатель нажмет "Оформить зказ", и не важно зарегистрированный он у вас или это одноразовый покупатель. Разница только в том, что зарегистрированному можно не вводить постоянно свой адорес и т.п., а разовому покупателю нужно. Если не произойдет оформления заказа, то корзина просто "умрет" вместе с сессией.
PS. >необходим только лишь один массив с артикулами, и каждому артиклу соответствует количество товара. Поэтому тут подойдет вообще одномерный массив
Это смотря о какой корзине речь и как редактировать ее. | |
|
|
|
|
|
|
|
для: sim5
(19.07.2009 в 13:01)
| | Спасибо, я так и задумал, окончательный код опубликую чуть позже, а есть ли средство удаления из массива $_SESSION неизвестно какой записи, если известны все остальные переменные. Вот например, осталось часть $_SESSION[29] = 60, например, ее надо удалить - номер 29 неизвестен, а известно, что существует $_SESSION['user'], и т.д. | |
|
|
|
|
|
|
|
для: Артем125
(19.07.2009 в 13:18)
| | Вы, видимо, так и не поняли. Вам еще в теме о "сперва набрал, а потом регистрируйся" говорили, что записывать корзину (сессию в базу) не надо, это временная корзина, а записывать товары из корзины в базу нужно только после оформления заказа.
Отсюда следует - чего удалять? У каждого пользователя своя сессия. Набрал он в нее товаров, а потом раздумал и закрыл браузер. Его сессия пропала, и у вас следов базе ее нет, ибо оформления заказа не было. И мусора нет.
Если вы наворотили бог знает чего благодаря своей "защите", и сами не знаете что за записи у вас в сессии, то я тем более не знаю, что это за записи. А потому не могу сказать вам, чего и зачем вам надо удалять.
Хранить $_SESSION['user'] в корзине смысла вообще нет. | |
|
|
|
|
|
|
|
для: sim5
(19.07.2009 в 13:28)
| | конечно, я все понял и еще из того топика, этот вопрос не связан с моей реализацией, это как бы для расширения моего инструментария, просто появилась такая не к чему особо не привязанная мысль, вот если подсказать решение к ней можно, то укажите путь, в любом случае, я все понял и очень Вам благодарен | |
|
|
|
|
|
|
|
для: Артем125
(19.07.2009 в 13:34)
| | Как я вам могу подсказать путь, если я не знаю как вы передаете выбранные товары со страницы в корзину, как вы их добавляете, удаляете? Да и вообще, корзина должна иметь два представления, динамическая, извещаюя о количестве товаров в корзине и их общей сумме, и полная корзина, с детальной информацией. Как все это у вас работает, и почему возникают "мертвые" записи, откуда же мне знать? Что я могу советовать? Только одно в таком случае - ищите ошибку в логике своей. | |
|
|
|