2015-09-05 66 views
1

我正在嘗試使用驗證構建一個簡單的註冊表單。當我離開字段空白,並提交我的表單時,我不斷收到此錯誤未定義的索引電子郵件或未定義的索引密碼。例如,我填寫除姓氏以外的所有字段我會得到一個通知說,電子郵件是未定義的,如果我填寫所有領域,我得到用戶名,電子郵件和密碼未定義。我GOOGLE了它,我可以得到的sugesstions是isset,我嘗試使用isset但它仍然無法正常工作。任何人都可以幫忙嗎?未定義的驗證索引

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Sign Up</title> 
<style> 
label{ 
    width:100px; 
    float:left; 
} 
</style> 
</head> 
<body> 
<?php 
session_start(); 
$Firstname=isset($_SESSION['Firstname']); 
$Lastname=isset($_SESSION['Lastname']); 
$username=isset($_SESSION['username']); 
$email=isset($_SESSION['email']); 
$password=isset($_SESSION['password']); 
if(isset($_SESSION['error'])) 
{ 

    echo '<p>'.$_SESSION['error']['Firstname'].'</p>'; 
    echo '<p>'.$_SESSION['error']['Lastname'].'</p>'; 
    echo '<p>'.$_SESSION['error']['username'].'</p>'; 
    echo '<p>'.$_SESSION['error']['email'].'</p>'; 
    echo '<p>'.$_SESSION['error']['password'].'</p>'; 
    unset($_SESSION['error']); 
} 
?> 
<div class="signup_form"> 
<form action="registerUser.php" method="post" > 
<p> 
    <label for="Firstname">First Name:</label> 
    <input name="Firstname" type="text" id="Firstname" size="30"/> 
</p> 
<p> 
    <label for="Lastname">Last Name:</label> 
    <input name="Firstname" type="text" id="Lastname" size="30"/> 
</p> 
<p> 
    <label for="username">User Name:</label> 
    <input name="username" type="text" id="username" size="30"/> 
</p> 
<p> 
    <label for="email">E-mail:</label> 
    <input name="email" type="text" id="email" size="30"/> 
</p> 
<p> 
    <label for="password">Password:</label> 
    <input name="password" type="password" id="password" size="30 "/> 
</p> 
<p> 
    <input name="submit" type="submit" value="Submit"/> 
</p> 
</form> 
</div> 
<p><a href="login.php">Login</a></p> 
</body> 
</html> 

這裏是registeruser.php

<?php 
session_start(); 
include('dbconnect.php'); 
if(isset($_POST['submit'])) 
{ 
//whether the username is blank 
if($_POST['FirstName'] == '') 
{ 
    $_SESSION['error']['Firstname'] = " FirstName is required."; 
} 
if($_POST['LastName'] == '') 
{ 
    $_SESSION['error']['Lastname'] = " LastName is required."; 
} 
//whether the email is blank 
if($_POST['email'] == '') 
{ 
    $_SESSION['error']['email'] = "E-mail is required."; 
} 
else 
{ 
    //whether the email format is correct 
    if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $_POST['email'])) 
    { 
    //if it has the correct format whether the email has already exist 
    $email= $_POST['email']; 
    $personcon=$conn; 
    $sql1 = "SELECT * FROM TBLUSERS WHERE email = '$email'"; 
    $personinfo=oci_parse($personcon,$sql1); 
    oci_execute($personinfo); 
    oci_free_statement($personinfo); 
    if (oci_num_rows($personinfo) > 0) 
      { 
    $_SESSION['error']['email'] = "This Email is already used."; 
    } 
    } 

    else 
    { 
    //this error will set if the email format is not correct 
    $_SESSION['error']['email'] = "Your email is not valid."; 
    } 
} 
//whether the password is blank 
if($_POST['password'] == '') 
{ 
    $_SESSION['error']['password'] = "Password is required."; 
} 
if($_POST['username'] == '') 
{ 
    $_SESSION['error']['username'] = "username is required."; 
} 

    if(isset($_SESSION['error'])) 
{ 
    header("Location: index.php"); 
    exit; 
} 
else 
{ 
    $FirstName = $_POST['FirstName']; 
    $LastName = $_POST['LastName']; 
    $email = $_POST['email']; 
    $username=$_POST['$username']; 
    $password = $_POST['password']; 


    $sql2 = "INSERT INTO TBLUSERS (FirstName,LastName,email, username,password) VALUES ('$FirstName', $LastName, '$email', '$username','$password')"; 
    $personinfo2=oci_parse($personcon,$sql2); 
    oci_execute($personinfo2); 
    oci_free_statement($personinfo2); 
    if($personinfo2) 
    { 
    /* [email protected] */ 
    $to = $email; 
    $subject = "Confirmation from TutsforWeb to $username"; 
    $header = "TutsforWeb: Confirmation from TutsforWeb"; 
    $message = "Please click the link below to verify and activate your account. rn"; 

    $sentmail = mail($to,$subject,$message,$header); 

    if($sentmail) 
      { 
    echo "Your Confirmation link Has Been Sent To Your Email Address."; 
    } 
    else 
     { 
    echo "Cannot send Confirmation link to your e-mail address"; 
    } 

    oci_close($personcon); 
} 
} 
} 
?> 
+0

我看到的第一件事就是名字有時名字和姓氏有時是姓氏。它可能不是唯一的問題,但只是略微區分大小寫。 –

回答

2

如果您不填寫的字段,它的索引將不會在$_POST關聯數組中存在。您需要檢查isset它是否存在這樣的:

