2017-11-23 4 views
0

저는 웹 개발을 배우는 PHP와 JavaScript에 익숙하지 않으며 자유로운 시간에 모든 것을 시도하고 있습니다. 그러나 해결책을 찾을 수없는 한 가지가 있습니다. . 4 개의 데이터, 이름, 생년월일, 이메일 및 전화 번호 만 수집하는 양식이 있습니다. 모든 필드는 추가 데이터 처리에 필요합니다. 나는 문자 그대로 Google에서 찾은 모든 것을 시도했지만 여전히 작동하지 않습니다. 이 양식은 입력 필드를 확인하지 않고 모든 종류의 데이터를 데이터베이스에 저장합니다.PHP 폼 유효성 검사가 작동하지 않습니다.

나중에 코드가 양식의 유효성을 검사하고 다른 페이지의 ".php"가 아닌 동일한 페이지에 오류를 표시하고 사람에게 확인 이메일을 보내고 나를 알려주는 이메일 2 개를 보내고 싶습니다. 양식 제출에 대해. 이를 달성하기 위해 무엇을해야합니까? 나는 atm에 아주 찔 렸다 고 느낀다.

내 양식 : 질문 선명도에 대한 코드를 포맷하는 동안

<form class="contactform" id="cfrm" action="process.php" method="post"> 
    <div class="f-data"> 
     <input class="f-error" name="uname" placeholder="NAME" type="text" required="required" data-error="Name is required."> 
    </div> 
    <div class="clear"></div> 
    <div class="f-data"> 
     <select name="birthday" id="forminput" aria-required="true" aria-invalid="false"> 
      <option value="11">11</option> 
      <option value="12">12</option> 
     </select> 
     <select name="birthyear" id="forminput" aria-required="true"> 
      <option value="1900" selected="selected">1900</option> 
      <option value="2001">2001</option> 
     </select> 
    </div> 

    <div class="f-data"> 
     <input class="f-error" name="uemail" placeholder="EMAIL" type="text" required="required" data-error="Email is required."> 
    </div> 

    <div class="f-data"> 
     <input class="f-error" name="uphone" placeholder="PHONE" type="text" required="required" data-error="Phone is required."> 
    </div> 

    <div class="clear"></div> 

    <div class="submit"> 
     <p> 
      <input type="submit" value="submit" name="submit"> 
     </p> 
    </div> 

과 process.php

<?php 

require "connection.php"; 
require "others/phpmailer/PHPMailerAutoload.php"; 

//form data 
$connection = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname); 
$Name = $connection->real_escape_string($_POST['uname']); 
$DoB = $connection->real_escape_string($_POST['birthyear'] . '-' . 
$_POST['birthmonth'] . '-' . $_POST['birthday']); 
$inputDoB = date("Y-m-d",strtotime($DoB)); 
$Email = $connection->real_escape_string($_POST['uemail']); 
$Phone = $connection->real_escape_string($_POST['uphone']); 

if (strlen($agree) == 0) $agree = 0; 

// validating 
if(isset($_POST['submit'])); 
{ 
    if(empty($_POST['uname'])) 
    { 
     $msg_name = "You must enter name"; 
     $name_subject = $_POST['uname']; 
     $name_pattern = '/^[a-zA-Z ]*$/'; 
     preg_match($name_pattern, $name_subject, $name_matches); 
     if(!$name_matches[0]) 
      $msg2_name = "Only alphabets and white space allowed"; 
     } 

     if(empty($_POST['uemail'])) 
     { 
      $msg_email = "You must enter your email"; 
      $email_subject = $_POST['uemail']; 
      $email_pattern = '/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/'; 
      preg_match($email_pattern, $email_subject, $email_matches); 
      if(!$email_matches[0]) $msg2_email = "Must be a valid email address"; 
     } 

     if($_POST['uphone']) 
     { 
      $phone = $_POST['uphone']; 
      preg_match('/^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z {2,3})$/i', $phone, $phone_match); 
      if(!$phone_match[0]) $msg_phone = "Must be a valid phone number"; 
      if(strlen($phone)!='8') $msg2_phone = "Must be at least 8 characters long"; 
     } 
    } 
    //save to db 
    $query = "INSERT INTO form (Name,DoB,Email,Phone,Date) VALUES ('$Name','$DoB','$Email','$Phone', CURRENT_TIMESTAMP)"; 

    $success = $connection->query($query); 

    if (!$success) { 
     die("Couldn't enter data: ".$connection->error); 
    } 

    echo "Thank You For Contacting Us"; 

