Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проверка введенных дат 
V
    Опции темы
rulez22
  Дата 7.4.2007, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.4.2007

Репутация: нет
Всего: нет



В php совсем слабо разбираюсь (не женское это дело видимо), ну да ладно. Подскажите пожалуйста с примером кто может как ограничить ввод неверно введенных дат?
Код ниже. Пример - если нарочно ввести 1 февраля и 31 февраля (!) то скрипт выдает 30 ночей промежуток. Видимо он считает до 3-го марта.
Видимо надо использовать checkdate но как - ума не приложу


Код


<?php
function getdates($start,$end) 
{ 
$number = $start; 
$menu .= "<option value=\"\"></option>\n"; 

while ($number <= $end) 
{ 
$menu .= "<option value=\"$number\">$number</option>\n"; 

$number++; 
}//end while 

return $menu; 

}//end getdates 

function getForm($monthMenu, $dayMenu, $yearMenu) 
{ 
print "<form name=\"dateForm\" action=\"test.php\" method=\"POST\")"; 
echo "</br>"; 
echo "Check-in date: "; 
echo '<select name = "startDay">'; 
print $dayMenu; 
echo '</select>'; 
echo "/"; 
echo '<select name = "startMonth">'; 
print $monthMenu; 
echo '</select>'; 
echo "/"; 
echo '<select name = "startYear">'; 
print $yearMenu; 
echo '</select>'; 
echo '<br />';
echo "Check-out date: "; 
echo '<select name = "endDay">'; 
print $dayMenu; 
echo '</select>'; 
echo "/"; 
echo '<select name = "endMonth">'; 
print $monthMenu; 
echo '</select>'; 
echo "/"; 
echo '<select name = "endYear">'; 
print $yearMenu; 
echo '</select>'; 
echo '<br /><br /><input type="submit" name="submitDate" value="Submit">'; 
echo '</form>'; 

}// end getForm 

$dateDiff = mktime(0,0,0,$_POST[endMonth],$_POST[endDay],$_POST[endYear]) - mktime(0,0,0,$_POST[startMonth],$_POST[startDay],$_POST[startYear]);

if (isset($_POST[submitDate])) 
{ 

echo 'Your booking is for a period of ' . floor($dateDiff/60/60/24) . ' nights';

}//end if 
else 
{ 
$startDay = 1; 
$endDay = 31; 

$startMonth = 1; 
$endMonth = 12; 

$startYear = 2007; 
$endYear = 2015; 

$dayMenu = $monthMenu = getdates($startDay, $endDay); 
$monthMenu = getdates($startMonth, $endMonth); 
$yearMenu = getdates($startYear, $endYear); 

getForm( $monthMenu,$dayMenu, $yearMenu); 

}//end else 

?>



Заранее благодарю

Это сообщение отредактировал(а) rulez22 - 7.4.2007, 18:21
PM MAIL   Вверх
Sergey912
Дата 7.4.2007, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 3.1.2007

Репутация: нет
Всего: нет



rulez22, 
Я бы посоветовал сделать интерфейс, который неверных небудет допускать впринципе, если об этом речь. Т.к. проверять все что может придумать пользователь если дать ему строку - дело гиблое и нагружать правилами тоже не дело.

Можно написать несложную ф-ю на JS, всего пару раз писал на нем, сейчас не смогу сходу. Сделать списками день\месяц\год и при выборе месяца менять список дат для него.


На всякий случай в php:
Код

$array = ('январь'=>31, 'февраль'=>28)
if($array[$month]<=$day){
echo 'Верная дата'
} else {
echo 'Поставь JS и не лезь куда не надо!'}


Но это на случай, если у него JS отключен, такие шастают. Введет еще не то что надо.
PM MAIL WWW   Вверх
SelenIT
Дата 7.4.2007, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



Sergey912, делать защиту на JS - вообще гиблое дело. С помощью JS можно сделать ввод правильной даты более удобным (например, путем выбора из календаря), но от проверки на сервере это не избавляет - серверный программист всегда должен быть "немного параноиком" и готовиться к худшему ("каждый второй юзер - злобный хакер").


rulez22, а какие трудности с checkdate? В документации ведь все неплохо расписано. Прямо вставляйте перед вычислением разницы дат
Код

if (!checkdate($_POST['startMonth'],$_POST['startDay'],$_POST['startYear'])) echo "Чё эт вы мне вместо даты подсунули? Живо исправьте!:)";

и дальше делайте как Вам удобне - перенаправляйте обратно на форму или выводите форму здесь же, подсветив как-нибудь неверные поля и т.д...

И еще пара замечаний:
  • Строковые ключи массивов, как и любые строки вообще, нужно брать в кавычки. Если в строки не предполагается вставлять переменные, то лучше одинарные кавычки.
  • floor для разницы между полуночьями может ошибиться, если стартовая дата была при зимнем времени, а конечная - при летнем (при переводе "теряется" час и в сутках оказывается всего 82800 с). Используйте round вместо floor или (а лучше для надежности и) gmmktime вместо mktime - там летнего времени и проблем с ним нет.



--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
rulez22
Дата 8.4.2007, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.4.2007

Репутация: нет
Всего: нет



SelenIT полностью согласна, я так и планировала, js удобный ввод и ограничение и "подстраховка" с помощью php
PM MAIL   Вверх
rulez22
Дата 8.4.2007, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.4.2007