<?php 
session_start(); 
include('dbconnect.php'); 
$_SESSION['error'] = array(); 
if(isset($_POST['submit'])) { 
    //whether the username is blank 
    if((!isset($_POST['FirstName'])) || ($_POST['FirstName'] == '')) { 
     $_SESSION['error']['Firstname'] = " FirstName is required."; 
    if((!isset($_POST['LastName'])) || ($_POST['LastName'] == '')) { 
     $_SESSION['error']['Lastname'] = " LastName is required."; 
    if((!isset($_POST['email'])) || ($_POST['email'] == '')) { 
     $_SESSION['error']['email'] = "E-mail is required."; 
    } else { 
     //whether the email format is correct 
     if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $_POST['email'])) { 
      //if it has the correct format whether the email has already exist 
      $email= $_POST['email']; 
      $personcon=$conn; 
      $sql1 = "SELECT * FROM TBLUSERS WHERE email = '$email'"; 
      $personinfo=oci_parse($personcon,$sql1); 
      oci_execute($personinfo); 
      oci_free_statement($personinfo); 
      if (oci_num_rows($personinfo) > 0) { 
       $_SESSION['error']['email'] = "This Email is already used."; 
      } 
     } else { 
      //this error will set if the email format is not correct 
      $_SESSION['error']['email'] = "Your email is not valid."; 
     } 
    } 
    //whether the password is blank 
    if((!isset($_POST['password'])) || ($_POST['password'] == '')) { 
     $_SESSION['error']['password'] = "Password is required."; 
    } 
    if((!isset($_POST['username'])) || ($_POST['username'] == '')) { 
     $_SESSION['error']['username'] = "username is required."; 
    } 
    if(isset($_SESSION['error'])) { 
     header("Location: index.php"); 
     exit; 
    } else { 
     $FirstName = $_POST['FirstName']; 
     $LastName = $_POST['LastName']; 
     $email = $_POST['email']; 
     $username=$_POST['$username']; 
     $password = $_POST['password']; 

     $sql2 = "INSERT INTO TBLUSERS (FirstName,LastName,email, username,password) VALUES ('$FirstName', $LastName, '$email', '$username','$password')"; 
     $personinfo2=oci_parse($personcon,$sql2); 
     oci_execute($personinfo2); 
     oci_free_statement($personinfo2); 
     if($personinfo2) { 
      /* [email protected] */ 
      $to = $email; 
      $subject = "Confirmation from TutsforWeb to $username"; 
      $header = "TutsforWeb: Confirmation from TutsforWeb"; 
      $message = "Please click the link below to verify and activate your account. rn"; 

      $sentmail = mail($to,$subject,$message,$header); 

      if($sentmail) { 
       echo "Your Confirmation link Has Been Sent To Your Email Address."; 
      } else { 
       echo "Cannot send Confirmation link to your e-mail address"; 
      } 

      oci_close($personcon); 
     } 
    } 
} 
?> 

例如

((!isset($_POST['FirstName'])) || ($_POST['FirstName'] == '')) 

true如果在$_POST沒有'FirstName'或者它是一個空字符串。訣竅在於如果第一個操作數是真的,則不檢查第二個操作數,從而防止問題中提到的問題。

進一步觀察:

  • 您的代碼假定有一個$_SESSION['error']元素。如果這是不正確初始化
  • 你的代碼很容易受到SQL injection
  • 你的代碼不正確的結構,這使得它難以維持
  • 代碼混淆了SQL,使用PHP,這是不優雅的你可能會得到錯誤
+0

tnx我會盡力改善我的代碼。但是你的解決方案不起作用,要麼它仍然說我的index.php – STRANGER

+1

@STRANGER電子郵件是未定義的,你的代碼是不可讀的,這也難怪有什麼問題。忍受我,我會構造你的代碼,看看問題是什麼。 –

+0

@STRANGER,我構建了你的代碼。據我所知,問題在於你沒有清除$ _SESSION ['error'],所以在後面的例子中,無論如何你都會得到以前的錯誤。我已重新初始化$ _SESSION ['錯誤'],以確保代碼不會因以前的錯誤而失敗。 –

0

第一個問題是您的HTML輸入名稱與您期望的PHP名稱不匹配。

if($_POST['FirstName'] == '') //Upper case N 

雖然在標記使用<input name = "Firstname" ...較低的情況下,N

與標記的另一個問題是兩個輸入被命名爲姓:

<label for="Lastname">Last Name:</label> 
<input name="Firstname" type="text" id="Lastname" size="30"/> <!--Firstname should be Lastname--> 

終於有更多的問題在於在索引中。 php文件,您嘗試刷新從registerUser.php返回的會話變量。或者應該只有一個$SESSION["error"]或​​必須與registerUser.php中的$POST["field"]一樣使用。

閃爍的代碼看起來像這樣變更後:

if(isset($_SESSION['error'])) 
{ 
    if (isset($_SESSION['error']['Firstname'])) echo '<p>'.$_SESSION['error']['Firstname'].'</p>'; 
    if (isset($_SESSION['error']['Lastname'])) echo '<p>'.$_SESSION['error']['Lastname'].'</p>'; 
    if (isset($_SESSION['error']['username'])) echo '<p>'.$_SESSION['error']['username'].'</p>'; 
    if (isset($_SESSION['error']['email'])) echo '<p>'.$_SESSION['error']['email'].'</p>'; 
    if (isset($_SESSION['error']['password'])) echo '<p>'.$_SESSION['error']['password'].'</p>'; 
    unset($_SESSION['error']); 
} 

我也建議仰視的話題一個很好的資源。登錄/註冊系統很難第一次正確。