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

Обновление переменной при нажатии на кнопку

12.01.2016, 00:14. Показов 5460. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Есть кнопка, например:
HTML5
1
2
3
<form method="POST" action="/jobscript/job">
<input type="submit" name="job1" value="Заработать 100">
</form>
Есть код php:
PHP
1
2
3
4
5
6
7
8
if ($Module == 'job' and $_POST['job1']) {
    $Money = $_SESSION['USER_MONEY'];
    $Money = $Money + 100;
    $UserLogin = $_SESSION['USER_LOGIN'];
    mysqli_query($CONNECT, "UPDATE `users` SET `money` = '$Money' WHERE `login` = '$UserLogin'");
    MessageSend(2, 'Вы заработали 100 Р!');
    exit(header('Location: /profile')); // Завершаем скрипт и делаем редирект на страницу профиля
}
Проблема очевидна:
Кнопка срабатывает 1 раз, в базу данных прибавляется 100, но до перезагрузки браузера (не страницы!) оно не отображается и естественно при нажатии еще раз - он откатывается к начальному состоянию сессии и снова прибавляет 100, т.е. получается тоже, что и в первый раз (начальное +100). Подскажите, в чем проблема и как ее можно исправить?
И еще хотелось спросить, какими методами решить проблему перезагрузки страницы? Т.е. нажал на кнопку, добавилось 100 и сразу отобразилось. Я так понимаю, это нужно через javascript делать, но следующим этапом будет установка таймера на кнопку, т.е. кнопка нажимается и как бы запускает процесс добавления этих 100, обратный отсчет (скажем, 5 минут) и при перезагрузке страницы отсчет бы продолжался и от клиента бы не зависел?
Думаю, что кем-то где-то такое уже было сделано. Заранее благодарю за все ответы в топике.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.01.2016, 00:14
Ответы с готовыми решениями:

Действие при нажатии на кнопку
Добрый день недавно сел за php. Возникла такая проблема: Есть таблица в БД при нажатии на кнопку выбирается рандомная строка и выводиться...

Оповещение при нажатии на кнопку ОК
Здравствуйте. Помогите пожалуйста. У нас сайт mirlombardov.com У меня не работает оповещение при нажатии на кнопку 500 руб. в подарок за...

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

16
 Аватар для Raisin Zn
101 / 100 / 51
Регистрация: 19.04.2011
Сообщений: 965
12.01.2016, 06:31
Цитата Сообщение от Antropogen Посмотреть сообщение
до перезагрузки браузера (не страницы!)
Это как? Браузер надо закрыть, а потом открыть?

Может так надо:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if ($Module == 'job' and isset($_POST['job1']))
{
    $UserLogin = $_SESSION['USER_LOGIN'];
    $q = mysqli_query($CONNECT, "UPDATE `users` SET `money` = `money` + 100 WHERE `login` = '$UserLogin'");
    if (!$q)
    {
        exit('Не удача.');
    }
    else
    {
        MessageSend(2, 'Вы заработали 100 Р!');
        header('Location: /profile');
        exit;
    }
}
Цитата Сообщение от Antropogen Посмотреть сообщение
Я так понимаю, это нужно через javascript делать
Ajax jQuery.
0
0 / 0 / 0
Регистрация: 16.12.2015
Сообщений: 11
12.01.2016, 14:49  [ТС]
Цитата Сообщение от Raisin Zn
Это как? Браузер надо закрыть, а потом открыть?
Именно так. Без этого не обновляется.

Цитата Сообщение от Raisin Zn
Может так надо:
Спасибо за ответ, вечером проверю и отпишусь.

Добавлено через 5 часов 37 минут
Собственно, не заметил особой разницы. Буду пробовать Ajax. Если у кого-то есть мысли, пишите, чтоб не изобретать велосипед.
0
 Аватар для Raisin Zn
