2014-02-08 132 views
0

我正在制作一个基本的内容管理系统,并且我一直在验证输入到表单中的数据。PHP表单数据验证问题

例如,一种形式是编辑主题的名称(在导航菜单中)。该表单包含一些不同的数据,但主要关注的是“menu_name”字段(主题名称)。

应该检查“menu_name”中的表单提交数据,以确保它不是空的,如果它是错误的话。现在发生的情况是,表单验证似乎不起作用,因为当我没有输入任何内容时,脚本会继续编辑主题名称,在这种情况下会将其留空。

这是在表单提交执行脚本:

if (isset($_POST['submit'])) 
{ 
    // Process the form 

    // Validations 
    $required_fields = array("menu_name", "position", "visible"); 
    validate_presences($required_fields); 

    $fields_with_max_lengths = array("menu_name" => 30); 
    validate_max_lengths($fields_with_max_lengths); 

    // If errors occured, redirect 
    if(empty($errors)) 
    { 
     // Perform update 

     // Assign POST data to variables 
     $id = $current_subject["id"]; 
     $menu_name = mysql_prep($_POST["menu_name"]); 
     $position = (int) $_POST["position"]; 
     $visible = (int) $_POST["visible"]; 

     // 2. Perform database query 
     $query = "UPDATE subjects SET "; 
     $query .= "menu_name = '{$menu_name}', "; 
     $query .= "position = '{$position}', "; 
     $query .= "visible = '{$visible}' "; 
     $query .= "WHERE id = {$id} "; 
     $query .= "LIMIT 1"; 
     $result = mysqli_query($connection, $query); 

     if ($result && mysqli_affected_rows($connection) >= 0) 
     { 
      // Success 
      $_SESSION["message"] = "Subject updated."; 
      redirect_to("manage_content.php"); 
     } 
      else 
     { 
      // Failure 
      $message = "Subject update failed."; 
     } 
    } 

} 

的数据,然后由两个自定义的验证功能检查,你可以看到,第二个是不是我关心的,但第一个函数validate_presences( ),这里是功能:

function validate_presences($requried_fields) 
{ 
    GLOBAL $errors; 

    foreach($required_fields as $field) 
    { 
     $value = trim($_POST[$field]); 
     if (!has_presence($value)) 
     { 
      $errors[$field] = fieldname_as_text($field) . " can't be blank"; 
     } 
    } 
} 

你可以看到有它引用has_presence()函数,它是:

function has_presence($value) 
{ 
    return isset($value) && $value !== ""; 
} 

如果任何人有任何错误的想法,任何帮助表示赞赏! 只需询问您是否需要更多信息。 在此先感谢!

+0

您是否在调用验证函数之前定义了'$ errors'变量? – Pierre

+0

$ errors = array();在验证功能页面的开始处定义。 – Rubixryan

+0

尝试返回isset($ value)&&!empty($ value);在has_presence函数中 – Pierre

回答

0

为什么不只是返回错误数组而不是使其成为全局的?我认为它会立即解决您的问题;)

function validate_presences($requried_fields) 
{ 
    $errors = array(); 

    foreach($required_fields as $field) 
    { 
     $value = trim($_POST[$field]); 
     if (!has_presence($value)) 
     { 
      $errors[$field] = fieldname_as_text($field) . " can't be blank"; 
     } 
    } 
    return $errors; 
} 

现在设置$errors = validate_presences($required_fields);,你准备好了!

+0

$ errors = array();在验证功能页面的顶部定义。加上相同的数组被其他页面和函数使用。 – Rubixryan

0

不建议像这样以全局方式使用变量。而是通过引用验证函数传递错误变量。

$errors = array(); 

function validate_presences($requried_fields, &$errors) 
{ 
    foreach($required_fields as $field) 
    { 
     $value = trim($_POST[$field]); 
     if (!has_presence($value)) 
     { 
      $errors[$field] = fieldname_as_text($field) . " can't be blank"; 
     } 
    } 
} 

$required_fields = array("menu_name", "position", "visible"); 
validate_presences($required_fields, $errors); 

$fields_with_max_lengths = array("menu_name" => 30); 
validate_max_lengths($fields_with_max_lengths, $errors); 

// If errors occured, redirect 
if(empty($errors)) 
{ 
+0

如果以全局方式完成相比传递它,它会有什么影响? – Rubixryan

+0

以这种方式使用它可以保证您始终使用相同的$错误参考。如果你在很多函数中以全局方式使用它,一个函数可能会以你不想要的方式改变变量的值(EG清除该值) – Pierre

+0

有意义,我会放弃它,当传入变量时,它应该是&$ errors还是$ errors? – Rubixryan