2015-06-15 3 views
0

Я следую серии видеороликов, которая до сих пор была замечательной. Я в тупике участвую в части, которая дает вам некоторые функции проверки формы. Фактическая форма находится здесь в данный момент: http://leegster.com/leegster_test/public/manage_content.phpФункции проверки формы PHP не работают

Вот как функции вызываются в create_subject.php:

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

    //$menu_name = $_POST["menu_name"]; 
    $menu_name = mysql_prep($_POST["menu_name"]); 
    $position = (int) $_POST["position"]; 
    $visible = (int) $_POST["visible"]; 

    // 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 (!empty($errors)) { 
     $_SESSION["errors"] = $errors; 
     redirect_to("new_subject.php"); 
    } 

А вот функции, как показано в validation_functions.php:

// * presence 
// use trim() so empty spaces don't count 
// use === to avoid false positives 
// empty() would consider "0" to be empty 
function has_presence($value) { 
    return isset($value) && value != ""; 
} 

function validate_presences($required_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"; 
     } 
    } 
} 

// * string length 
// max length 
function has_max_length($value, $max) { 
    return strlen($value) <= $max; 
} 

function validate_max_lengths($fields_with_max_lengths) { 
    global $errors; 
    // Expects an assoc. array 
    foreach($fields_with_max_lengths as $field => $max) { 
     $value = trim($_POST[$field]); 
     if (!has_max_length($value, $max)) { 
      $errors[$field] = fieldname_as_text($field) . " is too long"; 
     } 
    } 
} 

Когда форма отправлена, вызываются validate_presences и validate_max_lengths, чтобы гарантировать, что ничего не осталось пустым и имя menu_name не должно превышать 30 символов. Страница должна обновляться, и ошибки должны отображаться (я могу включить этот код, если это необходимо).

Однако, когда я делаю пустую запись в форме, она позволяет мне это делать. Пустая запись отправляется в базу данных с успешным сообщением. Я не могу понять, почему это происходит с этими новыми функциями проверки, которые должны блокировать это. Насколько я могу судить, я сделал все шаг за шагом в видеоуроке.

Любая помощь очень ценится. Благодаря!

+0

Как выглядит 'redirect_to()'? – jeroen

ответ

0

Просто тестирование кода и, кажется, что это должно работать:

function has_presence($value) { 
    return isset($value) && $value != ""; // you forgot $, propably a typo 
} 

function validate_presences($required_fields, $fields) { 
    $errors = []; // do not use globals, you should pass all required variables as arguments 

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

    return $errors; 
} 

function has_max_length($value, $max) { 
    return strlen($value) <= $max; 
} 

function validate_max_lengths($fields_with_max_lengths, $fields) { 
    $errors = []; 

    // Expects an assoc. array 
    foreach($fields_with_max_lengths as $field => $max) { 
     $value = trim($fields[$field]); 
     if (!has_max_length($value, $max)) { 
      $errors[$field] = $field." is too long"; 
     } 
    } 

    return $errors; 
} 

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

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

print_r($errors); 

Однако, вы всегда должны проверить наличие полей. Этот $value = trim($fields[$field]); должен быть изменен на: $value = isset($fields[$field]) ? trim($fields[$field]) : '';

О, и мне не нравится это либо: mysql_prep($_POST["menu_name"]); Вы определенно должны избежать почтовых полей первой.

0

простой способ проверки требуемой формы ввода используется html5 требуется атрибут и для предела обугленного вы можете использовать MAXLENGTH атрибут пример:

<input type="text" name="cat" maxlength="30" required>

если вы все еще хотите продолжать использовать php, вы должны включить полное содержимое скрипта. Поправьте меня, если им неправильно, потому что я новичок тоже :)

+0

Благодарим за информацию. На данный момент, я просто иду по учебнику, чтобы узнать, как PHP обрабатывает проверку формы. Я понимаю, что это не самый эффективный способ делать вещи обычно. Я буду помнить ваше предложение! Благодаря! –