재인쇄: http://www.hlmblog.com/183.html
양식 제출 시 네트워크 속도 등으로 인해 페이지가 갑자기 느리게 로드될 수 있으며, 사용자가 반복적으로 제출 버튼을 누르면 데이터베이스에 여러 데이터 조각이 생성되어 제어할 수 없는 상황이 발생합니다.
예를 들어, 다음 상황에서는 양식이 반복적으로 제출됩니다.
제출 버튼을 두 번 클릭하세요.
새로고침 버튼을 클릭하세요.
브라우저 뒤로 버튼을 사용하여 이전 작업을 반복하면 양식 제출이 반복됩니다.
브라우저 기록을 사용하여 양식을 다시 제출하세요.
브라우저에서 HTTP 요청이 중복되었습니다.
웹페이지가 악의적으로 새로 고쳐졌습니다.
다음은 몇 가지 해결 방법입니다.
첫 번째: js를 사용하여 버튼을 클릭한 후 버튼이 회색으로 바뀌도록 설정
$(document).ready(function(){ $(input:submit).click(){ setTimeout(function(){obj.disabled=true;},100) }; });
두 번째: 세션 사용
세션(양식이 요청될 때 생성된 태그)은 양식의 숨겨진 필드에 저장됩니다.
양식 데이터를 받은 후 플래그 값이 있는지 확인하고 먼저 삭제한 후 데이터를 처리하는 방법을 사용합니다. 데이터가 없으면 제출되었음을 의미하므로 이 제출은 무시됩니다. .
//服务端生成随机数存入session, 分配至表单页 $data['sess_id'] = $_SESSION['sid'] = mt_rand(1000, 9999); $this->load->view('form', $data); //表单页隐藏域存放此session值 <input type="hidden" name="sid" value="<?=$sess_id; ?>"> //处理 if($_POST['sid'] != '' && $_POST['sid'] == $_SESSION['sid']) { unset($_SESSION['sid']); echo '处理数据'; } else { echo '已提交过表单'; }
세: 쿠키 사용
원리는 세션과 유사하지만, 사용자의 브라우저에서 쿠키를 비활성화하면 이 기능은 무효화됩니다
if(isset($_POST['submit'])){ setcookie("tempcookie","",time()+30); header("Location:".$_SERVER[PHP_SELF]);exit(); } if(isset($_COOKIE["tempcookie"])){ setcookie("tempcookie","",0);echo "您已经提交过表单"; }
넷째: 헤더 기능을 사용하여 점프
사용자가 제출 버튼을 클릭하면 데이터 처리 후 다른 페이지로 이동
if (isset($_POST['submit'])) { header('location:success.php');//处理数据后,转向到其他页面 }
5: 데이터베이스를 사용하여 제약 조건 추가
고유 제약 조건을 직접 추가하거나 데이터베이스에 고유 인덱스를 생성합니다. 사용자가 반복적으로 제출한 것으로 확인되면 경고 또는 프롬프트가 직접 표시됩니다.
또는 처음 제출된 데이터만 처리되는 것이 가장 좋은 방법입니다. 직접적이고 효과적인 방법을 사용하려면 초기 데이터베이스 설계 및 아키텍처를 신중하게 고려해야 합니다.
위 내용은 관련 측면을 포함하여 양식 양식의 반복 제출을 해결하고 방지하는 PHP 방법을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.