101 / 100 / 51
Регистрация: 19.04.2011
Сообщений: 965
12.01.2016, 15:32
Цитата Сообщение от Antropogen Посмотреть сообщение
оно не отображается и естественно при нажатии еще раз - он откатывается к начальному состоянию сессии
Так, а где оно должно отображаться?
Как вы выводите результат?
Цитата Сообщение от Antropogen Посмотреть сообщение
MessageSend(2, 'Вы заработали 100 Р!');
Так? Если да, то тут вывод только по условию. Или это отправка на почту?
В базе значение меняется? Как выводите изначальное значение?
0
0 / 0 / 0
Регистрация: 16.12.2015
Сообщений: 11
12.01.2016, 16:55  [ТС]
Цитата Сообщение от Raisin Zn Посмотреть сообщение
Так, а где оно должно отображаться?
Как вы выводите результат?
Как должно или как мне хочется? Как должно - я не знаю. Но хочется, чтобы при нажатии на кнопку - менялось кол-во денег у юзера в базе данных и у него же на мониторе. Пытаюсь вот сделать это средставими jQuery, но чего-то как-то ничего не работает.
А вывожу результат вот так:
PHP
1
echo number_format($_SESSION['USER_MONEY'], 0, '.', ' ');
Цитата Сообщение от Raisin Zn Посмотреть сообщение
Так? Если да, то тут вывод только по условию. Или это отправка на почту?
Нет, это просто вывод сообщения на экран пользователя.

Цитата Сообщение от Raisin Zn Посмотреть сообщение
В базе значение меняется? Как выводите изначальное значение?
В базе меняется. Сейчас даже заметил, что можно нажимать н-ное кол-во раз и каждое записывается (после вашего кода, ранее это не работало).
Как вывожу? При логине беру из таблицы все данных для юзера и каждую записываю в свою переменную сессии, примерно так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    $Row = mysqli_fetch_assoc(mysqli_query($CONNECT, "SELECT `id`, `login`, `name`, `regdate`, `email`, `country`, `avatar`, `active`, `money`, `gold`, `usergroup` FROM `users` WHERE `login` = '$_POST[login]'"));
    // Запись данных в сессию
    $_SESSION['USER_ID'] = $Row['id'];
    $_SESSION['USER_LOGIN'] = $Row['login'];
    $_SESSION['USER_NAME'] = $Row['name'];
    $_SESSION['USER_REGDATE'] = $Row['regdate'];
    $_SESSION['USER_EMAIL'] = $Row['email'];
    $_SESSION['USER_COUNTRY'] = $Row['country'];
    $_SESSION['USER_AVATAR'] = $Row['avatar'];
    $_SESSION['USER_ACTIVE'] = $Row['active'];
    $_SESSION['USER_INVIT'] = $Row['invit'];
    $_SESSION['USER_MONEY'] = $Row['money'];
    $_SESSION['USER_GOLD'] = $Row['gold'];
    $_SESSION['USER_GROUP'] = UserGroup($Row['usergroup']);
Добавлено через 14 минут
Цитата Сообщение от Raisin Zn Посмотреть сообщение
MessageSend(2, 'Вы заработали 100 Р!');
Если интересно, могу сбросить код функции. Если в 2 словах, то 2 - переменная, отвечающая за тип сообщения (1 - ошибка, 2 - системное сообщение, 3 - информация), а "Вы заработали..." - это текст, записанный во втору переменную, которая передает само сообщение. Там еще риализована третья переменная, отвечающая за то, куда переотправлять пользователя. Я их для вывода ошибок делал, а потом уже дописал под все остальное с возможностью не прописывать третью переменную. Опять же, вернее всего, что выполнил все не самым простым и прямым способом, но я же учусь, на то она и практика, чтобы пытаться что-то сделать
0
0 / 0 / 0
Регистрация: 16.12.2015
Сообщений: 11
12.01.2016, 17:04  [ТС]
Вот скриншот для общего представления того, что у меня там делается.
Вот где 15 200 Р - выводится сумма денег из базы данных.
А "Системное сообщение...." - вывод этого сообщения.
Но Как было 15 200 о нажатия, так и остается. Только перезагрузка браузера помогает с этим справиться.
Миниатюры
Обновление переменной при нажатии на кнопку  
0
0 / 0 / 0
Регистрация: 16.12.2015
Сообщений: 11
12.01.2016, 17:22  [ТС]
В общем, получается, что кнопки работают так, как нужно, в базу данных запись идет, проблема только с выводом.
0
 Аватар для fanatikus
