Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
1

Запрет многократного нажатия на кнопку на PHP

03.01.2016, 21:56. Показов 4734. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как запретить многократную отправку формы через button , иначе ломается счетчик верных ответов. Отвечаем на 1 вопрос верно нажав на нее +100500 раз, столько и выводит потом счетчик правильных ответов.

на чистом PHP это можно сделать не прибегая к java & ajax?

Кликните здесь для просмотра всего текста
PHP
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
<?
    error_reporting(E_ALL);
    header('content-type: text/html; charset=utf-8');
    include_once("bd.php");
    include("answer.php");
    
 
$end_line = "\n";
$difficulty = 1;
 
    if($_SESSION['count'] == 5){
        $_SESSION['count'] = 0;
        $difficulty++ ;
}
 
$query = mysql_query("SELECT q_id FROM question WHERE difficulty=$difficulty  ORDER BY RAND() LIMIT 1",$db);
 
$qrand1 = mysql_fetch_assoc($query);
foreach ($qrand1 as $qrand) {
    $qrand = (int)$qrand;
}
 
 
$query = "(SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
                FROM answer a  
                INNER JOIN question  q USING(q_id)   WHERE a.a_correct=1 AND q_id=$qrand  LIMIT 1)
                    UNION 
            (SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
                FROM answer a 
                INNER JOIN question q USING(q_id) WHERE a.a_correct=0  AND q_id=$qrand ORDER BY RAND() LIMIT 3)
             ORDER BY RAND()
                            ";
                            
$input = null;
$res = mysql_query($query) or die(mysql_error());
if($res){
    if(mysql_num_rows($res) > 0){
        while($row=mysql_fetch_assoc($res)){
            
            $quest  = $row['q_quest'];
            $hidden = ' <input type="hidden" name="quest" value="'.$row['q_id'].'">'.$end_line;
            $input  .= '<button name="answer" value ="'.$row['a_id'].'"> '.$row['a_answer'].' </button>'.$end_line; 
            
        }
        
    }
}   
 
 
?>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
</head>
<body>
<h4><?php echo 'score'.$end_line.$_SESSION['count'];?></h4>
<h2><?php echo $quest;?></h2>
<form action = "answer.php" method = "POST">
<?php echo $hidden.$input;?>
</form>
</body>
</html>


Кликните здесь для просмотра всего текста
PHP
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
<?
include_once('bd.php');
error_reporting(E_ALL);
session_start();
 
$q_id  = isset($_POST['quest'])?(int)$_POST['quest']:0;
$a_id = isset($_POST['answer'])?(int)$_POST['answer']:false;
if($q_id && $a_id){
    $query = "SELECT a_correct, q_quest, (SELECT MAX(q_id) FROM question) m_id
                FROM answer
                LEFT JOIN question USING(q_id)
                WHERE q_id=$q_id
                    AND a_id=$a_id";
    
    $res = mysql_query($query) or die(mysql_error());
    if($res){
        $row = mysql_fetch_assoc($res);
    
        if($row['a_correct']==1 and isset($_POST['answer'])){
            $_SESSION['count'] ++;
            header("Location: quest.php");
        }else{
            $_SESSION['count'] = 0;
            $difficulty = 1;
            header("Location: index.php");
        }
        
        
        $submit = '<input type="submit" value="Еще раз">';
        if($q_id >= $row['m_id']){
            $q_id = '0';
            $submit = '<input type="submit" value="Пройти тест ещё раз">';
        }
?>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
 
</head>
<body>
 
<h2><?php echo $message;?></h2>
<form action="quest.php" method="POST">
 <input type="hidden" name="quest" value="<?php echo $q_id;?>">
 <p><?php echo $submit;?></p>
</form>
</body>
</html>
<?php
    }
}
?>
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.01.2016, 21:56
Ответы с готовыми решениями:

