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

Форум PHP

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

 

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

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

тема: манипуляции с содержимым корзины
 
 автор: btr   (01.12.2012 в 11:02)   письмо автору
 
 

Здравствуйте.
ситуация:
содержимое корзины хранится в таблице мускула.

краткое описание содержимого (в корзине Х товаров на У рублей) выводится в углу страницы (cпан с ид=korz_m) при каждой перезагрузке в виде ссылки, при нажатии на которую все содержимое корзины в виде таблицы вываливается в центре страницы (ячейка с ид=telo).

добавление в корзину и удаление из нее производится по клику через аджакс асинхронным методом. при этом обновляются атрибуты innerHTML ячейки с ид=telo и cпана с ид=korz_m

проблема:
обновляются вышеуказанные теги задумчиво: начала пропадает содержимое. пауза. появляется содержимое.

вопрос:
может я вообще неверно подхожу к решению данной задачи?
а если верно - то почему так получается?

помогите пожалуйста.

  Ответить  
 
 автор: Valick   (01.12.2012 в 11:48)   письмо автору
 
   для: btr   (01.12.2012 в 11:02)
 

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

  Ответить  
 
 автор: btr   (01.12.2012 в 11:58)   письмо автору
 
   для: Valick   (01.12.2012 в 11:48)
 

1 дело в том, что сервер на моей локальной машине, т.е. сам к себе обращаюсь, поэтому трафик здесь не причем?

2 как определить время выполнения кода? вы имеете ввиду запрос к базе?

3 я вообще в правильном направлении рою? что-то сомнения у меня..

помогите умной мыслью!!

  Ответить  
 
 автор: Valick   (01.12.2012 в 12:32)   письмо автору
 
   для: btr   (01.12.2012 в 11:58)
 

2 как определить время выполнения кода? вы имеете ввиду запрос к базе?
время выполнения запроса проще всего посмотреть в phpmyadmin
время выполнения скрипта (в которое входит и время выполнения запроса) определяется вычитанием времени начала скрипта из времени конца скрипта
http://softtime.ru/forum/read.php?id_forum=1&id_theme=86093

  Ответить  
 
 автор: Sfinks   (01.12.2012 в 19:13)   письмо автору
 
   для: btr   (01.12.2012 в 11:02)
 

Я бы начал с того, что показал код, выполняющий описанные действия. И на стороне клиента (JS) и на стороне сервера (PHP).
А то может так статься, что думаете вы правильно, а переводите на язык компьютера не правильно, и он вас не может понять или понимает не правильно.

  Ответить  
 
 автор: btr   (02.12.2012 в 13:23)   письмо автору
 
   для: Sfinks   (01.12.2012 в 19:13)
 

при обращении к скриптам korzina.php и korzina1.php напрямую (т.е. при открытии страницы) они отрабатывают без задержки

значит, итак:
на стороне клиента
<td id = telo>

    <td onclick = izkorz($q1,$kod1,$size1)> 
    ggg
    </td> 

</td> 

/////////////////////////////////////
//вносим изменения в корзину (удаляем строку)

function izkorz(q11,kod1,size1) {

// Создаем объект запроса
function getXmlHttp(){
  var xmlhttp;
  try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    try {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) {
      xmlhttp = false;
    }
  }
  if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
    xmlhttp = new XMLHttpRequest();
  }
  return xmlhttp;
};


// получаем объект запроса
var xmlhttp = getXmlHttp();

// создаем путь
var get_url = 'izkorziny.php';
var get_qwery ='';
get_qwery += '?kodd=';
get_qwery += kod1;
get_qwery += '&sizee=';
get_qwery += size1;
get_qwery += '&q1=';
get_qwery += q11;
var get_ = get_url + get_qwery;

// запрос
xmlhttp.open('GET', get_, true);
xmlhttp.onreadystatechange = function() {
  if (xmlhttp.readyState == 4) {
     if(xmlhttp.status == 200) {
         }
  }
korz();
korz1();

};
xmlhttp.send(null);


}
//////////////////////////////////////////
краткое содержание корзины
function korz() {

// Создаем объект запроса
function getXmlHttp(){
  var xmlhttp;
  try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    try {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) {
      xmlhttp = false;
    }
  }
  if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
    xmlhttp = new XMLHttpRequest();
  }
  return xmlhttp;
};


