2011-08-04 1 views
1

저는 PHP로 양식을 작성하고 있습니다. 양식을 표시 한 다음 $ _POST 변수에서 제출 된 값을 가져 오는 방법을 알고 있으며 변수에 대한 유효성을 검사하고 입력에 따라 "감사합니다"또는 "오류"페이지를 표시하는 방법을 알고 있습니다.클라이언트 쪽 특성이있는 서버 쪽 양식 제출 스크립트는 어떻게 만듭니 까?

어떻게해야할지 모르겠지만 클라이언트 측 시스템을 만들면 사용자가 '뒤로'버튼을 눌러도 별도의 화면이 표시 되더라도 처음부터 수집 한 정보를 가져갈 수 있습니다. 잘못 입력 된 입력란 옆에 '올바른 이메일 주소를 입력하십시오.'또는 '이름이 필수 입력란입니다.'와 같은 동적 오류 메시지를 제출하고 표시하십시오. 또한 이전에 제출 한 데이터 중 유효한 데이터를 검색하여 양식에 채워서 사용자가 입력 한 모든 것을 잃어 버리지 않도록하십시오.

PHP에서 이와 같은 작업을 수행하는 올바른 방법은 무엇입니까? 원래는 입력 형식 = "숨김"태그를 사용하여 오류 메시지 배열을 다시 전달할 수 있다면 PHP를 사용하여 내 값을 표시하고 메시지를 동적으로 표시 할 수 있다고 생각했지만 계속 그 접근 방식에 머물러 있습니다.

+0

"사용자가 뒤로 버튼 누르기"부분을 제외하고 대부분의 질문을받는 것 같습니다. 그들이 그렇게 할 때 당신은 무엇을하고 싶니? 일반적으로이 동작은 브라우저에서 제어합니다. – NullUserException

+0

"back"이라고하는 html 버튼이있는 화면을 표시하는 것은 on.click = "location = ''"으로 프로그래밍되고 내 페이지 URL로 다시 가리키는 것을 의미합니다. – Chiubaka

답변

3

당신은 오류를 PHP가 세션을 추가 할 수 있지만,이 열려 여러 브라우저 탭이있는 사용자에 대한 문제를 만듭니다.

내 선호하는 방법은 양식을 동일한 페이지에 제출하고 해당 페이지에 직접 오류를 넣어 사용자가 뒤로 버튼을 클릭 할 필요가 없도록하는 것입니다. 직접 양식 필드를 강조 표시 할 수 있습니다 그런 식으로 (배경을하거나 유사한 빨간색 또는 뭔가를 설명합니다.)

<input type="text" 
    <?php (empty($_POST['field']?'style="backgroung-color: red;"':''))?> 
    name="field" value="<?php echo $_POST['field']?>" /> 

당신은 이전 값을 얻을 수 <input type="text" name="field" value="<?php echo $_POST['field']?>" />를 넣을 수 있습니다.
웹은 기본적으로 상태 비 저장이므로 뒤로 버튼을 눌렀을 때 사용자가 수행 한 작업을 추적 할 수있는 좋은 방법은 없습니다. 숨겨진 iframe을 사용하여 작동하는 해킹이 있지만 그게 당신이 찾고있는 것이 더 많은 문제입니다.

3

서버 논리와 클라이언트 논리를 혼합하지 마십시오. 똑같은 스크립트가 양식을 출력하고 입력을받을 수 있습니다. 입력이 성공적으로 확인되면 계속 진행됩니다. 그렇지 않은 경우 양식을 다시 표시합니다. 이번에는 오류 메시지와 이미 입력 된 데이터가 표시됩니다.

사용자가 다음 번에 양식을 제출하면 유효성 검사가 성공적으로 통과 될 때까지 유효성 검사가 다시 시작됩니다.

입력 값과 오류 메시지가 포함 된 양식을 확장했지만 플래그가 지정된 경우에만 표시합니다.

$_POST 옆에 추가 변수를 바로 수행 할 수 있습니다 - 또는 당신이 그것을 좋아하는 경우 - (당신이 좋아하는 것에 대해 부담이 될 수 있음) 젠드 프레임 워크와 같은 프레임 워크에서 완전한 형태의 추상화를 사용하거나 단지와 인기있는 HTML_QuickForm2과 같은 라이브러리/구성 요소.

편집 :