После нажатия на кнопку выполнять сценарий php и javascript (или 2 сценария php)
народ, у мну такая проблема: мне нужно, что бы после нажатия на кнопку выполнялся сценарий php, и...

Возможность многократного нажатия при зажимании
Есть ли какая-нибудь программа, с помощью которой можно настроить определенную кнопку так, чтобы...

По событию нажатия на кнопку вызвать функцию, в которой ждать нового нажатия на ту же самую кнопку
type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); ...

Вытягивание из базы в текстовое поле, после нажатия на кнопку в PHP
Привет, мир! Можете помочь найти мою ошибку? Пишу след. вещь: Есть текстовая форма. Рядом...

18
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
03.01.2016, 22:22 2
Именно нажатие на кнопку средствами PHP запретить нельзя. Можно запретить повторное добавление данных в БД.
0
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
03.01.2016, 22:27  [ТС] 3
Цитата Сообщение от Jodah Посмотреть сообщение
Именно нажатие на кнопку средствами PHP запретить нельзя. Можно запретить повторное добавление данных в БД.
добавления там нету, там идет типо тест(викторина) человек отвечает на вопрос , если верно выводится след рандомный вопрос. В счетчик добавляется +1 , как только в счетчике натикало 5 верных ответов подряд, вопросы усложняются и выводятся уже более сложные.
А если нажать на 1 верный ответ +100500 раз то все ломается. С бд мы максимум работаем как с выборкой , ничего не инсертим.
максимум мы работаем с сессией , верное число ответов записывается в сессию
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
03.01.2016, 23:31 4
Цитата Сообщение от maruo Посмотреть сообщение
В счетчик добавляется +1
Добавляйте также идентификаторы вопросов, а при выборе верного ответа проверяйте, не отвечал ли юзер уже на этот вопрос.

И сложность, получается, тоже нужно хранить в сессии.
0
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
04.01.2016, 00:18  [ТС] 5
Цитата Сообщение от Jodah Посмотреть сообщение
Добавляйте также идентификаторы вопросов, а при выборе верного ответа проверяйте, не отвечал ли юзер уже на этот вопрос.
И сложность, получается, тоже нужно хранить в сессии.
А как собственно мне исключить эти вопросы на которые ответили?
Допустим я запишу их при выборке и запишу в массив из под сессии,а дальше как? Подкиньте индейку)

Код я выложил в первом посту

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$query = mysql_query("SELECT q_id FROM question WHERE difficulty=$difficulty  ORDER BY RAND() LIMIT 1",$db);
 
$qrand1 = mysql_fetch_assoc($query);
foreach ($qrand1 as $qrand) {
    $qrand = (int)$qrand;
}
 
 
$query = "(SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
                FROM answer a  
                INNER JOIN question  q USING(q_id)   WHERE a.a_correct=1 AND q_id=$qrand  LIMIT 1)
                    UNION 
            (SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
                FROM answer a 
                INNER JOIN question q USING(q_id) WHERE a.a_correct=0  AND q_id=$qrand ORDER BY RAND() LIMIT 3)
             ORDER BY RAND()
                            ";
первым запросом я рандомно генерирую ID вопроса которое опирается на сложность difficulity .
Потом уже привожу результат запроса к числу , и заношу в переменную $qrand и с ее помощью вытаскиваю уже все остальное
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
04.01.2016, 02:13 6
Цитата Сообщение от maruo Посмотреть сообщение
А как собственно мне исключить эти вопросы на которые ответили?
Допустим я запишу их при выборке и запишу в массив из под сессии,а дальше как?
Допустим, пользователь верно ответил на вопрос. Добавляем этот ответ в массив:
PHP
1
$_SESSION['answers'][] = $_POST['answer'];
И добавляем проверку, выбирал ли юзер ранее этот ответ:
PHP
1
2
if(in_array($_POST['answer'], $_SESSION['answers']))
    die('Этот ответ уже выбирался ранее.');
