|
|
|
| Здравствуйте.
Есть форма с двумя полями date1 и date2. В полях указывается дата формата Y-m-d(как в mysql поле типа DATE). Нужно делать проверку, чтоб первая дата не была больше второй.
Делаю так: if($date1 > $date2) {die();} //пока работает
Правильно ли так делать или надежней сначала даты в секунды перевести? | |
|
|
|
|
|
|
|
для: ladan
(04.08.2012 в 16:43)
| | Если Y-m-d, то все будет корректно, но ведь можно ввести и как d-m-Y, вот тогда косяк. | |
|
|
|
|
|
|
|
для: confirm
(04.08.2012 в 16:47)
| | Спасибо еще раз! Это не проблема, с регулярными выражениями дружу :) | |
|
|
|
|
|
|
|
для: ladan
(04.08.2012 в 16:53)
| | Опять вы за рег. выражения, где они совсем не нужны? | |
|
|
|
|
|
|
|
для: confirm
(04.08.2012 в 16:54)
| | Не, там уже другое, не связанное с вашим календарем :) | |
|
|
|
|
|
|
|
для: ladan
(04.08.2012 в 17:01)
| | А при чем тут календарь? Я говорю, что дату можно ввести и как d-m-Y, и это строка, и если сравнивать такие строки, то это некорректно. А вы что ответили - "дружите с рег. выражениями", то есть чтобы узнать верен ли формат ввода даты, будете использовать рег. выражения, я правильно понял? А зачем? | |
|
|
|
|
|
|
|
для: confirm
(04.08.2012 в 17:11)
| | Я понял, что если сравнивать такие строки, то будут косяки..
Я думал, что входящие данные лучше через регулярные выражения проверять. А как еще проверить? :)
<?
if(!preg_match("#^[0-9]{4}-[0-9]{2}-[0-9]{2}$#",$_POST['date1']) or !preg_match("#^[0-9]{4}-[0-9]{2}-[0-9]{2}$#",$_POST['date2']) or $_POST['date1'] > $_POST['date2'] or !strtotime($_POST['date1']) or !strtotime($_POST['date2'])) {die();}
?>
|
| |
|
|
|
|
|
|
|
для: ladan
(04.08.2012 в 17:40)
| | Как проверить? Ну так вы дочитайте до конца описание функции strtotime(), что она возвращает в случае неудачи. Не мешало бы посмотреть, что она будет возвращать в случае написания даты как: Y-m-d и m-d-Y. После этого вопросы отпадут. | |
|
|
|
|
|
|
|
для: confirm
(04.08.2012 в 17:54)
| | Так вариант с 'm-d-Y' ведь сразу отпадает из-за условия, остается только что-нибудь 0000-00-00
Возвращает ошибку в случае неудачи, ну вроде бы все правильно... !strtotime(3000-01-01) самое то отзлодеев | |
|
|
|
|
|
|
|
для: ladan
(04.08.2012 в 18:40)
| | Что значит отпадает, разве пользователь не может ввести дату в таком формате?
Вы изучили strtotime()? | |
|
|
|
|
|
|
|
для: confirm
(04.08.2012 в 18:45)
| | Что значит отпадает, разве пользователь не может ввести дату в таком формате?
Сможет, но ему тут же die() будет :)
Забыл сказать, что пользователу откроется js календарь по нажатию на поле и сможет выбрать дату, а дата автоматически указывается в формате Y-m-d
Данные от пользователя проверяются, ввел ли он Y-m-d или отключил js и указал m-d-Y...
что она будет возвращать в случае написания даты как: Y-m-d и m-d-Y
strototime("2012-01-01") и strtotime("01-01-2012") возвращают одно и тоже..
Вы изучили strtotime()?
Самое основное :)
Возвращает метку времени с начала эпохи. 2012-08-04(либо другой формат) минус 1970-01-01 и получаем секунды.
Или возращает false в случае ошибки.
Я не думаю, что кто-то будет вводить в ручную даты 1800-01-01, это к беде на сайте не приведет :) Да и такое сможет ввести только зарегистрированный пользователь | |
|
|
|
|
|
|
|
для: ladan
(04.08.2012 в 19:18)
| | Вопрос в том, как достичь этого die() - или заниматься ерундой используя рег. выражения, или все-таки подумать. Вот об этом речь.
Мне ничего не стоит отключить JS, написать свою страницу и отправить форму вам с нее, тогда как?
А то, что вы не думаете, что кто-то не введет 1800-01-01, то это весьма печально - человек имеет права на ошибку, а вы обязаны проверять наличие их. И формат даты в нашей стране, это - d.m.Y, и это не является ошибкой!
Возвращайтесь еще раз к strtotime() - может ли она одна ответить на все вопросы? | |
|
|
|
|
|
|
|
для: confirm
(04.08.2012 в 19:32)
| | Я с вами спорить не буду) я знаю, что вы намного больше знаете чем я :)
Я не знаю таких функций, чтоб проверить дату на нужный мне формат.. Для меня самое простое это написать регулярку и все! =)
А то, что вы не думаете, что кто-то не введет 1800-01-01, то это весьма печально - человек имеет права на ошибку, а вы обязаны проверять наличие их.
Добраться до формы с датами без js не сможет. Тут явно злодея можно вычислить и наказать как следует :)
И формат даты в нашей стране, это - d.m.Y, и это не является ошибкой!
Я только из-за удобства Y-m-d использую! Т.к нужно по мимо тех условий, нужно еще и с датами в базе сравнить..
Возвращайтесь еще раз к strtotime() - может ли она одна ответить на все вопросы?
Да вроде пойдет, не считая, что 1800-01-01 можно указать в форме :) | |
|
|
|
|
|
|
|
для: ladan
(04.08.2012 в 19:59)
| | Если вас будут долбить с целю пробить, то анализировать будут как раз ошибки, которые смачно будут вылазить изо всех щелей скриптов ваших, если вместо того, чтобы обязательно проверять все данные полученные от пользователя вы будете предполагать.
Добираться до вашей формы нет необходимости, достаточно ее один раз увидеть. JavaScript - это язык клиентский, что означает потенциально опасен для сервера.
Я вам на примере календаря вроде бы объяснял, чего достаточно для его построения, так чем данная задача отличается, если в ней опять речь идет о дате?
<?
$date = array("","4.8.2012","2012.8.4","4-8-2012","2012-8-4","2012/8/4","4/8/2012");
while(next($date)) echo date("Y-m-d",strtotime(current($date)))."<br>";
|
Это о чем либо говорит? Неужто трудно понять, что функция strtotime() вернет значение, которое проверив можно получить ответ на все вопросы: корректен ли формат даты, если да, то не выходит ли дата за рамки пределов (если надо), и не зависимо от формата даты полученной от пользователя, сохранить ее в нужном формате? | |
|
|
|
|
|
|
|
для: confirm
(04.08.2012 в 21:06)
| | Представляю картину: пользователь заходит на сайт, переходит через js навигацию на страницу с формой, потом отключает js и вводит свои значения, вместо того, чтоб один раз нажать на поле и выбрать дату! Вот по этому для таких пользователей такие проверки типа $date = array("","4.8.2012","2012.8.4","4-8-2012","2012-8-4","2012/8/4","4/8/2012"); - роскошь :)
Никто ошибок не увидет, все прячется через error_reporting(0) и через условия c die(); =) | |
|
|
|
|
|
|
|
для: ladan
(04.08.2012 в 23:35)
| | Простите великодушно, я видимо лезу не в свое дело, однако почему-то хочется высказать свое мнение: проверки от дурака необходимы не потому, что какой либо пользователь начнет вводить свои значения, а для того, чтобы не было проблем у Вас, как хозяина сайта... :\ | |
|
|
|
|
|
|
|
для: ladan
(04.08.2012 в 23:35)
| | Ничего вы не представляете, но вы правы. Если проверка данных для вас, это "беситься с жиру", а error_reporting, это и есть защита приложения, то вам действительно ничего не надо. Вам достаточно вооружиться preg_шутерами, щита в виде error_reporting и вперед, завоевывать интернет пространство.
Зря я вам в двух темах пытался что-то объяснить. | |
|
|
|
|
|
|
|
для: confirm
(05.08.2012 в 09:09)
| | error_reporting использую вместо @. Да и это не защита, а просто чтоб контент выглядел нормально в некоторых местах
Вы не думайте, что я плохо проверяю данные :)
Ничего не зря! Если бы не ваше участие в первой теме, пришлось бы изобретать очередной велосипед! | |
|
|
|
|
|
|
|
для: ladan
(05.08.2012 в 10:12)
| | Если бы не зря, то на пример массива с датами, мною приведенный, такого бы понимания его: "Вот по этому для таких пользователей такие проверки типа $date = array("","4.8.2012","2012.8.4","4-8-2012","2012-8-4","2012/8/4","4/8/2012"); - роскошь :)" не было.
Этот ваш комментарий может означать только одно - вы, если и читаете, совсем не понимаете истинного назначения функции, выгоды ее применения в том или ином случае.
Ну а про защиту я вообще молчу. | |
|
|
|