이 전반적인 방법론을 입증하는 매우 베어 코드가 라이브러리를 사용하는 경우가 훨씬 좋네요, (그리고 당신이 그것을 대신 실제에 집중할 수 코딩 할 필요가 없습니다 상단의 정의와 같은 형식). 이 코드는 사용하는 것보다 흐름을 읽고 이해하는 데 더 유용합니다. 신속하게 입력하여 구문 오류가 발생했으며 기능이 완벽하지는 않습니다. 이것은 단지 하나의 이메일 필드가, 심지어 제출 버튼을 누락되었습니다

/* setup the request */ 
$request->isSubmit = isset($_POST['submit']); 

/* define the form */ 
$form->fields = array 
(
    'email' => array 
    (
     'validate' => function($value) {return filter_var($value, FILTER_VALIDATE_EMAIL);}, 
     'output' => function($value, $name) {return sprintf('<input type="text" value="%s" id="%s">', htmlspecialchars($value), htmlspecialchars($name)}, 
     'default' => '[email protected]', 
    ), 
); 

/** 
* Import form data from post request 
* 
* @return array data with keys as field names and values as the input strings 
*    or default form values. 
*/ 
function get_form_post_data($form, $request) 
{ 
    $data = array(); 
    foreach($form->fields as $name => $field) 
    { 
     $data[$name] = $field->default; 
     if ($request->isSubmit && isset($_POST[$name])) 
     { 
      $data[$name] = $_POST[$name]; 
     } 
    } 
    return $data; 
} 

/** 
* Validate form data 
*/ 
function validate_form_data($form, $data) 
{ 
    foreach($form->fields as $name => $field) 
    { 
     $value = $data[$name]; 
     $valid = $field['validate']($value); 
     if (!$valid) 
     { 
      $form->errors[$name] = true; 
     } 
    } 
} 

function display_form($form, $data) 
{ 
    foreach($form->fields as $name => $field) 
    { 
     $value = isset($data[$name]) ? $data[$name] : ''; 
     $hasError = isset($form->errors[$name]); 
     $input = $field['output']($name, $value); 
     $mask = '%s'; 
     if ($hasError) 
     { 
      $mask = '<div class="error"><div class="message">Please Check:</div>%s</div>'; 
     } 
     printf($mask, $input); 
    } 
} 


// give it a run: 

# populate form with default values -or- with submitted values: 
$form->data = get_form_post_data($form, $request); 

# validate form if there is actually a submit: 
if ($request->isSubmit) 
{ 
    validate_form_data($form, $form->data); 
} 

# finally display the form (that can be within your HTML/template part), works like echo: 
display_form($form, $form->data) 
+0

그래서, 나는이 같은 모습을하고있어 무엇의 기본 구조 :?! '경우 (!의는 isset은 ($ _ POST는 [ '제출'])) { > <- 양식 코드가 간다 -> < ? php else { // 폼 유효성 검사 // 유효성 검사에 실패하면 오류를 나타내는 메시지와 뒤로 이동하는 버튼을 표시하고 '을 통해 현재 수집 된 데이터를 양식으로 다시 보내려고합니다. 올바르게 이해하면 스크립트 구조가 정확합니까? 그렇다면 메시지를 처리하고 표시하기 위해 데이터를 양식으로 다시 보내는 방법을 이해하지 못하고 있다고 생각합니다. – Chiubaka

+0

@ daniechiu : 폼 로직을 함수로 캡슐화하는 방법을 보여주는 코드를 추가했습니다. 따라서 통합이 쉬워집니다. 이것은 기본적으로'isset ($ _ POST [ 'submit']) '과 같이 제안하지만 모든 것을 좀 더 모듈화하게 만드는 것과 같은 원리입니다. 라이브러리를 사용하면 첫 번째 양식뿐만 아니라 추가 양식을 사용하여 많은 시간을 절약 할 수 있습니다. 또한 라이브러리 코드를 읽기 시작하면 훨씬 더 빨리 배울 수 있습니다. – hakre

+0

그래서 알아 냈어. 현재의 양식이 이미 같은 페이지에 제출되었고,이 스레드에 대한 몇 가지 답변을 읽은 후에 필요한 경우 오류 메시지가있는 양식을 다시 표시하는 다른 분기를 만들 수 있다는 것을 깨달았다. 이것에 시간을내어 주셔서 감사합니다! 코드가 정말 흥미로 워서 캡슐화를 사용하여 다시 구현할 수도 있습니다. – Chiubaka

0

양식을 사용하여 동일한 페이지에 제출하고 양식의 유효성을 검사 할 경우 헤더를 사용하여 사용자를 감사 페이지로 리디렉션하십시오.

header("Location: thank-you.php"); 

양식이 유효성 검사에 실패하면 동일한 페이지에 모든 오류를 쉽게 표시 할 수 있습니다.

관련 문제