Репутация: нет
Всего: нет



Считать то считает и проверка работает верно, но, 2 проблемы:
1) при первом открытии скрипта в браузере отображается "Incorrect check-out dates"
2) даже после ошибки выдает количество ночей 
"Incorrect check-out dates
Your booking is for a period of 30 nights"


Код

<?php

function getdates($start,$end) 
{ 
$number = $start; 

$menu .= "\n\n"; 

while ($number <= $end) 
{ 
$menu .= "<option value=\"$number\">$number</option>\n"; 

$number++; 
}//end while 

return $menu; 

}//end getdates 


function getForm($monthMenu, $dayMenu, $yearMenu) 
{ 
print "<form name=\"dateForm\" action=\"test.php\" method=\"POST\")"; 
echo "</br>"; 
echo "Check-in date: "; 
echo '<select name = "startDay">'; 
print $dayMenu; 
echo '</select>'; 
echo "/"; 
echo '<select name = "startMonth">'; 
print $monthMenu; 
echo '</select>'; 
echo "/"; 
echo '<select name = "startYear">'; 
print $yearMenu; 
echo '</select>'; 

echo '<br />';

echo "Check-out date: "; 
echo '<select name = "endDay">'; 
print $dayMenu; 
echo '</select>'; 
echo "/"; 
echo '<select name = "endMonth">'; 
print $monthMenu; 
echo '</select>'; 
echo "/"; 
echo '<select name = "endYear">'; 
print $yearMenu; 
echo '</select>'; 

echo '<br /><br /><input type="submit" name="submitDate" value="Submit">'; 
echo '</form>'; 

}// end getForm 


if (!checkdate($_POST['endMonth'],$_POST['endDay'],$_POST['endYear'])) echo "Incorrect check-out dates<br />";


$dateDiff = gmmktime(0,0,0,$_POST[endMonth],$_POST[endDay],$_POST[endYear]) - gmmktime(0,0,0,$_POST[startMonth],$_POST[startDay],$_POST[startYear]);

if (isset($_POST[submitDate])) 
{ 

echo 'Your booking is for a period of ' .( round($dateDiff/60/60/24)). ' nights';

}//end if 
else 
{ 

$startDay = '1'; 
$endDay = '31'; 

$startMonth = '1'; 
$endMonth = '12'; 

$startYear = '2007'; 
$endYear = '2015'; 

$dayMenu = $monthMenu = getdates($startDay, $endDay); 
$monthMenu = getdates($startMonth, $endMonth); 
$yearMenu = getdates($startYear, $endYear); 

getForm( $monthMenu,$dayMenu, $yearMenu); 


}//end else 

?>

PM MAIL   Вверх
Всемогущий
Дата 9.4.2007, 06:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 25.6.2006
Где: Челябинск

Репутация: 5
Всего: 13



выходит что тема не завершена

спрашиавй и тебе помогут.
Код

<?php



//проверяем правильно ли введены данные и введенеы ли вообще
if (isset($_POST['endMonth'],$_POST['endDay'],$_POST['endYear']) and checkdate($_POST['endMonth'],$_POST['endDay'],$_POST['endYear']))echo $ok=true;else {echo "Incorrect check-out dates<br />"; $ok=false;}

//вычисляем разницу в секундах между датами
$dateDiff = gmmktime(0,0,0,$_POST['endMonth'],$_POST['endDay'],$_POST['endYear']) - gmmktime(0,0,0,$_POST['startMonth'],$_POST['startDay'],$_POST['startYear']);

if (isset($_POST['submitDate']) and $ok)
{
//так ка один деть состоит из 60*60*24 секунд делаем обратную операцию и печатаем ответ
echo 'Your booking is for a period of ' .(round($dateDiff/60/60/24)). ' nights';

}//end if
else
{

$startDay = '1';
$endDay = '31';

$startMonth = '1';
$endMonth = '12';

$startYear = '2007';
$endYear = '2015';

$dayMenu = $monthMenu = getdates($startDay, $endDay);
$monthMenu = getdates($startMonth, $endMonth);
$yearMenu = getdates($startYear, $endYear);
getForm( $monthMenu,$dayMenu, $yearMenu);
}//end else



function getdates($start,$end){
         //функция рисует пункты меню для  <select>
$menu='';
for ($i=$start; $i<=$end; $i++) {$menu .= "\r\n<option value=\"$i\">$i</option>\n";}
return $menu;
}


function getForm($monthMenu, $dayMenu, $yearMenu)
{
echo <<<HWRZ
<form name="dateForm" action="test.php" method="POST"></br>
Check-in date:
<select name = "startDay">
$dayMenu
</select>
/
<select name = "startMonth">
$monthMenu
</select>
/
<select name = "startYear">
$yearMenu
</select><br />
Check-out date:
<select name = "endDay">
$dayMenu
</select>
/
<select name = "endMonth">
$monthMenu
</select>
/
<select name = "endYear">
$yearMenu
</select>
<br /><br /><input type="submit" name="submitDate" value="Submit">
</form>
HWRZ;
}// end getForm
?>




--------------------
Цитата(smartov @  16.1.2007,  13:26 Найти цитируемый пост)
Видел я PHP код, который пишут наСильники, никогда на php не писавшие  :D  То еще зрелище. Все пытаются сделать руками и через ж (как в С привыкли). Все пытаются память освобождать итд итп. 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0575 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.