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

Форум PHP

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

 

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

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

тема: Cannot use string offset as an array in
 
 автор: Артем125   (18.07.2009 в 20:50)   письмо автору
 
 

При первом вызове функции все присваивается нормально, когда $b = 5
$_SESSION['order'][$b]['quantity'] = $_POST['quantity'];


А при втором когда $b = 65 выходит ошибка Cannot use string offset as an array in

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

  Ответить  
 
 автор: Trianon   (18.07.2009 в 20:54)   письмо автору
 
   для: Артем125   (18.07.2009 в 20:50)
 

print_r($_SESSION['order'][$b65]);
перед присваиванием.

  Ответить  
 
 автор: Артем125   (18.07.2009 в 21:16)   письмо автору
 
   для: 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 )

  Ответить  
 
 автор: Trianon   (18.07.2009 в 21:22)   письмо автору
 
   для: Артем125   (18.07.2009 в 21:16)
 

итак $_SESSION['order'] = 1
B как в таком случае понимать это Ваше 1[65] = ... ?

И долго ли мы будем тормозить?

Если никак не получается понять, вот Вам абсолютно истинное утверждение.
В php, как и в прочих С-подобных языках, нет многомерных массивов. Никогда не было, нет и не будет.
Есть только одномерные, значениями которых могут быть другие (тоже одномерные) массивы. И так далее.
Что бы ни писали по этому поводу различные руководства и учебники.

  Ответить  
 
 автор: Артем125   (18.07.2009 в 21:47)   письмо автору
 
   для: Trianon   (18.07.2009 в 21:22)
 

Получается для инициализации псевдомногомерных массивов необходимо использовать вложенные конструкции array()? http://softtime.ru/bookphp/gl4_3.php

Получается, массив $_SESSION у нас уже есть, остается создать еще подмассив и подподмасиив
как-нибудь так:

$_SESSION['order']['b'] = array();
и 
$_SESSION['order']['b']['quantity'] = array();


И после этого их можно заполнять, я прав?

  Ответить  
 
 автор: Trianon   (18.07.2009 в 22:04)   письмо автору
 
   для: Артем125   (18.07.2009 в 21:47)
 

первая строка да.
а вторая - только если Вы хотите открыть четвертое измерение.

Скажем так. Если элемента нет, то можно и как раньше. Хотя лучше именно так.
Но еесли элемент есть, но массивом не является, то создать массив нужно обязательно.

  Ответить  
 
 автор: sim5   (19.07.2009 в 06:24)   письмо автору
 
   для: Артем125   (18.07.2009 в 21:47)
 

$_SESSION['order']['b']['quantity'] - надо полагать количество товара. Как оно может быть массивом?

  Ответить  
 
 автор: Артем125   (19.07.2009 в 11:41)   письмо автору
 
   для: 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){....}

  Ответить  
 
 автор: sim5   (19.07.2009 в 12:32)   письмо автору
 
   для: Артем125   (19.07.2009 в 11:41)
 

Если вы храните в корзине (а хранение товаров в сессии это пока корзина) только количество товаров, то достаточно и:
$_SESSION['order'][ID товара'] = количество.
Если же вы еще в эту корзину передаете и цену за единицу товара (через форму), тогда еще оправдано будет:
$_SESSION['order'][ID товара]['quantity'] = количество
$_SESSION['order'][ID товара]['mony'] = цена

  Ответить  
 
 автор: Артем125   (19.07.2009 в 12:34)   письмо автору
 
   для: sim5   (19.07.2009 в 12:32)
 

Да, Вы совершенно правы, я так и сделал ($_SESSION['order'][ID товара'] = количество), просто не уточнил. Спасибо

  Ответить  
 
 автор: sim5   (19.07.2009 в 12:36)   письмо автору
 
   для: Артем125   (19.07.2009 в 12:34)
 

>if (!isset($_SESSION['order'])) $_SESSION['order']['body_id'] = array();

if (!isset($_SESSION['order'])) $_SESSION['order'] = array();

  Ответить  
 
 автор: Артем125   (19.07.2009 в 12:41)   письмо автору
 
   для: sim5   (19.07.2009 в 12:36)
 

Вот и поэтому, наверно у меня щас и появилась небольшая проблема, в корзине есть кнопочки для удаления $_SESSION['order']['body_id'] , где body_id передаются POSTом, так вот, когда все удаляется остается вот этот остаток [order] => Array ( ), если набрать print_r($_SESSION);

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

  Ответить  
 
 автор: sim5   (19.07.2009 в 12:45)   письмо автору
 
   для: Артем125   (19.07.2009 в 12:41)
 

Вы сперва объясните, что вот этим вы хотели добиться (из темы о сессии):
foreach($_SESSION['order'] as $key => $type) {
foreach($type as $_SESSION['order']) {

У вас неверно либо само представление формы с товаром/товарами, либо вы неверно понимаете массивы - добавление и извлечение из них данных.

PS. Сессия будет удалена сборщиком мусора, вам что об этом беспокоится?

  Ответить  
 
 автор: Артем125   (19.07.2009 в 12:53)   письмо автору
 
   для: sim5   (19.07.2009 в 12:45)
 

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

  Ответить  
 
 автор: sim5   (19.07.2009 в 13:01)   письмо автору
 
   для: Артем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. >необходим только лишь один массив с артикулами, и каждому артиклу соответствует количество товара. Поэтому тут подойдет вообще одномерный массив

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

  Ответить  
 
 автор: Артем125   (19.07.2009 в 13:18)   письмо автору
 
   для: sim5   (19.07.2009 в 13:01)
 

Спасибо, я так и задумал, окончательный код опубликую чуть позже, а есть ли средство удаления из массива $_SESSION неизвестно какой записи, если известны все остальные переменные. Вот например, осталось часть $_SESSION[29] = 60, например, ее надо удалить - номер 29 неизвестен, а известно, что существует $_SESSION['user'], и т.д.

  Ответить  
 
 автор: sim5   (19.07.2009 в 13:28)   письмо автору
 
   для: Артем125   (19.07.2009 в 13:18)
 

Вы, видимо, так и не поняли. Вам еще в теме о "сперва набрал, а потом регистрируйся" говорили, что записывать корзину (сессию в базу) не надо, это временная корзина, а записывать товары из корзины в базу нужно только после оформления заказа.
Отсюда следует - чего удалять? У каждого пользователя своя сессия. Набрал он в нее товаров, а потом раздумал и закрыл браузер. Его сессия пропала, и у вас следов базе ее нет, ибо оформления заказа не было. И мусора нет.
Если вы наворотили бог знает чего благодаря своей "защите", и сами не знаете что за записи у вас в сессии, то я тем более не знаю, что это за записи. А потому не могу сказать вам, чего и зачем вам надо удалять.
Хранить $_SESSION['user'] в корзине смысла вообще нет.

  Ответить  
 
 автор: Артем125   (19.07.2009 в 13:34)   письмо автору
 
   для: sim5   (19.07.2009 в 13:28)
 

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

  Ответить  
 
 автор: sim5   (19.07.2009 в 13:54)   письмо автору
 
   для: Артем125   (19.07.2009 в 13:34)
 

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

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

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