Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 9

Изменение счетчика по клику внутри цикла

18.07.2016, 12:19. Показов 1334. Ответов 11

Студворк — интернет-сервис помощи студентам
Здравствуйте.
В корзине товары выводятся циклом, внутри каждой записи о выбранном товаре есть кнопка увеличения числа товара(если человек хочет не один товар, а больше). Поскольку все происходит в цикле (в результате там все переменные относятся ко всем записям), если я кликаю по счетчику одного товара, изменяются значения всех счетчиков. Мне нужно, чтоб менялся счетчик только того товара, который я выбрал. Помогите студенту доделать дипломную работу. Ниже привожу код:
<?php
$dbconnect;
$var_order_id = (int)$_GET['ordid'];
$c_result = pg_query("SELECT i.image, i.name, c.prod_price, c.prod_count, c.id_cart, c.prod_id, i.id
FROM cart as c join items as i on i.id = c.prod_id WHERE c.order_id = '$var_order_id'");
$div_numc = pg_num_rows($c_result);
for($i=0; $i < $div_numc; $i++){
$cart_catalog = pg_fetch_array($c_result);
$id_cart = $cart_catalog['id_cart'];
$prod_id = $cart_catalog['prod_id'];
if(isset($_POST['subplus'])&&$_POST['send_prodid'] == $prod_id){
$update_query = pg_query("UPDATE cart SET prod_count = prod_count+1,
sum_price = prod_price*(prod_count+1) WHERE id_cart = '$id_cart'
returning prod_count");
$v_prod_count = pg_fetch_array($update_query);
$var_prod_count = $v_prod_count['prod_count'];
}

?>

<form action = "" method = "post">
<div class = "orderedproduct">
<div class = "layer"></div><!--Граница между блоками-->
<div class = "divproductpic"><div class = "productpic">Изображение<br> товара</div>
<img src = "<?php echo $cart_catalog['image'];?>" alt = "">
</div>
<div class = "productnamestr"><?php echo $cart_catalog['name'];?></div>
<div class = "available">Есть в наличии</div>
<div class = "available">Есть в наличии</div>
<div class = "pricedigits"><?php echo $cart_catalog['prod_price'];?><span class = "pricedigitsrub">руб.</span></div>
<div class = "divforminus"><label for = "subminus" class = "insideforminus">-</label></div>
<input type = "submit" name = "subminus" id = "subminus">
<div class = "verticallayer"></div>
<div class = "fordigits"><div class = "insidefordigits"><?php if($_POST['subplus']){ echo $var_prod_count;}
else{echo $cart_catalog['prod_count'];}
?>
</div>
</div>
<div class = "verticallayer"></div>
<div class= "divforplus"><label for = "subplus" class = "insideforplus">+</label></div>
<input type = "submit" name = "subplus" id = "subplus">
<input type = "hidden" name = "send_prodid" value = "<?php echo $prod_id;?>">
<div class = "totalpricedigits"><?php if($_POST['subplus']){echo $cart_catalog['prod_price']*$var_prod_count;}

else{echo $cart_catalog['prod_price'];}
?><span class = "totalpricedigitsrub">руб.</span></div>


<label for = "delitem" class = "deletemark"><img src = "./pics/deletemark.png" alt = "deletemark"></label>
<input type = "submit" name = "delitem" id = "delitem">

</div>
</form>
<?php

}


?>
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.07.2016, 12:19
Ответы с готовыми решениями:

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

Почему не срабатывает изменение границы цикла, принятое внутри цикла?
Работает цикл for-Next V_Rod = UBound(Rod, 2) For j = 1 To V_Rod For k = 1 To UBound(BD, 2) ReDim...

Изменение начального положения цикла внутри этого цикла
есть два маппинга в одном 180000 строк в другом 85000 нужно один прогнать по другому на сопоставление по определенному полю, оба столбца...

11
2 / 2 / 1
Регистрация: 24.10.2014
Сообщений: 75
19.07.2016, 12:07
Мдя. Я кляцаю на один товар, а цикл на всё + перезагрузка страницы, ни на одном магазе такого не видел), либо делай через аякс либо не делай вообще .
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 9
19.07.2016, 12:20  [ТС]
Andrey07, во первых, это просто дипломная работа. Во вторых это сейчас очень актуально. В третьих, ajax что не ко всем элементам массива будет относиться? У меня все контейнеры по классам. Цена каждого товара в корзине лежит в одном контейнере, который "размножается". Я уже столько умников видел, которые мастера в сарказме, а на деле не могут кусок кода написать в помощь.
0
2 / 2 / 1
Регистрация: 24.10.2014
Сообщений: 75
19.07.2016, 12:56
Так дело же не в куске кода, а в алгоритме, если правильный подход то и решение будет простым. Аякс относиться только
к тому что вы ему зададите. В аяксе нет ничего сложного, почитали мануал скопировали пример, подставили свои значения. Вы js и jquery используете?
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 9
19.07.2016, 13:05  [ТС]
Andrey_07, использую jQuery совсем редко, когда нужно что-нибудь отстилить по наведению или по клику. JS основы изучали, кое-что делали. Но раз Вы советуете, я буду изучать конкретнее.
Спасибо за отклики на просьбу.
А что, мой алгоритм, я так понимаю, негодный? Я давно это подозревал. Никто уже долгое время не может мне помочь, а сам я не мастер, надеюсь пока-).
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
19.07.2016, 13:54
Михаил13, просто в этом жутком коде сложно разобраться, проще заново написать.

