2014-03-06 81 views
1
表單驗證後

我想這個代碼的形式處理的部分:頭重定向在PHP

<?php 

if(isset($_POST['senderEmail'])) 
    { 
    try 
    { 

    require '_php/_security/validation.php'; //SEE BELOW 

    $rules = array(    
      'senderEmail' => 'validEmail', 
      'emailTextbox' => 'validTextbox', 
     ); 

     $validation = new Validation(); 

     if ($validation->validate($_POST, $rules) == TRUE) { 
      require("_php/database/dbProcessing.php"); //Form Proccessing for database inclusion 
     } 

     else { 
      foreach($validation->emailErrors as $error){ 
      $emailErrors[] = $error; 
      $_SESSION['$emailErrors'] = $emailErrors; 

      header('Location:indexmobile.php#emailErrors'); 
      die('ABORT!'); 
     } 
    } 

    } 
    catch (PDOException $e) 
    { 

     $error = 'Error adding elements to database: ' . $e->getMessage(); 
     echo "Error: " . $error; 
     exit(); 
    } 

exit(); 
} 
?> 

,我做我的驗證的validation.php有這樣的:

<?php 

class Validation { 

public $errors = array(); 
public function validate($data, $rules) { 
    $valid = TRUE; 
    foreach ($rules as $fieldname => $rule) { 
     $callbacks = explode('|', $rule); 
     foreach ($callbacks as $callback) { 
      $value = isset($data[$fieldname]) ? $data[$fieldname] : NULL; 
      if ($this->$callback($value, $fieldname) == FALSE) $valid = FALSE; 
     } 
    } 
    return $valid; 
} 

public function validEmail($value, $fieldname) { 
    $valid = !empty($value); 
    if ($valid == FALSE) { 
     $this->emailErrors[] = "The $fieldname is required"; 
     return $valid; 
    } else { 
     $valid = filter_var($value, FILTER_VALIDATE_EMAIL); 
     if ($valid == FALSE) $this->emailErrors[] = "The $fieldname needs to be a valid email"; 
     return $valid; 
    } 
} 

public function validTextbox($value, $fieldname) { 
    $valid = !empty($value); 
    if ($valid == FALSE) { 
     $this->emailErrors[] = "The $fieldname is required"; 
     return $valid; 
    } else { 
     $whitelist = '/^[a-zA-Z0-9 ,\.\+\\n;:!_\[email protected]]+$/'; 
     $textarea = strip_tags($value); 
     $textarea = mysql_real_escape_string($textarea); 
     $valid = preg_match($whitelist, $textarea); 
     if ($valid == FALSE) $this->errors[] = "The $fieldname contains invalid characters"; 
     return $valid; 
    } 
    } 

} 

在使用本,我有重定向問題(我認爲)。似乎進一步,我有驗證錯誤。我的問題是這樣的:

  1. 我在做標題重定向嗎?我讀過「必須在發送任何實際輸出之前調用header(),」所以這是重定向不正確的原因嗎?如果我需要顯示/發送重定向頁面的東西,如何進行重定向?
  2. 函數validTextbox總是會出現該字段爲空的錯誤。爲什麼這樣?
  3. 我的整個表單驗證過程是驗證表單域的好方法(我通過在線教程學到了哪些內容)?什麼是更好的方法?
  4. 在這種情況下,錯誤報告有什麼問題嗎?

謝謝你的回覆。我是PHP新手,並盡我所能學習該語言。

回答

2

1 - 有幾種方法可以將消息傳遞到您要重定向到的頁面。一種是通過$_GET這樣

$message="Some message for the next page."; 
$message=urlencode($message); 
header("Location:page.php?message=".$message); 

然後在page.php文件

if(!empty($_GET['message'])) 
{ 
$_GET['message']; 
} 

同樣你也可以使用會話(不太安全)

$_SESSION['message']='some other message'; 

然後在page.php文件

if (!empty($_SESSION['message'])) 
{ 
echo $_SESSION['message']; 
unset($_SESSION['message']); 
} 

2 - 我將不得不看你通過你的validate函數。你應該做一個var_dump$_POST並將其添加到您的問題。

3 - 這取決於您的標準。如果你只是檢查空虛的過度殺傷力。我不知道你需要/認爲哪些文本是有效的,但是正則表達式是執行驗證的合理方式。

4 - 見#2。

+0

非常感謝您的回覆。我很確定你的 – Andy