2017-12-04 4 views
-1

안녕하십니까, 시간 내 주셔서 감사합니다!PHP 양식은 이메일과 이름이 유효하지 않은 경우에도 이메일을 보냅니다.

PHP를 처음 사용했지만 필자는 PHP 폼을 작성해 왔으며 지금까지 필드의 유효성을 검사 할 수 있었으며 폼이 필드를 검증 할 수있게 만들었습니다. 비어 있습니다. ... "이름"및 "전자 메일"필드에 유효성 검사 필터가 있습니다 ... "이름"은 "문자 및 공백"을 초과 할 수 없으며 "전자 메일"은 "잘못된 전자 메일 형식"을 허용하지 않습니다. .

예 : 이름 :하지 ... 주제 및 메시지 유효성 검사 필터가없는 이메일 주소 ... 문제는

, 그 무엇이든된다 Rob3rt ... 그것은 숫자 이메일을 가지고 "이름"과 "이메일"에 쓰여진 정보가 유효성 필터와 일치하지 않는 경우에도 양식이 전자 메일을 보냅니다 ...

Q : 양식을 보관할 수있는 방법은 무엇입니까? 모든 필드가 정확한 정보를 가질 때까지 전자 메일을 보냅니 까? 에러가 발생하면 당신이 결코 확인하지 않기 때문에 당신이 메일을 보내기 전에 필드가 비어 있지 않은 경우에만 확인되어,

// This is the validation code // 
 

 
<?php 
 

 
// define variables and set to empty values 
 
$nameErr = $emailErr = $commentErr = $subjectErr = ""; 
 
$name = $email = $comment = $subject = ""; 
 

 
if ($_SERVER["REQUEST_METHOD"] == "POST") { 
 
    
 
    if (empty($_POST["name"])) { 
 
    $nameErr = "<h5>Name is required</h5>"; 
 
    } else { 
 
    $name = test_input($_POST["name"]); 
 
    // check if name only contains letters and whitespace 
 
    if (!preg_match("/^[a-zA-Z ]*$/",$name)) { 
 
     $nameErr = "<h5>Only letters and white space allowed</h5>"; 
 
    } 
 
    } 
 
    
 
    if (empty($_POST["email"])) { 
 
    $emailErr = "<h5>Email is required</h5>"; 
 
    } else { 
 
    $email = test_input($_POST["email"]); 
 
    // check if e-mail address is well-formed 
 
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
 
     $emailErr = "<h5>Invalid email format</h5>"; 
 
    } 
 
    } 
 

 
    if (empty($_POST["comment"])) { 
 
    $commentErr = "<h5>Message is required</h5>"; 
 
    } else { 
 
    $comment = test_input($_POST["comment"]); 
 
    } 
 
    
 
if (empty($_POST["subject"])) { 
 
    $subjectErr = "<h5>Subject is required</h5>"; 
 
    } else { 
 
    $subject = test_input($_POST["subject"]); 
 
    } 
 
    
 
} 
 

 
function test_input($data) { 
 
    $data = trim($data); 
 
    $data = stripslashes($data); 
 
    $data = htmlspecialchars($data); 
 
    return $data; 
 
} 
 

 
?> 
 

 
<form> 
 
Form comes here  
 
</form> 
 

 
// This is the sending code... I think the problem is here... // 
 

 
<?php 
 

 
if($_POST['name']!="" && $_POST['email']!="" && $_POST['comment']!="" && $_POST['subject']!="") { 
 

 
$to = "[email protected]"; 
 
$email = "From: " . $email . "\r\n"; 
 
$subject = "" . $subject . "\r\n"; 
 
$comment = "" . $comment . "\r\n"; 
 

 
mail($to,$subject,$comment,$email); 
 
    echo "good"; 
 
    } 
 
    else { 
 
    "bad"; 
 
    } 
 
    
 
?>

+3

** 코드가 너무 많습니다 **. 이 문제를 직접 해결하는 것이 좋습니다. 우리는 디버거가 아닙니다. ** 문제를 격리하고 거기에서 디버그해야합니다. 걸린 경우 [** 최소, 완료 및 확인 가능한 예제 **] (http://stackoverflow.com/help/mcve)로 ** 작동하지 않는 사항에 대한 명확한 설명 **을 제공하십시오.나는 ** [ask] ** 좋은 질문과 ** [완벽한 질문] (http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/) **을 읽어 보시기 바랍니다. 또한 ** [둘러보기] **를 읽고 ** [this] (// meta.stackoverflow.com/questions/347937/)**을 읽으십시오. –

+3

메일을 보낼 때 빈 양식 값 외에는 아무것도 확인하지 않습니다. 그래서 다른 잘못된 데이터가 허용됩니다. –

+0

나는 이미 문제가 있다고 생각하는 지점으로 코드를 압축했다 ... 그러나 나는 무엇을 그리고 어디에서 코드를 써야하는지 정확히 알지 못한다 ... – Manuel

답변

0

그것은 작동하지 않습니다 : 여기에

코드입니다 .

가장 간단한 방법은 다시 빈 필드를 검사 할 필요없는이 없다가

if ($_SERVER['REQUEST_METHOD'] === 'POST' && $nameErr === '' && $emailErr === '' && $commentErr === '' && $subjectErr === '') { 

if($_POST['name']!="" && $_POST['email']!="" && $_POST['comment']!="" && $_POST['subject']!="") { 

를 대체 해결하기 위해, 당신은 이미 당신은 단지 필요하므로, 이전을 완료했다 양식을 게시 중이며 모든 오류가 비 었는지 확인하십시오.

일반적으로 코드를 개선하는 방법에 대한 몇 가지 조언

:

1) 한 번에 한 번 아래의 양식 및 위의 두 위치()에서 HTTP의 POST를 처리하지 마십시오. 하나의 PHP 코드 블록으로 병합하십시오.

2) 사용자가 사이트를 다시로드하여 성공적인 양식을 다시 제출할 수 없도록해야합니다. 제출이 완료되면 페이지를 리디렉션하십시오. 이런 식으로 뭔가가 :

mail($to,$subject,$comment,$email); 
header('Location:' . $_SERVER['REQUEST_URI'] . '?status=ok'); 
exit(); 

3) PHP에서 HTML을 분리하거나 유지하기 힘들어 큰 파일로 끝날 것입니다. HTML 양식을 별도의 파일에 넣고 include을 입력하십시오.

imho 양식의 가장 좋은 해결책은 JavaScript로 위생 처리하고 AJAX (각도, 반응, jQuery 등)를 사용하여 제출하고 PHP에서 처리하고 (데이터를 다시 살균합니다) 4xx HTTP를 보냅니다. 헤더에 오류가 발생하면 오류 메시지를 JSON 객체로 반환합니다. JSON 객체는 JavaScript에서 사용됩니다.

관련 문제