// получаем объект записи
var list = document.getElementById('korz_m');

// получаем объект запроса
var xmlhttp = getXmlHttp();

// создаем путь
var get_url = 'korzina.php';
var get_ = get_url;

// запрос
xmlhttp.open('GET', get_, true);
xmlhttp.onreadystatechange = function() {
  if (xmlhttp.readyState == 4) {
     if(xmlhttp.status == 200) {
       //alert(xmlhttp.responseText+"rrrr");
         }
  }
//list.innerHTML='';
list.innerHTML = xmlhttp.responseText;
};

xmlhttp.send(null);

}
//////////////////////////////////////////
полное содержание корзины
function korz1() {

// Создаем объект запроса
function getXmlHttp(){
  var xmlhttp;
  try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    try {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) {
      xmlhttp = false;
    }
  }
  if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
    xmlhttp = new XMLHttpRequest();
  }
  return xmlhttp;
};


// получаем объект записи
var list = document.getElementById('telo');

// получаем объект запроса
var xmlhttp = getXmlHttp();

// создаем путь
var get_url = 'korzina1.php';
var get_ = get_url;

// запрос
xmlhttp.open('GET', get_, true);
xmlhttp.onreadystatechange = function() {
  if (xmlhttp.readyState == 4) {
     if(xmlhttp.status == 200) {
       //alert(xmlhttp.responseText+"rrrr");
         }
  }
//list.innerHTML='';
list.innerHTML = xmlhttp.responseText;
};

xmlhttp.send(null);

}



содержание izkorziny.php

<?php


if (isset ($_REQUEST["q1"])) $q1 = (int)$_REQUEST["q1"];
if (isset (
$_REQUEST["kodd"])) $kodd = (int)$_REQUEST["kodd"];
if (isset (
$_REQUEST["sizee"])) $sizee = (int)$_REQUEST["sizee"];

include 
"0_start.php";

/// проверяем наличие у шопера записи выбранного артикула
$q "
SELECT *
FROM shoper_korz
WHERE id_shoper = 
$q1
AND id_art = 
$kodd
AND id_zakaz = 0;
"
;
$a mysql_query($q);
echo 
mysql_error();
if (!
$a)  exit ("<p>выборка изкорзины не прошла </p>");
$q3 mysql_num_rows($a);

/// если запись есть - сообщаем
if ($q3 == 1) {

};

/// если запись есть  - удаляем запись
if ($q3 == 1) {
$q "
DELETE FROM shoper_korz 
WHERE id_shoper = 
$q1
AND id_art = 
$kodd
AND size = 
$sizee
AND id_zakaz = 0;
"
;
$a mysql_query($q);
echo 
mysql_error();
if (!
$a)  exit ('<p>удаление не удалось </p>');

};

include 
"0_stop.php";

  Ответить  
 
 автор: confirm   (02.12.2012 в 14:32)   письмо автору
 
   для: btr   (02.12.2012 в 13:23)
 

И зачем вы несколько раз создаете один и тот же объект xmlhttp?

  Ответить  
 
 автор: btr   (02.12.2012 в 14:38)   письмо автору
 
   для: confirm   (02.12.2012 в 14:32)
 

ни за чем. просто я не знаю ничего. поучите если не трудно

  Ответить  
 
 автор: confirm   (02.12.2012 в 14:59)   письмо автору
 
   для: btr   (02.12.2012 в 14:38)
 

А чего учить то - сделайте это отдельной функцией и вызывайте по надобности, а не так как у вас - в трех функциях вы описываете трижды создание этого объекта.

  Ответить  
 
 автор: btr   (02.12.2012 в 15:41)   письмо автору
 
   для: confirm   (02.12.2012 в 14:59)
 

уважаемый, про функцию спасибо, конечно со временем все отполирую.
а на основной вопрос не ответите?

  Ответить  
 
 автор: confirm   (02.12.2012 в 15:54)   письмо автору
 
   для: btr   (02.12.2012 в 15:41)
 