Кстати, зачем корзину в БД хранить? И не вижу разграничение прав, корзина одна для всех юзеров?

Добавлено через 5 минут
Михаил13, и отступы для читабельности нужны. И подсветка синтаксиса (кнопка PHPHTML в редакторе).

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php
$dbconnect;
$var_order_id = (int)$_GET['ordid'];
 
$c_result = pg_query("SELECT i.image, i.name, c.prod_price, c.prod_count, c.id_cart, c.prod_id, i.id
FROM cart as c join items as i on i.id = c.prod_id WHERE c.order_id = '$var_order_id'");
 
$div_numc = pg_num_rows($c_result); 
 
for($i=0; $i < $div_numc; $i++):
    $cart_catalog = pg_fetch_array($c_result);
    $id_cart = $cart_catalog['id_cart'];
    $prod_id = $cart_catalog['prod_id'];
    
    if(isset($_POST['subplus'])&&$_POST['send_prodid'] == $prod_id)
    {
        $update_query = pg_query("UPDATE cart SET prod_count = prod_count+1, 
            sum_price = prod_price*(prod_count+1) WHERE id_cart = '$id_cart'
            returning prod_count"); 
        $v_prod_count = pg_fetch_array($update_query);
        $var_prod_count = $v_prod_count['prod_count'];
    }
 
?>
 
<form action = "" method = "post">  
    <div class = "orderedproduct">
        <div class = "layer"></div>
        
        <div class = "divproductpic">
            <div class = "productpic">Изображение<br> товара</div>
            <img src = "<?php echo $cart_catalog['image'];?>" alt = "">
        </div>
        
        <div class = "productnamestr"><?php echo $cart_catalog['name'];?></div>
        <div class = "available">Есть в наличии</div>
        <div class = "available">Есть в наличии</div>
        <div class = "pricedigits">
            <?php echo $cart_catalog['prod_price'];?><span class = "pricedigitsrub">руб.</span>
        </div>
        <div class = "divforminus"><label for = "subminus" class = "insideforminus">-</label></div>
        <input type = "submit" name = "subminus" id = "subminus">
        <div class = "verticallayer"></div>
        
        <div class = "fordigits">
            <div class = "insidefordigits">
            <?php echo $_POST['subplus'] ? $var_prod_count : $cart_catalog['prod_count']; ?>
            </div>
        </div>
 
        <div class = "verticallayer"></div>
        <div class= "divforplus"><label for = "subplus" class = "insideforplus">+</label></div>
        <input type = "submit" name = "subplus" id = "subplus">
        <input type = "hidden" name = "send_prodid" value = "<?php echo $prod_id;?>">
 
        <div class = "totalpricedigits">
            <?php echo $_POST['subplus'] ? $cart_catalog['prod_price'] * $var_prod_count : $cart_catalog['prod_price'];?>
            <span class = "totalpricedigitsrub">руб.</span>
        </div>
 
 
        <label for = "delitem" class = "deletemark"><img src = "./pics/deletemark.png" alt = "deletemark"></label>
        <input type = "submit" name = "delitem" id = "delitem">
    </div>
</form>
<?php endfor; ?>
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 9
19.07.2016, 14:19  [ТС]
Jodah, не совсем понимаю про разграничение прав. У меня корзина показывается по сессии.
Спасибо за редактирование и подсветку)
0
2 / 2 / 1
Регистрация: 24.10.2014
Сообщений: 75
19.07.2016, 15:04
Согласен с Jodah в БД хранить корзину не разумно, или в пхп сессию или в куки, но не в БД так как пользователь может создать корзину на 100 продуктов и тупо закрыть браузер, а если таких пользователей 1к? БД будет бесконечно расти, но для дипломной думаю это не важно, хотя если б это делал я, то сделал бы норм магаз и продал бы). Ваш алгоритм годный но не производителен, зачем пересчитывать всю продукцию если я сделал только увеличение одного конкретного.

Добавлено через 9 минут
это что, ели в корзине 10 товаров то у вас будет 10 форм?
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 9
19.07.2016, 15:14  [ТС]
Я и хочу увеличивать только один товар, но слаб еще в программировании. Нет опыта, как реализовать. С БД решил работать потому, что пример такой увидел. Наверное можно будет реализовать удаление заказа из БД если он не закрыт. Надо подумать, поискать как.

