PHP에서 양식을 제출할 때 네트워크 속도 등으로 인해 페이지가 갑자기 느리게 로드될 수 있습니다. 사용자가 제출 버튼을 반복적으로 클릭하면 데이터베이스에 여러 개의 데이터가 생성되어 통제할 수 없는 상황이 발생할 수 있습니다. 그렇다면 이 문제를 피하고 해결하는 방법은 무엇입니까? 아래를 살펴보겠습니다.
머리말
왜 양식 제출을 반복적으로 피해야 합니까? 우리는 서버가 불필요한 데이터를 반복적으로 처리하는 것을 원하지 않으며 데이터베이스에서 중복 데이터가 생성되는 것을 방지하기 때문에 반복적인 양식 제출을 피하는 것도 웹사이트를 더 안전하게 만드는 방법입니다.
먼저, 양식 반복 제출이 발생할 수 있는 상황을 살펴보겠습니다. 양식 반복 제출이 발생할 수 있는 상황을 아는 것은 양식 반복 제출 상황을 근본 원인으로 처리하는 데 도움이 될 수 있습니다.
다음 상황에서는 양식이 반복적으로 제출됩니다.
제출 버튼을 두 번 클릭하세요.
새로고침 버튼을 클릭하세요.
브라우저 뒤로 버튼을 사용하여 이전 작업을 반복하면 양식이 반복적으로 제출됩니다.
양식을 반복적으로 제출하려면 브라우저 기록을 사용하세요.
브라우저에서 HTTP 요청을 반복했습니다.
웹페이지가 악의적으로 새로 고쳐졌습니다.
다음은 몇 가지 해결 방법입니다.
One: js를 사용하여 클릭 후 버튼이 회색으로 변하도록 설정합니다.
<form name=form1 method=”POST” action=”/” target=_blank> <p> <input type=”text” name=”T1″ size=”20″> <input type=”button” value=”提交” onclick=”javascript:{this.disabled=true;document.form1.submit();}”> </p> </form>
버튼을 클릭하면 버튼이 회색으로 변하여 클릭할 수 없습니다. 사용자는 다시 클릭해야 합니다. 양식을 제출하려면 페이지를 새로 고치고 데이터를 다시 입력한 다음 제출해야 합니다.
둘: session
을 사용하여 session
에 특수 표시를 추가하세요. 양식 페이지가 요청되면 특수 문자열이 생성되어 session
에 저장되고 양식의 숨겨진 필드에 배치됩니다. Form 데이터를 접수 및 처리할 때 식별문자열이 존재하는지 확인하고 즉시 세션에서 삭제한 후 정상적으로 데이터를 처리합니다. session
中放一个特殊标志。当表单页面被请求时,生成一个特殊的字符标志串,存在session
中,同时放在表单的隐藏域里。接受处理表单数据时,检查标识字串是否存在,并立即从session中删除它,然后正常处理数据。
如果发现表单提交里没有有效的标志串,这说明表单已经被提交过了,忽略这次提交。
这使你的web应用有了更高级的XSRF
保护
加载提交的页面时候,生成一个随机数,
$code = mt_rand(0,1000000);
存储在表单的隐藏输入框中:
d865d2dc9c0570d458002786a778230f
在接收页面的PHP代码如下:
<?php session_start(); if(isset($_POST[‘code'])) { if($_POST[‘code'] == $_SESSION[‘code']){ // 重复提交表单了 }else{ $_SESSION[‘code'] =$_POST[‘code']; //存储code } }?>
三:利用cookies
原理和session
差不多,但是cookies
一旦用户浏览器禁用cookies
,这功能就失效了
if(isset($_POST[‘submit'])){ setcookie(“tempcookie”,””,time()+30); header(“Location:”.$_SERVER[PHP_SELF]);exit(); } if(isset($_COOKIE[“tempcookie”])){ setcookie(“tempcookie”,””,0);echo “您已经提交过表单”; }
四:利用header函数跳转
一旦用户点击提交按钮,处理完数据后跳到其他页面
if (isset($_POST[‘submit'])) { header(‘location:success.php');//处理数据后,转向到其他页面 }
五:利用数据库来添加约束
直接在数据库里添加唯一约束或创建唯一索引,一旦发现用户重复提交了,直接抛出警告或者提示,或者只处理第一次提交的数据,这是最直接有效的方法,要求前期的数据库设计和架构要考虑周全.
六:Post/Redirect/Get模式。
在提交后执行页面重定向,这就是所谓的Post-Redirect-Get (PRG)
XSRF
보호 기능이 제공됩니다. 제출된 페이지를 로드할 때 임의의 숫자가 생성됩니다. $code = mt_rand(0,1000000)
다음 형식의 숨겨진 입력 상자에 저장됩니다.
d865d2dc9c0570d458002786a778230f
수신 페이지의 PHP에서 코드는 다음과 같습니다.
if (isset($_POST[‘action']) && $_POST[‘action'] == ‘submitted') { //处理数据,如插入数据后,立即转向到其他页面 header('location:submits_success.php'); }
세션
과 유사하지만 사용자의 브라우저가 쿠키
를 비활성화하면 쿠키
code>cookiescode>, 이 기능은 유효하지 않습니다
사용자가 제출 버튼을 클릭하면 데이터 처리 후 다른 페이지로 이동
rrreee
🎜다섯 번째: 데이터베이스를 사용하여 제약 조건을 추가하세요🎜🎜🎜사용자가 반복적으로 제출한 것으로 확인되면 경고 또는 프롬프트가 직접 표시됩니다. 처음 제출된 데이터만 처리됩니다. 이것이 가장 직접적이고 효과적인 방법입니다. 이 방법은 초기 데이터베이스 설계 및 아키텍처에 대한 철저한 고려가 필요합니다.🎜🎜🎜Six: Post/Redirect/Get 모드. 🎜🎜🎜제출 후 페이지 리디렉션을 수행하는 것이 소위PRG(Post-Redirect-Get)
패턴입니다. 즉, 사용자가 양식을 제출하면 클라이언트 측 리디렉션을 수행하고 제출 성공 정보 페이지로 이동합니다. 🎜🎜🎜rrreee🎜🎜🎜🎜🎜Summary🎜🎜🎜🎜위는 PHP가 양식 양식의 반복 제출을 해결하고 방지하는 몇 가지 방법입니다. 위의 방법을 통해 사용자가 F5 키를 눌러 발생하는 반복 제출을 피할 수 있습니다. 반복적인 브라우저 양식 제출에 대한 경고가 표시되고 브라우저에서 앞으로 및 뒤로를 눌러 발생하는 동일한 문제가 제거됩니다. 이 글이 모든 분들의 공부와 업무에 조금이나마 도움이 되었으면 좋겠습니다. 🎜🎜🎜🎜관련 권장 사항: 🎜🎜🎜🎜PHP에 구현된 로그인, 등록 및 비밀번호 수정 기능🎜🎜🎜🎜🎜PHP 익명 기능 및 주의 사항에 대한 자세한 설명🎜🎜🎜🎜🎜PHP에서 call_user_func_array 콜백 함수 사용🎜 🎜 🎜🎜 🎜 🎜🎜🎜🎜위 내용은 반복적인 양식 제출을 해결하고 방지하는 PHP 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!