0
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
04.01.2016, 14:54  [ТС] 7
PHP
1
$_SESSION['answers'][] = $_POST['answer'];
Это дает фатальную ошибку []
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
04.01.2016, 17:34 8
maruo,
1. Код скрипта.
2. Точное описание ошибки.
0
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
04.01.2016, 22:07  [ТС] 9
ааа все у меня крышняк поедет скоро.
ДЕнь , целый день бьюсь с этой формой и кнопкой.
Не могу предотвратить на java повторное нажатие и отправка.
Прошу уже ткните носом где проблема.

пробовал убивать кнопку так
Javascript
1
onclick="this.disabled=true;Javascript:myform()"
как только не пытался даже так пытался убить форму.

Javascript
1
2
3
4
5
    $(document).ready(function(){
                $('#myform').on('submit', function(){ // myform - id формы
                    $('#myform input:submit').remove();  // убить кнопку нафиг
                })
            });
Если надо выложу еще раз код весь. И объясню где за что отвечает.
Если че весь код в первом посту
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
04.01.2016, 22:31 10
Цитата Сообщение от maruo Посмотреть сообщение
Не могу предотвратить на java повторное нажатие и отправка.
Некорректно ставите задачу.

Что происходит при отправке формы? Браузер посылает запрос серверу, сервер возвращает html-страницу, которую браузер отображает. Т.е. после отправки формы вы переходите на новую страницу, даже если её содержимое не отличается от старой.

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

На мой взгляд, самое простое - хранить верные ответы в сессиях/куках, об этом я писал ранее.

Можно ещё придумать что-нибудь с AJAX (отправка формы без перезагрузки страницы, после чего блок кнопки), но это будет значительно сложней, и опытный юзер легко обойдёт эту защиту.
0
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
04.01.2016, 22:42  [ТС] 11
Цитата Сообщение от Jodah Посмотреть сообщение
На мой взгляд, самое простое - хранить верные ответы в сессиях/куках, об этом я писал ранее.
Ммм как бы сказать, мне надо что бы когда дали ответ на вопрос он сразу проверился, и если не верно, то кыш отсюда нафиг
Помогите тогда исправить мне код, покажите где нужно исправить

Добавлено через 6 минут
и да хранить верные ответы в сессии не подойдет. Вопросов может быть +100500
и получается +100500 вопросов * +100500 вариантов ответов будет не логично.
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
04.01.2016, 22:45 12
maruo, ну это не идёт вразрез с моим предложением.

Проверяете правильность ответа. Если неправильный - "кыш".
Если правильный - проверяете в сессии, не отвечал ли юзер на этот вопрос (или давал ли он ранее такой же ответ, впринципе нет разницы), если не отвечал - идём дальше, если отвечал - "кыш".

Добавлено через 1 минуту
Цитата Сообщение от maruo Посмотреть сообщение
и да хранить верные ответы в сессии не подойдет. Вопросов может быть +100500
и получается +100500 вопросов * +100500 вариантов ответов будет не логично.
Я предлагаю хранить в сессии вопросы или ответы, которые были конкретным юзером пройдены. Разумеется, все существующие хранить нет смысла.
0
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
04.01.2016, 22:47  [ТС] 13
Цитата Сообщение от Jodah Посмотреть сообщение
Я предлагаю хранить в сессии вопросы или ответы, которые были конкретным юзером пройдены. Разумеется, все существующие хранить нет смысла.
Над этим я работаю уже по вашим подсказкам.
Но мне не дает покоя эта проблема с многократным нажатием , ведь пользователь просто сломает весь код этим клацаньем
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
04.01.2016, 23:00 14
maruo,
Цитата Сообщение от maruo Посмотреть сообщение
проблема с многократным нажатием
А разве это проблема? Ну тыкнет юзер несколько раз по кнопке, с тем же успехом можно зажать Ctrl+F5.
Цитата Сообщение от maruo Посмотреть сообщение
Помогите тогда исправить мне код, покажите где нужно исправить
Для этого нужно весь код полностью видеть, ну и разбираться долго...
Вот маленький пример концепции, тыкнуть любую из кнопок можно только 1 раз:
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
<?
    session_start();
 
    if(isset($_POST['start']))
    {
        if(!isset($_SESSION['arr']))
            $_SESSION['arr'] = array();
        
        if(!in_array($_POST['start'], $_SESSION['arr']))
        {
            $_SESSION['arr'][] = $_POST['start'];
            echo 'Вы сделали выбор!';
        }
        else
            echo 'Ошибка! Вы уже делали этот выбор!<br>';
            
    }