Добавлено через 7 минут
Andrey_07, получается, что так. Сколько цикл выведет, столько и будет. Ведь мой способ (как я теперь понимаю, не лучший-))таков. Вообще, это специально заморочили для диплома. Я уже один сайт делал по своему усмотрению, так там было все разумнее , поменьше плохого кода.
0
2 / 2 / 1
Регистрация: 24.10.2014
Сообщений: 75
19.07.2016, 15:48
рассказываю как нужно, хотя признаюсь что ниразу не писал магазинов)
базу можно оставить но форма должна быть одна, все товары в одной форме, то есть тебе нужно цикл внутри формы делать, кнопка плюс у тебя будет не сабмит а баттон и с минусом так же. Дальше на кнопку пишеш onclick="ajax_function(unique_id)", unique_id - уникальный идентификатор товара. В функции пиши аякс который отправляет этот unique_id на пхп скрипт. В пхп скрипте ты смотриш на unique_id и ищешь по нему товар и увеличиваеш на 1, и возвращаешь нужные данные. В аяксе есть атрибут success куда приходит ответ от пхп скрипта с данными которые ты вернул, данные приходят в виде объекта. Эту инфу ты обрабатываешь с помощью jquery(вставляешь в нужные места). Вот и всё. Хотя пока писал пришла одна гениальная идея)).
Вместо того чтоб считать на пхп, можна написать js но jsy нужны параметры цена и количество и их можна задать в атрибуты или извлечь из хтмля(там они заданы как текст). То есть надо такую же кнопку плюс с атрибутом онклик где вызывать фунцию которая делает селект цена-количество, умножает и вставляет в totalpricedigits.
И да сорян за мой Русский.
1
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
19.07.2016, 15:54
Цитата Сообщение от Михаил13 Посмотреть сообщение
У меня корзина показывается по сессии.
Не вижу сессии в коде.

Набросал на скорую руку управление корзиной. Надеюсь, это вам поможет.

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?
// Функция получения корзины
function cart_get()
{
    return isset($_COOKIE['cart']) ? unserialize($_COOKIE['cart']) : [];
}
 
// Функция обновления корзины
function cart_set($cart)
{
    $cart = serialize($cart);
    setcookie('cart', $cart, time()+60*60*24*30, '/');
    $_COOKIE['cart'] = $cart;
}
 
// Функция добавления товара
function cart_add_item($id)
{
    $cart = cart_get();
    
    if(isset($cart[$id]))
        $cart[$id]++;
    else
        $cart[$id] = 1;
 
    cart_set($cart);
}
 
// Функция удаления товара
function cart_delete_item($id)
{
    $cart = cart_get();
    
    if(!isset($cart[$id]))
        return;
 
    if($cart[$id] > 1)
        $cart[$id]--;
    else
        unset($cart[$id]);
 
    cart_set($cart);
}
 
if(isset($_POST['product_add']))
{
    $product_id = (int) key($_POST['product_add']);
    cart_add_item($product_id);
}
 
if(isset($_POST['product_delete']))
{
    $product_id = (int) key($_POST['product_delete']);
    cart_delete_item($product_id);
}
 
?>
<h3>Корзина:</h3>
<pre>
<? print_r(cart_get()); ?>
</pre>
<form method="post">
    <h2>Товар1</h2>
    <input type="submit" value="Добавить" name="product_add[1]">
    <input type="submit" value="Удалить" name="product_delete[1]">
 
    <h2>Товар2</h2>
    <input type="submit" value="Добавить" name="product_add[2]">
    <input type="submit" value="Удалить" name="product_delete[2]">
 
    <h2>Товар3</h2>
    <input type="submit" value="Добавить" name="product_add[3]">
    <input type="submit" value="Удалить" name="product_delete[3]">
</form>
1
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 9
19.07.2016, 16:21  [ТС]
Блин, Andrey_07 и Jodah, Вы оба красавцы. Я поставил по плюсу обоим. Дальше внимательно изучу, что Вы написали, так как нужно реально задуматься над изучением JS. Я имею ввиду, что нужно будет асинхронно это все делать. Мне кажется это пока лучшие ответы со всех форумов, где побывал. И мне кажется, что я разберусь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.07.2016, 16:21
Помогаю со студенческими работами здесь

Изменение переменной внутри цикла
Почему в цикле i всё равно изменяется только на 5? for i in range(1, 1000, 5): print(i) i = i * 10

Изменение переменной внутри цикла
Задача перебрать файлы в папке и заархивировать в отдельные файлы for /f %%i in (d.txt) do ( arj32 m -e -y AFN_%NOM%...

Изменение свойств элемента внутри цикла
Вот такой код: procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i:= 10 to 5000 do begin ...

Изменение последовательности внутри цикла for, мощность Си-шного for в python
Здравствуйте. Пишу калькулятор на python. Имеется список с операторами , которые я перебираю: for cur_op_num in range(len(opers)): ...

Ошибка: Нельзя изменять значение переменной цикла внутри этого цикла
при запуске в цикле while в строке x:=x div 10; выдает ошибку &quot;Нельзя изменять значение переменной цикла внутри этого цикла&quot;,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru