2009-11-05 3 views
1

Я использую PHP для проверки ввода формы перед отправкой данных формы в базу данных MySQL.Проверка формы PHP на год

Что было бы лучшим способом проверить ввод формы только за год? У меня есть ввод формы, где пользователи должны вводить дату, только в виде года. Очевидно, я могу проверить, что числовое число ввода имеет только 4 символа, но что было бы лучшим способом обеспечить, чтобы введенный номер был разумным числом для даты?

ответ

10

Этого было бы достаточно для простой проверки;

$input = (int)$input; 
    if($input>1000 && $input<2100) 
    { 
     //valid 
    } 
+0

Это именно то, что я хотел бы сделать, за исключением того, что я использовал бы PHP встроенный механизм фильтрации 'if (filter_input (INPUT_GET/* или INPUT_POST в зависимости * /," год ", FILTER_VALIDATE_INT, array (" options "=> array (" min "=> 1900," max "=> 2100)))! = false) ... ' –

+2

@ Джордан С. Джонс: Eeks, независимо от того, как вы отступаете, он остается нечитаемым. Совокупность встроенных PHP-скриптов на самом деле делает рик« бесполезно », и вы нашли его. – Kris

1

использование strtotime.

Возвращает временную метку успеха, FALSE в противном случае. До PHP 5.1.0 эта функция вернет -1 при сбое.

вы можете сделать это

<?php 
$year = '-1222'; 

$valid = true; 

if (strtotime($year) === false) { 
    $valid = false; 
} 
// more of your code 
?> 
+2

Это не сработает, если год был до 1970 года, что может быть плохо, если форма предназначена для года рождения. – RyanY

+0

@Вы в порядке. кажется, я не думаю, что это правильно –

+0

Я на 100% с вашим направлением, хотя ... всегда лучше использовать встроенные функции, когда это возможно, а не изобретать колесо. – RyanY

1

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

+0

Спасибо всем - ответы действительно полезны. В этом случае (который я должен был сказать) дата публикации книг. Я предполагаю, что единственная оговорка в том, что дата не будет больше, чем в текущем году.Большинство лет будет в течение 20-го (или текущего) века, но вполне возможно, что некоторые из них могут быть раньше (хотя я не уверен, насколько раньше), я полагаю, это зависит от вкусов читателя как приложения это вопрос для людей, чтобы следить за прочитанными ими книгами, читать их и т. д. Еще раз спасибо. Ваши ответы дали мне много о чем подумать. – BlissC

3

«Разумный» - это то, что должно быть определено вашим бизнес-правила приложения и/или ваш носитель данных.

В MySQL тип столбца DATETIME имеет допустимый диапазон «1000-01-01 00:00:00» до «9999-12-31 23:59:59», в то время как TIMESTAMP имеет допустимый диапазон ' 1970-01-01 00:00:01 'UTC to' 2038-01-19 03:14:07 'UTC.

Если вы просите пользователя о своем рождении, то вам нужно будет вернуться назад до 1900 года. Однако, если вы зададите себе будущую встречу, то только 2009+ действительный.

2

Вы можете просто использовать библиотеку валидации:

http://validatious.org/learn/examples

И использовать min-val и max-val ограничить варианты. Или, что еще проще, просто дайте им поле со списком действительных лет (html <select> tag)

Просто имейте в виду, что действительные годы зависят от вашей концепции действительного. Возможно, за 110 лет до этого года можно было бы действовать, если мы говорим о возрасте пользователей (date(Y) - 110), но это может быть неверно для некоторых других вещей.

+0

дает людям капля n (поле со списком - это тот, где вы также можете ввести ...) не гарантирует, что вы получите предопределенное значение как действительное. никогда не доверяйте форме ввода, даже если у вас есть замечательная проверка на стороне клиента. – Kris

0

Эта функция проверяет, находится ли введенный год между текущим годом & 100 лет назад.

function isValidYear($year) 
{ 
    // Convert to timestamp 
    $start_year   = strtotime(date('Y') - 100); //100 Years back 
    $end_year   = strtotime(date('Y')); // Current Year 
    $received_year  = strtotime($year); 

    // Check that user date is between start & end 
    return (($received_year >= $start_year) && ($received_year <= $end_year)); 
} 
Смежные вопросы