1932 / 1523 / 703
Регистрация: 17.11.2012
Сообщений: 6,585
12.01.2016, 18:15
простой примерчик
HTML5
1
2
3
4
5
<div id="result"></div><!--сюда, будем выводить сообщения-->
<p>На счету: <span id="chet">1000</span>
<form method="POST" action="">
    <input data-add="100" id="add" type="submit" name="job1" value="Заработать 100">
</form>
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$(function(){
    $('#add').click(function(e){
        e.preventDefault();
        var add = $(this).attr('data-add');
        $.ajax({
            url:'file.php',//адрес обработчика 
            type:'post',
            dataType: 'json',
            data: 'add='+add,
            success: function(mess){
                if(mess.result == '1')
                {
                    $('#result').html('Вы заработали 100 Р!');
                    var chet = $('#chet').text();
                    $('#chet').text(parseInt(chet) + parseInt(mess.add));
                }
            }
        })
        
    })
 
});
PHP
1
2
3
4
if (isset($_POST['add'])) {
    $result = array("result"=>"1","add"=>$_POST['add']);
    echo json_encode($result);
}
0
0 / 0 / 0
Регистрация: 16.12.2015
Сообщений: 11
12.01.2016, 18:36  [ТС]
Цитата Сообщение от fanatikus Посмотреть сообщение
простой примерчик
Приветствую! Не выходит у меня его воспроизвести. Кнопку жму - ничего не меняется (пробовал на отдельной странице, все как надо). Бяда.
Прошу прощения, попробовал на другом локальном сайте - работает, а на том, который нужен - нет. В чем может быть проблема?
0
 Аватар для fanatikus
1932 / 1523 / 703
Регистрация: 17.11.2012
Сообщений: 6,585
12.01.2016, 18:40
php должен быть в отдельном файле, а в аяксе прописать его адрес и все работает на ура.

JavaScript
1
 url:'file.php',//адрес обработчика
0
0 / 0 / 0
Регистрация: 16.12.2015
Сообщений: 11
12.01.2016, 18:47  [ТС]
Цитата Сообщение от fanatikus Посмотреть сообщение
php должен быть в отдельном файле, а в аяксе прописать его адрес и все работает на ура.
Это обязательно должно быть до закрытия head?
JavaScript
1
<script type="text/javascript">...</script>
0
 Аватар для fanatikus
1932 / 1523 / 703
Регистрация: 17.11.2012
Сообщений: 6,585
12.01.2016, 18:50
нет, можно и в конце страницы(где хотите)
1
0 / 0 / 0
Регистрация: 16.12.2015
Сообщений: 11
12.01.2016, 19:01  [ТС]
Цитата Сообщение от fanatikus Посмотреть сообщение
нет, можно и в конце страницы(где хотите)
Не поверите! На новом локальном сайте работает, а на предыдущем упорно отказывается. Но спасибо, попробую по частям перетащить всё со старого в новый и понять, в чем причина. Можно еще вопрос? Если не сложно, не могли бы написать еще примерчик, чтобы эта кнопка работала так: на нее нажали, прибавилось 100, а затем запустился бы таймер с блокировкой кнопки до его окончания.
Фишка в том, что таймер я более-менее понял, как делать, а вот как его с базой данных синхронизировать? Чтобы при обновлении страницы он не сбрасывался, а продолжался?

И еще вопросик, предыдущий код ведь тоже сбрасывается при обновлении, а вместе с
PHP
1
2
3
4
5
if (isset($_POST['add']))
{
    $UserLogin = $_SESSION['USER_LOGIN'];
    $q = mysqli_query($CONNECT, "UPDATE `users` SET `money` = `money` + 100 WHERE `login` = '$UserLogin'");
}
Работать отказывается. Я попытася так их совместить:
PHP
1
2
3
4
5
6
7
if (isset($_POST['add']))
{
    $UserLogin = $_SESSION['USER_LOGIN'];
    $q = mysqli_query($CONNECT, "UPDATE `users` SET `money` = `money` + 100 WHERE `login` = '$UserLogin'");
$result = array("result"=>"1","add"=>$_POST['add']);
    echo json_encode($result);
}
0
 Аватар для fanatikus
1932 / 1523 / 703
Регистрация: 17.11.2012
Сообщений: 6,585
12.01.2016, 23:07
Цитата Сообщение от Antropogen Посмотреть сообщение
Чтобы при обновлении страницы он не сбрасывался,
HTML5
1
<div>Осталось: <span id="timer_inp">40</span> сек.</div>
JavaScript
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
$(function(){
    setTimeout(timer,1000,'1');      
    init_timer();
}); 
 