?> 
+0

안녕하세요! "폼이 입력 필드를 확인하지 않고 모든 종류의 데이터를 데이터베이스에 저장합니다"라는 의미를 확장 할 수 있습니까? 코드를 보면 해당 필드의 데이터 만 삽입해야합니다. 생성 된 데이터베이스 행에 대한 예제를 제공 할 수 있습니까? 감사! –

+0

나는 uemail이 비어 있는지 확인한 다음 그 빈 값에 변수를 할당하는 이유에 대해 약간 혼란 스럽다. –

+0

PHPMailer의 이전 버전을 사용하고 있습니다. – Synchro

답변

1

사용자가 인라인 오류 메시지를 표시하는 경우, 기본 양식 '논리'를 처리하는 데 한 페이지 만 사용하고, 양식 자체의 원시 HTML 태그를 나타내려면 include()을 사용하는 것이 좋습니다. '논리'페이지는 방문자를 '양식'으로 안내하는 곳입니다.

if(isset($_POST['submit'])) 안에 제출 된 데이터를 확인하십시오. 그것이 유효하다면, 귀하는 제출물을 처리합니다. 유효하지 않은 경우 오류가 발생하고 양식이 다시 표시됩니다. 양식은 기본적으로 표시됩니다.

이 다음 반 의사에 표시됩니다 : form.php

$error = ''; // Nothing is wrong at first 
if(isset($_POST['submit'])) { 
    // Raise error messages based on submission 
    if(empty($_POST['uname'])) { 
    $error = "You must enter name"; 
    } 
    if(empty($_POST['email'])) { 
    $error = "You must enter email"; 
    } 

    // Show the form if there are errors 
    if ($error) { 
    include('form.php'); 
    } 
    // Process the submission if there aren't 
    else { 
    //$query = ... 
    mail($Email, $email_subject, $msg_email); 
    } 
} 
else { 
    include('form.php'); 
} 

조건부 $error 확인 :

<?php 
if ($error !== '') { 
    // Output the error message in a fancy way 
    echo "<span class='error'>" . $error . "</span>"; 
} 
?> 
<form> ... </form> 

두 개의 이메일을 보내는에 관해서는, 당신이 실제로 거기!$msg_email, $email_subject$Email이 이미 있습니다.

mail($Email, $email_subject, $msg_email); 

참고 아마 당신은이뿐만 아니라에서 네 번째 매개 변수 (헤더)를 추가 할 수 있습니다 : 당신은 PHP의 mail() 기능을 사용하기 위해 찾고 있습니다.

또한 현재 블록이 트리거되지 않게하는 if(isset($_POST['submit']));{의 세미콜론을 사용하고 있습니다. 이것을 제거했는지 확인하십시오.

희망이 도움이됩니다. :)

+0

늦게 답변을 드리게되어 죄송합니다. 결국 전체 프로세스를 이해하는 데 많은 도움이되었습니다. 필요한 코드를 변경할 수 있었기 때문에 이제는 다른 오류에 대해 더 많은 변수를 정의해야했습니다. 당신은 생명의 은인이었습니다! 감사!! – bridge

0

은 내가 문제를 발견 한 것 같아요.

이런 종류의 문제를 일으킬 수있는 서식 문제가 2 개 있습니다.

1)는 if 블록이 분리 실행 거기 세미콜론

if(isset($_POST['submit'])); 

조건부 블록 것을 간단히 스코프 분리기로서 작용 방지 세미콜론있다.

2

)는 귀하의 정규식 내가 또한 것이라고는 (.[a-z]{2,3})

해야 마지막 캡처 그룹 당신이 [a-z] 문자 선택기 닫는 대괄호가없는 (.[a-z {2,3})에서

preg_match('/^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z {2,3})$/i', $phone, $phone_match); 

완료되지 않았습니다 당신이 $msg_name$msg2_name을 설정하고 있지만 어디서나 사용되는 것을 보지 못했고 에러시 실행을 멈추지 않으므로 프로세스가 방금 계속 쿼리를 계속할 수 있다고 말했지만 멈추라 고 말한 경우에도 마찬가지입니다.

+0

나는 심지어 그것을 알아 차리지 못했다, 고마워! – bridge