2017-06-19 71 views
0

我是PHP新手,我正在尝试一些表单验证。我有以下代码:PHP表单验证和POST变量

我提交表单并将数据提交给SQL语句,如果它通过验证。如果表单有效,它将重定向到外部成功页面。

我不能做的是获得原始的后变量到成功页面上。我怎么能这样做?我的代码如下:

PHP:

<body> 
<?php 

$firstnameErr = $emailErr = $lastnameErr = $gradeErr = $roleErr = ""; 
$firstname = $email = $lastname = $grade = $role = ""; 

if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    if (empty($_POST["firstname"])) { 
     $firstnameErr = "First name is required"; 
    } else { 
     $firstname = user_input($_POST["firstname"]); 
    } 

    if (empty($_POST["lastname"])) { 
     $lastnameErr = "Last mame is required"; 
    } else { 
     $lastname = user_input($_POST["lastname"]); 
    } 

    if (empty($_POST["email"])) { 
     $emailErr = "Email is required"; 
    } else { 
     $email = user_input($_POST["email"]); 
    } 

    if (empty($_POST["grade"])) { 
     $gradeErr = "Grade is required"; 
    } else { 
     $grade = user_input($_POST["grade"]); 
    } 


    if (empty($_POST["role"])) { 
     $roleErr = "Role is required"; 
    } else { 
     $role = user_input($_POST["role"]); 
    } 

    if($firstnameErr == '' && $emailErr == '' && $lastnameErr == '' && $gradeErr == '' && $roleErr == ''){ 

     $stmt = $conn->prepare("INSERT INTO `Tom`.`staff_details` (`first_name`, `surname`, `role`, `grade`,`email`) VALUES ('$firstname', '$lastname','$role', '$grade','$email');"); 
     $stmt->execute(); 
     header('Location: staff_added.php'); 
     exit(); 
    }; 

} 

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

?> 

HTML:

<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post"> 
    <fieldset> 
     <p><span class="error">* required field</span></p> 
     <label>First name:</label><input type="text" name="firstname" /> 
     <span class="error">* <?php echo $firstnameErr;?></span><br> 
     <label>Last name:</label><input type="text" name="lastname" /> 
     <span class="error">* <?php echo $lastnameErr;?></span><br> 
     <label>Role:</label><input type="text" name="role" /> 
     <span class="error">* <?php echo $roleErr;?></span><br> 
     <label>Grade:</label><input type="text" name="grade" /> 
     <span class="error">* <?php echo $gradeErr;?></span><br> 
     <label>Email:</label><input type="text" name="email" /> 
     <span class="error">* <?php echo $emailErr;?></span><br><br> 
     <input class="standard_submit" type="submit" value="Save" id="submit_search_button"> 
    </fieldset> 

</form> 

我想这些变量在整个移回staff_added.php页面,这样我可以打印出来的用户。我已经完成了一些阅读,但迄今为止,这没有多大意义。

任何帮助,将不胜感激。

谢谢

+0

您需要可以存储一些信息的会话,或存储用户ID并在成功页面上加载数据库中的数据。 - 有多种方式可以做到,这只是其中的一部分。 – Epodax

+1

通过直接在sql语句中嵌入变量,而不是使用将变量绑定到的占位符,您完全忽略了'prepared语句'的重点 – RamRaider

+0

我在很多地方看到这些'user_input()'函数,并且像它一样在这里,它有点被误解和误用。 – Qirel

回答

1

可以存储在SESSION对象变量,然后将可从无处不在:

<?php 
session_start(); 
//other code... 
$_SESSION["role"] = $role; 
//other code... 
?> 
+0

我需要在确认页面中声明会话结束吗? – Tom

+0

你应该使用** session_destroy()**,在你的情况下,我认为你不应该在你的页面中调用它,[阅读](http://www.hackingwithphp.com/10/3/5/ending-一个会话) – Frank

+1

你可以使用'$ _SESSION ['formdata'] = $ _ POST',然后使用'$ _SESSION ['formdata'] ['role']'等访问元素,而不是单个会话变量 – RamRaider

1

使用prepared statements你应该寻找在SQL这样的做法也许不是直接嵌入变量。

<?php 
    function user_input($data) { 
     $data = trim($data); 
     $data = stripslashes($data); 
     $data = htmlspecialchars($data); 
     return $data; 
    } 
    $firstname = $email = $lastname = $grade = $role = false; 

    if($_SERVER["REQUEST_METHOD"] == "POST") { 
     $errors=array(); 


     if(empty($_POST["firstname"])) $errors[] = "First name is required"; 
     else $firstname = user_input($_POST["firstname"]); 


     if(empty($_POST["lastname"])) $errors[] = "Last mame is required"; 
     else $lastname = user_input($_POST["lastname"]); 


     if(empty($_POST["email"])) $errors[] = "Email is required"; 
     else $email = user_input($_POST["email"]); 


     if(empty($_POST["grade"])) $errors[] = "Grade is required"; 
     else $grade = user_input($_POST["grade"]); 



     if(empty($_POST["role"])) $errors[] = "Role is required"; 
     else $role = user_input($_POST["role"]); 


     if(empty($errors)){ 

      $stmt = $conn->prepare("INSERT INTO `Tom`.`staff_details` (`first_name`, `surname`, `role`, `grade`,`email`) VALUES (?,?,?,?,?);"); 
      if($stmt){ 
       $stmt->bind_param('sssss',$firstname,$lastname,$role,$grade,$email); 
       $stmt->execute(); 

       exit(header('Location: staff_added.php')); 
      } else { echo 'statement failed'; } 


     } else { 
      foreach($errors as $error)echo $error . '<br />'; 
     } 

    } 
?> 
+0

应用此代码时出现错误。我的连接使用PDO,它告诉我bind_params是一个未定义的PDO方法 – Tom

+0

我发现了bindParam的工作。感谢帮助准备好的陈述 – Tom

+0

对不起 - 我的错误〜我以为你使用'mysqli'而不是PDO – RamRaider