function timer(a){
    if(a === '1')
    {
        if(localStorage.a !== undefined)
        {
            var obj = parseInt(localStorage.a);
        }
        else 
        {
            var obj=$('#timer_inp').text(); 
        }
    }
    else
    {
        var obj = parseInt(localStorage.a);
    }
 
    var objj = obj-1;
    $('#timer_inp').html(objj);
    localStorage.a = objj;
 
    if ($('#timer_inp').html() =='0')
    {
        localStorage.removeItem('a');
        alert('Время вышло');
        setTimeout(function(){},1000);
    } 
    else 
    {
        setTimeout(timer,1000,'0');
    }
}
 
function init_timer(){
    if(localStorage.a)
    {
        $('#timer_inp').html(localStorage.a);
    }
}
Добавлено через 1 минуту
Цитата Сообщение от Antropogen Посмотреть сообщение
а вот как его с базой данных синхронизировать?
в смысле, синхронизировать?
0
0 / 0 / 0
Регистрация: 16.12.2015
Сообщений: 11
13.01.2016, 00:08  [ТС]
За таймер спасибо огромное, но денежки при обновлении таки сбрасываются

Цитата Сообщение от fanatikus Посмотреть сообщение
в смысле, синхронизировать?
Ну т.е. чтоб даже при разрыве сессии не прерывался таймер, вот что я хотел сказать. Т.е. человек нажал на кнопку - прибавилось 100, начался отсчет, он делает что хочет - переходит на другие страницы, закрывает браузер, разлогинивается, а таймер идет. И когда он снова заходит на эту страницу - видит, сколько еще осталось.
Наверное, слишком много хотелок
0
 Аватар для fanatikus
1932 / 1523 / 703
Регистрация: 17.11.2012
Сообщений: 6,585
13.01.2016, 11:48
Цитата Сообщение от Antropogen Посмотреть сообщение
но денежки при обновлении таки сбрасываются
а денежки, никто и не делал, чтобы не сбрасывались. я дал просто пример, как сделать чтобы таймер продолжался после перезагрузки страницы

Добавлено через 3 минуты
Цитата Сообщение от Antropogen Посмотреть сообщение
переходит на другие страницы, закрывает браузер, разлогинивается, а таймер идет.
тогда нужно использовать базу, для хранения значений таймера
0
0 / 0 / 0
Регистрация: 16.12.2015
Сообщений: 11
13.01.2016, 15:40  [ТС]
Цитата Сообщение от fanatikus Посмотреть сообщение
тогда нужно использовать базу, для хранения значений таймера
Вот я как раз об этом, какими методами синхронизация с базой данных происходит? По идее, можно сохранять время начала и время таймера в секундах, а при входе на странице вытаскивать все это из базы, к времени начала прибавлять время таймера и если время прошло - разрешать еще нажать, а если нет - считать, сколько в базу перезаписывать время на текущее и кол-во секунд на те, что остались. Но это ж тоже будет какое-то время занимать и задержка будет. К тому же, как-то это еще надо будет присоединить к jQuery-коду.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.01.2016, 15:40
Помогаю со студенческими работами здесь

Php+js выполнение при нажатии на кнопку
Есть php код с ним идет js код. Нужно сделать так,чтобы они запускались вместе,при нажатии на кнопку Как это сделать? Вот так...

Подгрузка контента при нажатии на кнопку
Надо сделать, чтобы после нажатия на кнопку подгружались статьи из базы данных. То есть на странице отображается например 10 статей, а...

Вывести число +1,при нажатии на кнопку
Здравствуйте, надо чтоб при нажатии на кнопку, на странице вывелось число - 1. Если опять нажать на кнопку, так будет 2 и до десяти. Когда...

Действия выполняемые при нажатии на кнопку
как сделать чтобы при нажатии на кнопку, снизу кнопки был ответ в виде вывода даты времени (то что я пытался вставить в функцию) вот...

Не запускается скрипт при нажатии на кнопку
Есть код. При нажатии на кнопку должен запускаться скрипт из другого php файла. Но ничего не происходит. Помогите &lt;html&gt; ...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru