2014-04-27 128 views
0

我知道這個問題已被問了很多次,但答案似乎真的特定於發佈的腳本和我目前的知識,我不能使從更正的腳本轉換到我自己的腳本。PHP在同一頁上提交表格,回顯如下表格

這一切工作正常 - 它提交在同一頁面上,並提供任何錯誤的反饋,但我希望任何錯誤在表單下面回顯,使用戶更方便地更改他們輸入的錯誤,提交。

從我在發佈之前閱讀的問題中可以收集到的信息 - 它可能只能使用jQuery/Ajax?

我的腳本:

<?php 

if(isset($_POST['submit'])){ 
require "connection.php"; 

$username = $_POST["username"]; 
$password = $_POST["password"]; 
$email = $_POST["email"]; 
$repeat_password = $_POST["repeat_password"]; 

$username_query = mysql_query("SELECT id FROM users WHERE username = '$username'"); 
$email_query = mysql_query("SELECT id FROM users WHERE email = '$email'"); 

if($username == "" || $password == "" || $repeat_password == "" || $email == ""){ 
    die("All boxes must be filled out!"); 
}//^Checking if all boxes have been filled out 
else { 
    if (!ctype_alnum($username)){ 
     die("Username can only contain letters and numbers"); 
    }//^Checking if username is alphanumeric 
    else { 
     if (strlen($username) < 6 || strlen($username) > 15){ 
      die("Username must be between 6-15 characters."); 
     }//^Checking if username is between 6-15 characters 
     else { 
      if (mysql_num_rows($username_query) != 0){ 
       die("Username is taken, please choose another."); 
      }//^Checking if username exists in database 
      else { 
       if (!preg_match("/[0-9]/",$password)){ 
        echo "password doesnt contain a number"; 
        } 
       else { 
        if ($password != $repeat_password){ 
         die("Passwords do not match"); 
        }//^Checking if password and repeat_password match 
        else { 
         if (strlen($password) < 6){ 
          die("Password must be atleast 6 characters long."); 
         }//^Checking if password is longer than 6 characters 
         else { 
          if (!filter_var($email, FILTER_VALIDATE_EMAIL)){ 
           die("E-mail address is not vaild."); 
          }//^Checking if e-mail address is valid 
          else { 
           if (mysql_num_rows($email_query) != 0){ 
            die("This e-mail address has already been used to create a different account."); 
           }//^Checking if e-mail address has already been used 
           else { 
            mysql_query("INSERT INTO users (username, password, email, signup_date) VALUES ('$username', '$password', '$email', CURDATE())") or die(mysql_error()); 
            echo "Account succesfully created, welcome ".$username."!"; 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
} 
exit; 
} 

// 

?> 

     <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 
      <table> 
       <tr> 
        <td> 
         Username: 
        </td> 
        <td> 
         <input type="text" name="username"> 
        </td> 
       </tr> 
       <tr> 
        <td> 
         Password: 
        </td> 
        <td> 
         <input type="password" name="password"> 
        </td> 
       </tr> 
       <tr> 
        <td> 
         Repeat password: 
        </td> 
        <td> 
         <input type="password" name="repeat_password"> 
        </td> 
       </tr> 
       <tr> 
        <td> 
         E-mail: 
        </td> 
        <td> 
         <input type="email" name="email"> 
        </td> 
       </tr> 
       <tr> 
        <td colspan="2"> 
         <center><input type="submit" name="submit"></center> 
        </td> 
       </tr> 
      </table> 
     </form> 

回答

1

回答:是的,你必須在那裏使用jQuery。

您可以在用戶輸入第一個字母后驗證表單。您可以驗證上/下鍵或提交。我建議使用jQuery Validation Plugin

爲了讓表單使用ajax請求。它非常簡單。你可以閱讀它here。在我給出的最後一頁有一些例子。

請注意,如果您將使用jQuery驗證插件,您可以在valid動作上發送ajax請求。使用這個,帶有序列化表單的ajax請求將在form +表單上發送。如果表單有一些無效字段,則會顯示錯誤,如果沒有錯誤,則會發送ajax-request。

建議: 您的設計不太好。爲什麼?如果人們會寫不好的名聲,使10多個其他錯誤,僅1個錯誤:

Username can only contain letters and numbers

將被顯示。爲什麼?因爲你有架構。之後他會糾正第二個錯誤。第三個錯誤等

我建議你做,以這種方式處理錯誤:

$errors = array(); 
$errorsFlag = false; 

if(check_username1()) { 
    $errors[] = 'Tell about this error'; 
    $errorsFlag = true; 
} 

if(check_username2()) { 
    $errors[] = 'Tell about this error'; 
    $errorsFlag = true; 
} 
if(check_mail()) { 
    $errors[] = 'Tell about this error'; 
    $errorsFlag = true; 
} 

以及如何輸出呢?使用這個:

if($errorsFlag == true) { 
    foreach($errors as $error) { 
     echo $error . " <br /> ";; 
    }  
} 
+0

我真的沒有想過 - 你能否提出一種可以改進的方法? – Daniel

+0

@ user3570991究竟是什麼?如何輸出錯誤? –

+0

我編輯了我的答案,並提出了我的建議。 –

0

我總是把我的錯誤,因爲會話。這使您可以一次設置多個錯誤,並將其打印到任意位置。

if語句只是在那裏你將設置錯誤示例以下...

session_start(); //you will need this 

if (username_exists($un)) { 

    handleError("Username already exists!"); 

} 

...

if (!passwordIsStrong($pw)) { 

    handleError("Password is not strong enough!"); 

} 

下面是實際設置/打印錯誤的功能。

function handleError($err) { 

    //get any existing errors 
    $existing = isset($_SESSION['form-errors']) ? $_SESSION['form-errors'] : ''; 

    //append the new error to the existing ones. Over-write the session with new data. 
    $_SESSION['form-errors'] = "$existing<li>$err</li>"; 

} 

function getErrors() { 

    if(isset($_SESSION['form-errors'])) 

     echo $_SESSION['form-errors']; 


} 

getErrors();可以在你的html的任何地方調用。這將打印這樣的事情...

<li>Username already exists!</li> <li>Password is not strong enough!</li>

這有點像一個日誌。但是,在我所有的項目中,它都是爲我工作的!

0

是的,你需要javascript。但不一定是jQueryajax

php不使用ajax總是需要你重新加載頁面,否則php代碼將不會被執行。

如果您不希望頁面被重新加載,請搜索某種javascript/jQuery驗證腳本。否則(如果你不關心頁面重新加載),你可以在php的表單末尾輸出錯誤信息。