?>
 
<form method="post">
    Вы можете выбрать каждый из вариантов только 1 раз:<br>
    <input type="submit" name="start" value="Выбор 1" /><br>
    <input type="submit" name="start" value="Выбор 2" /><br> 
    <input type="submit" name="start" value="Выбор 3" /><br>
</form>
0
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
04.01.2016, 23:03  [ТС] 15
Цитата Сообщение от Jodah Посмотреть сообщение
А разве это проблема? Ну тыкнет юзер несколько раз по кнопке, с тем же успехом можно зажать Ctrl+F5.
Это еще какая проблема)
1 верный ответ 1 очко.
Что бы перейти на более сложные ответы нужно 5 верных ответов.
Если пользователь нажимает на верный ответ +100500 раз, то столько ему очков и прилетает, а далее вы уже понимаете в чем проблема.
Весь код я могу кинуть он не такой большой в принципе весь код в 1м посту
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
04.01.2016, 23:08 16
Цитата Сообщение от maruo Посмотреть сообщение
Это еще какая проблема)
1 верный ответ 1 очко.
Что бы перейти на более сложные ответы нужно 5 верных ответов.
А, ну это как раз описанным выше способом решается.
Цитата Сообщение от maruo Посмотреть сообщение
Весь код я могу кинуть он не такой большой в принципе весь код в 1м посту
Ок, кидайте, только посмотрю скорее всего завтра, сейчас уже время позднее.
0
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
05.01.2016, 14:38  [ТС] 17
quest.php
PHP
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<? 
    error_reporting(E_ALL);
    header('content-type: text/html; charset=utf-8');
    include_once("bd.php");
    include("answer.php");
 
 
 
$end_line = "\n";
$difficulty = 1;
 
    if($_SESSION['count'] == 5){
        $_SESSION['count'] = 0;
        $difficulty++ ;
}
 
$query = mysql_query("SELECT q_id FROM question WHERE difficulty=$difficulty  ORDER BY RAND() LIMIT 1",$db);
 
$qrand1 = mysql_fetch_assoc($query);
foreach ($qrand1 as $qrand) {
    $qrand = (int)$qrand;
}
 
 
$query = "(SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
                FROM answer a  
                INNER JOIN question  q USING(q_id)   WHERE a.a_correct=1 AND q_id=$qrand  LIMIT 1)
                    UNION 
            (SELECT q.q_id, q.q_quest, a.a_id, a.a_answer, a.a_correct
                FROM answer a 
                INNER JOIN question q USING(q_id) WHERE a.a_correct=0  AND q_id=$qrand ORDER BY RAND() LIMIT 3)
             ORDER BY RAND()
                            ";
                        
$input = null;
$res = mysql_query($query) or die(mysql_error());
if($res){
    if(mysql_num_rows($res) > 0){
        while($row=mysql_fetch_assoc($res)){    
            $_SESSION['data'][] = $row['q_id'];
             break ;
        }   
    }   
}
 
            if (in_array($row['q_id'],$_SESSION['data'])) {
    //echo "Этот вопрос уже выводился ранее</br>";
}
$res = mysql_query($query) or die(mysql_error());
if($res){
    if(mysql_num_rows($res) > 0){
        while($row=mysql_fetch_assoc($res)){
            
            $quest  = $row['q_quest'];
            $hidden = ' <input type="hidden" id="submit" name="quest" value="'.$row['q_id'].'">'.$end_line;
            $input  .= '<button name="answer" id="btnxxx"  value ="'.$row['a_id'].'"> '.$row['a_answer'].' </button>'.$end_line;    
            
        }
        
    }
    
}
 
 
 