Отвечу, но если позже, сейчас просто нет времени что-то писать. Дело в том, что ваш код надо бы выбросить, по хорошему, и писать несколько иначе, а это написать, нужно время, которого на данный момент у меня нет в достатке.

  Ответить  
 
 автор: btr   (02.12.2012 в 16:07)   письмо автору
 
   для: confirm   (02.12.2012 в 15:54)
 

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

  Ответить  
 
 автор: confirm   (02.12.2012 в 16:43)   письмо автору
 
   для: btr   (02.12.2012 в 16:07)
 

Ну зачем тыкать носом? Все дело в том, что корзина, это "философия", вот она у вас напрочь отсутствует, и решается она не кусочками как вы пишите - "аджаком получаем..., вываливается в таблицу...", нет, так корзину не пишут.
Хотите, подождите, не хотите как хотите. )

  Ответить  
 
 автор: btr   (02.12.2012 в 17:55)   письмо автору
 
   для: confirm   (02.12.2012 в 16:43)
 

ждем-с

  Ответить  
 
 автор: confirm   (03.12.2012 в 10:00)   письмо автору
 
   для: btr   (02.12.2012 в 13:23)
 

>выборка изкорзины не прошла

"из корзины"

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

  Ответить  
 
 автор: Valick   (03.12.2012 в 10:06)   письмо автору
 
   для: confirm   (03.12.2012 в 10:00)
 

Согласен, в базе надо держать уже сформированный заказ.
Корзину достаточно держать в сессии.

  Ответить  
 
 автор: btr   (03.12.2012 в 10:10)   письмо автору
 
   для: Valick   (03.12.2012 в 10:06)
 

сессия живет 30 минут. краем глаза обращал внимание, что содержимое корзины сохраняется несколько дней . как этого добиваются?

  Ответить  
 
 автор: Valick   (03.12.2012 в 10:12)   письмо автору
 
   для: btr   (03.12.2012 в 10:10)
 

кукисами

  Ответить  
 
 автор: btr   (03.12.2012 в 10:15)   письмо автору
 
   для: Valick   (03.12.2012 в 10:12)
 

т.е. все, что выбрал клиент, запихивать ему в куки? :\

  Ответить  
 
 автор: Valick   (03.12.2012 в 10:20)   письмо автору
 
   для: btr   (03.12.2012 в 10:15)
 

ага, а в чем проблема? С ними можно работать и через JS
При добавлении товара в корзину отправляете по AJAX запрос на сервер и при подтверждении необходимого количества на складе резервируете товар и уже на стороне клиента средствами JS обновляете кукис.

  Ответить  
 
 автор: btr   (03.12.2012 в 10:08)   письмо автору
 
   для: confirm   (03.12.2012 в 10:00)
 

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

сам понимаю, все не так, а КАК надо?

  Ответить  
 
 автор: confirm   (03.12.2012 в 12:48)   письмо автору
 
   для: btr   (03.12.2012 в 10:08)
 

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

Проверка существует товар или нет, чтобы выдать клиенту разрешение на добавление товара, операция излишняя на сам момент добавления, ведь не факт, что сервер ответит мгновенно. И вместо добавления товара в корзину получим нервотрепку, особенно, если добавление товара анимированное, когда копия изображения товара перемещается в корзину.

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

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

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

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

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

Товары, которые есть в наличии, помещаются в таблицу заказов, после чего уже сервер удаляет cookie-корзину клиента.

Для добавления информации о товаре в корзину совсем не требуются какие-то особые элементы управления, как то ссылки, элементы формы. Поле input потребуется, если добавлять можно несколько штук одного и того же товарах, в остальных случаях можно воспользоваться любыми DOM-элементами станицы - иконками корзины, которые меняют стиль свой - добавить/добавлено, текстовыми элементами. При этом, элементы добавить/добавлено могут иметь id товар непосредственно в цифровом виде, а общий родитель всех элементов, описывающих товар, этот же id с буквенным префиксом. Это позволит легко сформировать id родителя, и выбрать в его дочерних элементах дополнительную информацию о товаре - цена, описание, фото.

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

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

  Ответить  
 
 автор: btr   (03.12.2012 в 16:39)   письмо автору
 
   для: confirm   (03.12.2012 в 12:48)
 

Большое спасибо. буду переваривать :)

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

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