2014-02-08 3 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

Используя его таким образом, вам гарантируется, что вы всегда используете одну и ту же ссылку из $ errors. Если вы используете его глобальным способом во множестве функций, одна функция может изменить значение переменной так, как вы не хотите в этом случае (EG очищает значение) – Pierre

+0

Имеет смысл, я дам ему понять, при передаче переменной in, должны ли быть ошибки $ и ошибки? – Rubixryan

Смежные вопросы