2012-05-11 3 views
0

나는 PHP를 사용하여 가입 절차를 밟았습니다. 사용자가 가입 프로세스의 마지막 두 번째 페이지로 이동하면 모든 가입 세부 정보 요약과 제출 버튼 (기본적으로 확인 및 지불 버튼)이 표시됩니다. 이제 사용자가이 버튼을 클릭하면 모든 세부 정보가 SQL 데이터베이스에 게시되고 해당 사용자는 사용자 이름과 암호로 DB에 만들어집니다. 이제 문제는 제출 단추를 두 번 이상 클릭하면 데이터를 다시 제출하고 각 중복 항목에 동일한 세부 정보 (이름, 전자 메일 등)가 있지만 다른 사용자 이름과 암호가있는 중복 항목이 데이터베이스에 만들어집니다. 이 문제를 어떻게 방지합니까? 제출하고 다시 게시 할 수 있음을 알고 있지만 정확히 어떻게해야합니까? 나는이 코드를 구현하는 시도했지만 작동하지 않습니다 : http://www.bjw.co.nz/developer/general/75-how-to-prevent-form-resubmissionphp : 양식 재 게시 방지

감사

+1

을, 그러나 나는 처음으로 양식을로드 할 때 양식 키를 생성하는 것입니다 할 수있는 가장 쉬운 방법을 가정하고, :

이 당신을 도울 수 있습니다 그 키를 파일이나 데이터베이스에 저장합니다. 양식이 제출되면 키를 게시해야하며 수신하는 PHP 스크립트는 유효한 키의 파일 또는 데이터베이스에서 해당 키를 제거해야합니다. – Vulcan

+0

제출 단추를 비활성화 해 보셨습니까? –

답변

3

내가이 상황에서 자바 스크립트의 비트를 권합니다. 제출 버튼에 다음을 추가하십시오.

onclick="this.disabled=true;" 

이 버튼을 클릭하면 다시 버튼을 클릭 할 수 없게됩니다.

+0

Noscript를 사용하면 작동하지 않습니다.이것과 제가 제안한 것들의 조합은 훌륭하게 작동 할 것입니다. Stackoverflow 정말 복합 답변이 필요합니다 :) – sinni800

+0

사용자가 noscript가 설치되어있을만큼 똑똑하다면 버튼을 두 번 제출하지 않을 정도로 똑똑해야합니다. –

+1

사용자의 99 %가 javascript를 사용합니다. noscript가 설치된 양식은 양식 제출 방식을 이해합니다. – clem

3

$_SESSION을 사용하여 양식이 이미 제출되었는지 여부를 식별하는 PHP 세션에 값을 저장해야합니다. PHP 세션은 각 요청이 수행되는 동안 잠겨 있으므로 첫 번째 제출이이를 잠그면 두 번째 세션은 첫 번째 제출이 완료되고 값을 설정해야합니다. 두 번째 요청은 나중에 읽히고 이미 제출 된 값으로 설정됩니다.

다음은이 작업을 수행하는 방법의 예입니다. 한 사용자가 여러 번 등록을 한 번 수행하면 버그가 발생할 수 있습니다 (왜 그 사람이해야합니까?).

session_start(); 
$_SESSION["RegistrationSubmitted"] = false; 

이것은 사용자가 현재하고있는 등록이 아직 제출되지 않았 음을 말한다 : 양식의 제출 버튼을 포함하는 페이지에

, 당신은 마커를 설정해야합니다.

session_start(); 
if (isset($_SESSION["RegistrationSubmitted"]) { 
    if ($_SESSION["RegistrationSubmitted"] == true) { 
     die("Registration has already been submitted!"); 
    } else { 
     // Process registration here 
     $_SESSION["RegistrationSubmitted"] == true; 
    } 
} else { 
    die("Last registration page hasn't been reached! (A bot?)"); 
} 
+0

귀하의 답변 주셔서 감사합니다,하지만 문제는 이것입니다 : 나는 PHP를 알고 있지만이 잘되지 않습니다. 그래서 나는 이것을 어떻게 만드는지 모른다. 나는이 예제를 시도했다 : http://www.bjw.co.nz/developer/general/75-how-to-prevent-form-resubmission 또한 php를 아는 녀석의 도움을 받아서 그는 구현할 수 있었다. 이것도. 샘플 코드가 있습니까? 감사하겠습니다. 당신의 대답을 해결책으로 표시하고 싶습니다. 그러나 작동시키지 못하면 David의 javascript 솔루션과 함께 가야합니다. – DextrousDave

+0

@DextrousDave 여기에 있습니다 :) – sinni800

+0

감사합니다. 테스트 해보고 다시합니다. – DextrousDave

0

당신은 같은 형태의 키를 만들 수 있습니다 :

<input type="hidden" name="form-key" value="<?php echo $last_order_datetime; ?>" /> 

그런 경우 새로운 질서,이 값을 확인할 수 있습니다하기 (게시 된) 제출되고있는 페이지

$ _POST [ 'form-key']의 값이 저장된 가장 최근의 순서와 정확히 일치하는지 확인하십시오.

(있는 경우) 양식을 처리하십시오. 그 밖의 경우 다시 제출하거나 다른 시도입니다.

+0

값은 inspect 요소를 사용하여 조작 할 수 있습니다. 클라이언트 측 유효성 검사는 절대로 사용하지 않아야합니다. –

+0

유효성 검사는 서버에서 수행됩니다. 값을 바꿀 수 있습니다. 가장 최근의 주문과 일치하지 않는 한 값을 바꿀 수 있습니다. – Nate

+0

@Nate 전체 웹 사이트가 아닌 사용자 입장에서'$ last_order_datetime'입니까? 또한 : 상황으로 인해 한 건의 요청이 10 초 후에 발생한다면 어떻게해야합니까? 알아 두세요. 허용치를 주면됩니다. D – sinni800

1

PHP 코드 나 DOM을 사용하는 것 외에도 데이터베이스 테이블을 수정하여 고유 키를 사용하는 것이 좋습니다. 이 방법은 사용자가 제출 버튼을 몇 번 클릭했는지에 관계없이 데이터베이스는 간단하게 걱정하지 않습니다. 나는 형태와 같은 것을 해본 적이 없다 “INSERT IGNORE” vs “INSERT … ON DUPLICATE KEY UPDATE”

+0

저는 건축 적 견지에서 가장 좋은 대답을 말하고 싶습니다. 그러나 이것은 사람들이 일반적인 "AUTO_INCREMENT"스키마에서 벗어나야한다는 것을 의미합니다. 이런 식으로 데이터베이스를 처리하게하면 항상 좋은 선택입니다. 프로그램 코드를 통해 일관성 규칙을 적용하는 것은 너무나 못생긴 일입니다. 나는 방금 데이터베이스를 사용하여 내용을 확인하지 않은 많은 사람들을 만났습니다. D – sinni800

관련 문제