|
|
|
| Здравствуйте.
ситуация:
содержимое корзины хранится в таблице мускула.
краткое описание содержимого (в корзине Х товаров на У рублей) выводится в углу страницы (cпан с ид=korz_m) при каждой перезагрузке в виде ссылки, при нажатии на которую все содержимое корзины в виде таблицы вываливается в центре страницы (ячейка с ид=telo).
добавление в корзину и удаление из нее производится по клику через аджакс асинхронным методом. при этом обновляются атрибуты innerHTML ячейки с ид=telo и cпана с ид=korz_m
проблема:
обновляются вышеуказанные теги задумчиво: начала пропадает содержимое. пауза. появляется содержимое.
вопрос:
может я вообще неверно подхожу к решению данной задачи?
а если верно - то почему так получается?
помогите пожалуйста. | |
|
|
|
|
|
|
|
для: btr
(01.12.2012 в 11:02)
| | а если верно - то почему так получается?
ajax посылает запрос на сервер (исходящий траффик), сервер принимает запрос, думает, советуется с бд, думает и посылает вам результат (входящий траффик)
для начала я бы определил время выполнения самого кода на сервере, траффик тут скорее всего ни при чем иначе бы тормозилка была у всего сайта, хотя мир информационных технологий настолько общирен и загадочен, что и этот пункт исключать полностью нельзя. | |
|
|
|
|
|
|
|
для: Valick
(01.12.2012 в 11:48)
| | 1 дело в том, что сервер на моей локальной машине, т.е. сам к себе обращаюсь, поэтому трафик здесь не причем?
2 как определить время выполнения кода? вы имеете ввиду запрос к базе?
3 я вообще в правильном направлении рою? что-то сомнения у меня..
помогите умной мыслью!! | |
|
|
|
|
|
|
|
для: btr
(01.12.2012 в 11:58)
| | 2 как определить время выполнения кода? вы имеете ввиду запрос к базе?
время выполнения запроса проще всего посмотреть в phpmyadmin
время выполнения скрипта (в которое входит и время выполнения запроса) определяется вычитанием времени начала скрипта из времени конца скрипта
http://softtime.ru/forum/read.php?id_forum=1&id_theme=86093 | |
|
|
|
|
|
|
|
для: btr
(01.12.2012 в 11:02)
| | Я бы начал с того, что показал код, выполняющий описанные действия. И на стороне клиента (JS) и на стороне сервера (PHP).
А то может так статься, что думаете вы правильно, а переводите на язык компьютера не правильно, и он вас не может понять или понимает не правильно. | |
|
|
|
|
|
|
|
для: 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";
|
| |
|
|
|
|
|
|
|
для: btr
(02.12.2012 в 13:23)
| | И зачем вы несколько раз создаете один и тот же объект xmlhttp? | |
|
|
|
|
|
|
|
для: confirm
(02.12.2012 в 14:32)
| | ни за чем. просто я не знаю ничего. поучите если не трудно | |
|
|
|
|
|
|
|
для: btr
(02.12.2012 в 14:38)
| | А чего учить то - сделайте это отдельной функцией и вызывайте по надобности, а не так как у вас - в трех функциях вы описываете трижды создание этого объекта. | |
|
|
|
|
|
|
|
для: confirm
(02.12.2012 в 14:59)
| | уважаемый, про функцию спасибо, конечно со временем все отполирую.
а на основной вопрос не ответите? | |
|
|
|
|
|
|
|
для: btr
(02.12.2012 в 15:41)
| | Отвечу, но если позже, сейчас просто нет времени что-то писать. Дело в том, что ваш код надо бы выбросить, по хорошему, и писать несколько иначе, а это написать, нужно время, которого на данный момент у меня нет в достатке. | |
|
|
|
|
|
|
|
для: confirm
(02.12.2012 в 15:54)
| | Что же, я подожду.
Надо понимать, просьба ткнуть меня носом в то, что я не так делаю, неуместна? вероятно, все? или же можете сказать хотя бы в общих чертах?
вопрос о унификации сейчас не стоит, сам понимаю, что кругом одни повторения и можно все сделать короче, но я только учусь. | |
|
|
|
|
|
|
|
для: btr
(02.12.2012 в 16:07)
| | Ну зачем тыкать носом? Все дело в том, что корзина, это "философия", вот она у вас напрочь отсутствует, и решается она не кусочками как вы пишите - "аджаком получаем..., вываливается в таблицу...", нет, так корзину не пишут.
Хотите, подождите, не хотите как хотите. ) | |
|
|
|
|
|
|
|
для: confirm
(02.12.2012 в 16:43)
| | ждем-с | |
|
|
|
|
|
|
|
для: btr
(02.12.2012 в 13:23)
| | >выборка изкорзины не прошла
"из корзины"
Получается, что ваша корзина исключительно в базе, и чего-то там проверяем, что-то хотим удалить, не получается... И как у вас в дальнейшем решается вопрос с теми позициями, которые по некоторым причинам не получилось удалить, да и вообще с корзиной клиента, которую он просто забросил? | |
|
|
|
|
|
|
|
для: confirm
(03.12.2012 в 10:00)
| | Согласен, в базе надо держать уже сформированный заказ.
Корзину достаточно держать в сессии. | |
|
|
|
|
|
|
|
для: Valick
(03.12.2012 в 10:06)
| | сессия живет 30 минут. краем глаза обращал внимание, что содержимое корзины сохраняется несколько дней . как этого добиваются? | |
|
|
|
|
|
|
|
для: btr
(03.12.2012 в 10:10)
| | кукисами | |
|
|
|
|
|
|
|
для: Valick
(03.12.2012 в 10:12)
| | т.е. все, что выбрал клиент, запихивать ему в куки? :\ | |
|
|
|
|
|
|
|
для: btr
(03.12.2012 в 10:15)
| | ага, а в чем проблема? С ними можно работать и через JS
При добавлении товара в корзину отправляете по AJAX запрос на сервер и при подтверждении необходимого количества на складе резервируете товар и уже на стороне клиента средствами JS обновляете кукис. | |
|
|
|
|
|
|
|
для: confirm
(03.12.2012 в 10:00)
| | пока никак.
а мысль была такая: клиент привязывается кукой на определенное время, после которого база чистится...
сам понимаю, все не так, а КАК надо? | |
|
|
|
|
|
|
|
для: btr
(03.12.2012 в 10:08)
| | Надо сперва определится в чем содержать записи корзины и какие.
Содержание записей в базе имеет выгоды, но и не меньше имеет минусов.
Сессия - время ее жизни подвластно вам, правда плохо, что его изменение глобальное и нельзя выставить индивидуально для каждого пользователя.
Cookie - позволяет вообще не дергать сервер попусту, и в паре с сессией вполне обеспечит весь функционал.
Проверка существует товар или нет, чтобы выдать клиенту разрешение на добавление товара, операция излишняя на сам момент добавления, ведь не факт, что сервер ответит мгновенно. И вместо добавления товара в корзину получим нервотрепку, особенно, если добавление товара анимированное, когда копия изображения товара перемещается в корзину.
Какой смысл выставлять на страницах товар, который нельзя поместить в корзину - товары которых нет в наличии на складе? Такие товары либо можно заказать, а значит они существуют, и серверу разобраться в том какие товары отослать клиенту, а какие сохранить как заказ не сложно. Либо такие товары на страницах отсутствуют.
Если я захочу сделать вам фиктивный заказ из "мусора", неужели я буду сидеть на вашей странице и чего-то там править чтобы получить фикцию? Я просто составлю фиктивный список товаров и зашлю его вам, при этом мне совсем не требуется даже браузер. Из этого следует, что действительно покупателя проверять "на честность" необходимости нет. Если все таки делать проверку, то сессия поможет - при выводе товаров на странице в сессии можно держать слепок этих товаров - массив их идентификаторов, и тогда запрос на проверку будет происходить меньшей кровью.
Что нужно для того чтобы поместить товар в корзину? По большому счету только его идентификатор. Вы же выводите на страницах практически всю информацию о товаре - идентификатор, цена, наименование, и описание, по крайней мере краткое. Этой информации достаточно, чтобы формировать корзину на стороне клиента (для текущей страницы) без участия сервера, причем для обеих представлений ее - краткой и полной. Полная информация о корзине, это ведь только добавление возможности ее редактирования, и если корзина формируется на клиенте, то и в этой операции сервер не участвует.
Вывод товаров на страницу всегда должен сопровождаться проверкой наличия корзины (для текущей страницы у клиента, это делает клиентский сценарий), то есть товаров уже выбранных пользователем, и такие товары должны отмечаться на страницах - помещено в корзину, и сколько помещено, если возможно не единичное добавление товара.
Вот при смене страниц с товарами и можно производить проверку наличия товаров, которые помещены в корзину, а еще лучше делать такое один раз - при формировании заказа. И уже от результатов проверки делайте выводы, обманывают вас, и что делать при этом, или действительно покупка. При этом, если кроме покупки есть возможность заказа товара, которого временно нет в наличии, то эти позиции сохраняются в базе - корзине пользователя, и служат для отметки товаров на страницах - "заказано" и т.д...
Товары, которые есть в наличии, помещаются в таблицу заказов, после чего уже сервер удаляет cookie-корзину клиента.
Для добавления информации о товаре в корзину совсем не требуются какие-то особые элементы управления, как то ссылки, элементы формы. Поле input потребуется, если добавлять можно несколько штук одного и того же товарах, в остальных случаях можно воспользоваться любыми DOM-элементами станицы - иконками корзины, которые меняют стиль свой - добавить/добавлено, текстовыми элементами. При этом, элементы добавить/добавлено могут иметь id товар непосредственно в цифровом виде, а общий родитель всех элементов, описывающих товар, этот же id с буквенным префиксом. Это позволит легко сформировать id родителя, и выбрать в его дочерних элементах дополнительную информацию о товаре - цена, описание, фото.
Javascript не оперирует ассоциативными массивами, но работает с объектами. При добавлении товара создается объект (если еще не создавался), в котором id товара является свойством объекта, а его значением массив, индексы которого описывают цену товара, описание, ссылку на фото. При каждом добавлении товара осуществляется обход этого объекта, просчитывается количество товаров и общая цена за них для краткого отображения корзины.
Вывод полной информации о корзине также обеспечивает клиентский скрипт - обходом объекта строится таблица с товарами с добавлением элементов редактирования - например, чекбоксов "удалить" и кнопок (ссылок), типа "удалить выбранные", "очистить корзину" и "оформить заказ". Асинхронный запрос на сервер может потребоваться в том случае, если покупатель может иметь скидки, бонусы, и т.п.. | |
|
|
|
|
|
|
|
для: confirm
(03.12.2012 в 12:48)
| | Большое спасибо. буду переваривать :) | |
|
|
|
|