//var_dump ($_SESSION['data']);
//unset($_SESSION['data']);
//echo '</br>'.$_SESSION['data']['16'];
 
 
?>
<!DOCTYPE html>
<html>
<head>
 
  <meta charset="utf-8" />
</head>
<body>
<script>
 
 
</script>
<h4><?php echo 'score'.$end_line.$_SESSION['count'];?></h4>
<h2><?php echo $quest;?></h2>
<form id="myform" onSubmit="document.getElementById('btnxxx').disabled=true" action="answer.php" method = "POST">
<?php echo $hidden.$input;?>
 
</form>
</body>
</html>


answer.php
PHP
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
<?
include_once('bd.php');
error_reporting(E_ALL);
session_start();
 
$difficulty = 1;
 
    if($_SESSION['count'] == 5){
        $_SESSION['count'] = 0;
        $difficulty++ ;
}
 
$q_id  = isset($_POST['quest'])?(int)$_POST['quest']:0;
$a_id = isset($_POST['answer'])?(int)$_POST['answer']:false;
if($q_id && $a_id){
    $query = "SELECT a_correct, q_quest, (SELECT MAX(q_id) FROM question) m_id
                FROM answer
                LEFT JOIN question USING(q_id)
                WHERE q_id=$q_id
                    AND a_id=$a_id";
    
    $res = mysql_query($query) or die(mysql_error());
    if($res){
        $row = mysql_fetch_assoc($res);
    
        if($row['a_correct']==1){
            $_SESSION['count'] ++;
            
            header("Location: quest.php");
        }else{
            $_SESSION['count'] = 0;
            $difficulty = 1;
            header("Location: index.php");
        }
        
        
        $submit = '<input type="submit" value="Еще раз">';
        if($q_id >= $row['m_id']){
            $q_id = '0';
            $submit = '<input type="submit" value="Пройти тест ещё раз">';
        }
?>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
 
</head>
<body>
 
<h2><?php echo $message;?></h2>
 
</form>
</body>
</html>
<?php
    }
}
?>


Добавлено через 15 часов 25 минут
Цитата Сообщение от Jodah Посмотреть сообщение
Можно ещё придумать что-нибудь с AJAX (отправка формы без перезагрузки страницы, после чего блок кнопки), но это будет значительно сложней, и опытный юзер легко обойдёт эту защиту.
А можно ли про этот способ узнать ? и как его пофиксить можно?
Что бы нельзя было обойти
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
05.01.2016, 15:06 18
Цитата Сообщение от maruo Посмотреть сообщение
Что бы нельзя было обойти
Чтобы нельзя было обойти - проверка всего на стороне сервера. А как это на клиенте реализовано - новый вопрос на новой странице, подгрузка вопросов аяксом, или еще что - не имеет значения.
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
05.01.2016, 17:17 19
Цитата Сообщение от maruo Посмотреть сообщение
А можно ли про этот способ узнать ? и как его пофиксить можно?
Что бы нельзя было обойти
Я с AJAX не очень хорошо знаком, лучше в разделе JavaScript спросить. Но, как сказали выше, любые проверки с помощью JS/AJAX легко обходятся. Если нужна надёжность - проверка только на стороне PHP.
0
05.01.2016, 17:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.01.2016, 17:17
Помогаю со студенческими работами здесь

После нажатия на кнопку TBitBtn сделать кнопку не действующей
Как после нажатия на кнопку bitbtn1 кнопка становилась не действушей


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru