| |
|
|
| | У самой ума или опыта не хватило и пришлось полазить в НЕТЕ.
Нашла скрипт и немного доработала. Правда нужна еще проверка на месяца с 30 днями и високосные года.
Сам скрипт пришлось продублировать на каждую дату. Они похожи, но первый обрабатывает дату по отнашению к сегоднешнему дню, а второй по отнашению к первой (datea)
И так первый :
<?php
//////////////////////////////////////////////////////////////////////////////
$prDay=date('d');
$prMonth=date('m');
$prYear=date('Y');
$curentDate=date('m/d/Y');
$ntYear=$prYear+1;
//Check whether the submission is made
if(!isset($_POST["search"]))
{
//Declarate the necessary variables
$strdateA="";
$strdate1="";
DisplayForm();
}
else
{
$strdateA=$_POST["datea"];
$strdateA = stripslashes($strdateA);
$strdateA = htmlspecialchars($strdateA);
$strdateA = addslashes($strdateA);
//Check the length of the entered Date value
if((strlen($strdateA)<10)OR(strlen($strdateA)>10))
{
echo("<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Enter the check-in date in 'mm/dd/yyyy' format.</p>
<ul>
<li><a>The check-in date you have entered does not respond to the required system format.
It must not contain any letters and, or other symbols with the exception of '<b>/</b>'.
Please, select a date from the calendar or type the date using numerals
in '<b>mm/dd/yyyy</b>' format only.</a></li>
</ul>
</div>");
}
else
{
//The entered value is checked for proper Date format
if((substr_count($strdateA,"/"))<>2)
{
echo("<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Please, use the calendar to enter the check-in date in required 'mm/dd/yyyy' format!</p>
</div>");
}
else
{
$pos=strpos($strdateA,"/");
$month=substr($strdateA,0,($pos));
$result=ereg("^[0-9]+$",$month,$trashed);
if(!($result))
{
echo "<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Enter a valid check-in month.</p>
<ul>
<li><a>The month you have entered containes letters and, or other symbols. Please, select a date from the calendar or type the date using numerals only.</a></li>
</ul>
</div>";
}
///////////////////INSERTING THE YEAR CHECK START/////////////////////////////////////
$year=substr($strdateA,($pos+4),strlen($strdateA));
$result=ereg("^[0-9]+$",$year,$trashed);
if(!($result))
{
echo "<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Enter a valid check-in year.</p>
<ul>
<li><a>The year you have entered containes letters and, or other symbols. Please, select a date from the calendar or type the date using numerals only.</a></li>
</ul>
</div>";
}
else
{
if(($year<$prYear)OR($year>($ntYear)))
{
echo "<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Enter a valid check-in year.</p>
<ul>
<li><a>We can only accept dates that occur between <b>'$prMonth/$prDay/$prYear'</b> and <b>'12/31/$ntYear'</b>. Please, change the entered year.</a></li>
</ul>
</div>";
}
///////////////////////OVER YEAR CHECK//////////////////////////////////////////////////
///////////////////////GO ON WITH THE MONTH CHECK//////////////////////////////////////////////////
else
{
if(($month<$prMonth) AND ($year==$prYear))
{
echo "<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Enter a valid check-in month.</p>
<ul>
<li><a>We can only accept dates that occur between <b>'$prMonth/$prDay/$prYear'</b> and <b>'12/31/$ntYear'</b>. Please, change the entered month.</a></li>
</ul>
</div>";
}
if(($month>12))
{
echo "<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Enter a valid check-in month.</p>
<ul>
<li><a>The month you have entered does not exist. Please, select a date from the calendar.</a></li>
</ul>
</div>";
}
////////////////////////INSERTING THE DATE CHECK START///////////////////////////////////
$date=substr($strdateA,($pos+1),($pos));
if(($date<$prDay)AND ($month==$prMonth) AND ($year==$prYear))
{
echo "<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Enter a valid check-in day.</p>
<ul>
<li><a>We can only accept dates that occur between <b>'$prMonth/$prDay/$prYear'</b> and <b>'12/31/$ntYear'</b>. Please, change the entered day.</a></li>
</ul>
</div>";
}
if(($date>31))
{
echo "<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Enter a valid check-in day.</p>
<ul>
<li><a>The day you have entered does not exist. Please, select a date from the calendar.</a></li>
</ul>
</div>";
}
else
{
$result=ereg("^[0-9]+$",$date,$trashed);
if(!($result))
{
echo "<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Enter a valid check-in date.</p>
<ul>
<li><a>The day you have entered containes letters and, or other symbols. Please, select a date from the calendar or type the date using numerals only.</a></li>
</ul>
</div>";
}
}
/////////////////////////OVER DATE CHECK///////////////////////////////
}
}
///////////////////////////////////////////////////////////
}
}
DisplayForm();
}
//User-defined Function to display the form in case of Error
function DisplayForm(){
global $strdateA;
return;
}
?>
|
Второй скрипт :
<?php
//////////////////////////////////////////////////////////////////////////////
$prDay=date('d');
$prMonth=date('m');
$prYear=date('Y');
$curentDate=date('m/d/Y');
$ntYear=$prYear+1;
//Check whether the submission is made
if(!isset($_POST["search"]))
{
//Declarate the necessary variables
$strdateB="";
$strdate1="";
DisplayFormB();
}
else
{
$strdateB=$_POST["dated"];
$strdateB = stripslashes($strdateB);
$strdateB = htmlspecialchars($strdateB);
$strdateB = addslashes($strdateB);
//Check the length of the entered Date value
if((strlen($strdateB)<10)OR(strlen($strdateB)>10))
{
echo("<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Enter the check-out date in 'mm/dd/yyyy' format.</p>
<ul>
<li><a>The check-out date you have entered does not respond to the required system format.
It must not contain any letters and, or other symbols with the exception of '<b>/</b>'.
Please, select a date from the calendar or type the date using numerals
in '<b>mm/dd/yyyy</b>' format only.</a></li>
</ul>
</div>");
}
else
{
//The entered value is checked for proper Date format
if((substr_count($strdateB,"/"))<>2)
{
echo("<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Please, use the calendar to enter the check-out date in required 'mm/dd/yyyy' format!</p>
</div>");
}
else
{
$pos=strpos($strdateB,"/");
$month=substr($strdateB,0,($pos));
$result=ereg("^[0-9]+$",$month,$trashed);
if(!($result))
{
echo "<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Enter a valid check-out month.</p>
<ul>
<li><a>The month you have entered containes letters and, or other symbols. Please, select a date from the calendar or type the date using numerals only.</a></li>
</ul>
</div>";
}
///////////////////INSERTING THE YEAR CHECK START/////////////////////////////////////
$year=substr($strdateB,($pos+4),strlen($strdateB));
$result=ereg("^[0-9]+$",$year,$trashed);
if(!($result))
{
echo "<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Enter a valid check-out year.</p>
<ul>
<li><a>The year you have entered containes letters and, or other symbols. Please, select a date from the calendar or type the date using numerals only.</a></li>
</ul>
</div>";
}
else
{
if(($year<$prYear)OR($year>($ntYear)))
{
echo "<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Enter a valid check-out year.</p>
<ul>
<li><a>We can only accept dates that occur between <b>'$prMonth/$prDay/$prYear'</b> and <b>'12/31/$ntYear'</b>. Please, change the entered year.</a></li>
</ul>
</div>";
}
///////////////////////OVER YEAR CHECK//////////////////////////////////////////////////
///////////////////////GO ON WITH THE MONTH CHECK//////////////////////////////////////////////////
else
{
if(($month<$prMonth) AND ($year==$prYear))
{
echo "<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Enter a valid check-out month.</p>
<ul>
<li><a>We can only accept dates that occur between <b>'$prMonth/$prDay/$prYear'</b> and <b>'12/31/$ntYear'</b>. Please, change the entered month.</a></li>
</ul>
</div>";
}
if(($month>12))
{
echo "<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Enter a valid check-out month.</p>
<ul>
<li><a>The month you have entered does not exist. Please, select a date from the calendar.</a></li>
</ul>
</div>";
}
////////////////////////INSERTING THE DATE CHECK START///////////////////////////////////
$date=substr($strdateB,($pos+1),($pos));
if(($date<$prDay)AND ($month==$prMonth) AND ($year==$prYear))
{
echo "<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Enter a valid check-out day.</p>
<ul>
<li><a>We can only accept dates that occur between <b>'$prMonth/$prDay/$prYear'</b> and <b>'12/31/$ntYear'</b>. Please, change the entered day.</a></li>
</ul>
</div>";
}
if(($date>31))
{
echo "<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Enter a valid check-out day.</p>
<ul>
<li><a>The day you have entered does not exist. Please, select a date from the calendar.</a></li>
</ul>
</div>";
}
else
{
$result=ereg("^[0-9]+$",$date,$trashed);
if(!($result))
{
echo "<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Enter a valid check-out date.</p>
<ul>
<li><a>The day you have entered containes letters and, or other symbols. Please, select a date from the calendar or type the date using numerals only.</a></li>
</ul>
</div>";
}
}
/////////////////////////OVER DATE CHECK///////////////////////////////
}
}
///////////////////////////////////////////////////////////
}
}
DisplayFormB();
}
//User-defined Function to display the form in case of Error
function DisplayFormB(){
global $strdateB;
return;
}
?>
|
Помогите пожалуйста с проверкой на месяца с 30 днями и на високосные года.
Вывод ошибки для условия
if(($_POST['datea']>$_POST['dated']))
{
echo "<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Please, check entered dates.</p>
<ul>
<li><a>The check-out date must occur after the check-in date. Please change the check-in date.</a></li>
</ul>
</div>";
}
так же необходим, но оно не работает
|
А вообще можно все это сделать короче?
Спасибо... | |
| |
|
|
| |
|
|
| |
для: sasch
(26.05.2006 в 14:02)
| | | Для начала расскажите что делает этот скрипт, что он должен делать, а что делает неправильно.
Ещё лучше, расскажите какие данные приходят в скрипт, какие проверки должны производиться, и какие данные должны выходить из скрипта.
P. S.
Такое огромные скрипты принято сохранять в файл и прикреплять к сообщению. | |
| |
|
|
| |
|
|
| |
для: Саня
(26.05.2006 в 14:20)
| | | Этот скрипт производит проверку дат. Принцип работы аналогичен с http://www.expedia.com/daily/hotels/default.asp?rfrr=-383. Попробуйте вводить неправильные данные даты типа (kj?><!+9) или дату заезда больще дады выезда. Скрипт будет вас информировать об ошибках.
В моем случае данные приходят в скрипт через форму посредством метода POST, результат, даже если дата не в том формате, отображается в похожей форме на другой странице, НО выводится предупреждение об ошибке и результаты запроса не будут веводиться. Если все OK ,то происходит вывод данных.
Мне хотелось бы добавить в этот скрипт проверку на месяца с 30 днями и високосные года, но не знаю как это сделать. | |
| |
|
|
| |
|
|
| |
для: sasch
(26.05.2006 в 14:02)
| | | а нельзя было сделать защищенный блок, в котором введенную дату скармливать, например, ф-ии mktime(), и если ошибки не было, значит дата введена верно. Весь код занял бы 10 строк... но это только в пхп5, если я не ошибаюсь | |
| |
|
|
| |
|
|
| |
для: ec_stasis
(26.05.2006 в 15:32)
| | | А вы не могли бы привести пример к моему случаю.
Спасибо | |
| |
|
|
| |
|
|
| |
для: sasch
(26.05.2006 в 15:34)
| | | Ах, у меня же нет PHP 5, но все равно если вам не трудно приведите пример. | |
| |
|
|
| |
|
|
| |
для: sasch
(26.05.2006 в 15:37)
| | | Вы бы написали для начала, в каком виде Вы хотите вводить даты... | |
| |
|
|
| |
|
|
| |
для: Trianon
(26.05.2006 в 15:56)
| | | Если вы говорите про формат, то mm/dd/yyyy | |
| |
|
|
| |
|
|
| |
для: sasch
(26.05.2006 в 15:58)
| | |
<?php
function cvt($ds)
{
if(!is_string($ds))
return false;
$tri = explode('/',$ds);
if(count($tri) != 3)
return false;
$tm = mktime(0,0,0,$tri[1], $tri[0], $tri[2]);
$dt = date("d/m/Y", $tm);
if($dt != $ds)
return false;
return $tm;
}
if(isset($_POST['date1']) && isset($_POST['date2']) )
{
$date1 = $_POST['date1']; $d1 = cvt($date1);
$date2 = $_POST['date2']; $d2 = cvt($date2);
if(false === $d1)
echo 'Invalid date #1 - must be in dd/mm/yyyy format!<br>';
if(false === $d2)
echo 'Invalid date #2 - must be in dd/mm/yyyy format!<br>';
$v = ($d2 - $d1)/86400;
echo "Time interval between $date1 and $date2 is $v days<br>";
}
else
{
?>
<form method=post >
<input name=date1 value='<?=date("d/m/Y") ?>' />
<input name=date2 value='<?=date("d/m/Y") ?>' />
<input type=submit value='interval' />
</form><?
}
?>
|
| |
| |
|
|
| |
|
|
| |
для: Trianon
(26.05.2006 в 16:21)
| | | Не работает. Возможно из-за того, что у меня не PHP5?
Ну все равно спасибо.
Ну все же, как мне добавить проверку на месяцы с 30 днями и високосные года? | |
| |
|
|
| |
|
|
| |
для: sasch
(26.05.2006 в 16:38)
| | | Не работает - это как?
php 5 тут ни при чем. Этот код на PHP 4 должен иди. У меня идет, во всяком случае.
А проверка выполняется полностью.
Недопустимые даты не проходят точно также как и даты с неверным форматом. | |
| |
|
|
| |
|
|
| |
для: Trianon
(26.05.2006 в 16:54)
| | | Дело в том, что скрипт не вызывает ни каких ошибок, но выводит всегда
if(isset($_POST['date1']) && isset($_POST['date2']) )
{
$date1 = $_POST['date1']; $d1 = cvt($date1);
$date2 = $_POST['date2']; $d2 = cvt($date2);
if(false === $d1)
echo 'Invalid date #1 - must be in dd/mm/yyyy format!<br>';
if(false === $d2)
echo 'Invalid date #2 - must be in dd/mm/yyyy format!<br>';
$v = ($d2 - $d1)/86400;
echo "Time interval between $date1 and $date2 is $v days<br>";
|
все ошибки сразу. Вот я и подумала об несовместимости.
Все преобразования я сделала, но результат тот же.
Вот что получилось:
<?php
function cvt($ds)
{
if(!is_string($ds))
return false;
$tri = explode('/',$ds);
if(count($tri) != 3)
return false;
$tm = mktime(0,0,0,$tri[1], $tri[0], $tri[2]);
$dt = date("d/m/Y", $tm);
if($dt != $ds)
return false;
return $tm;
}
if(isset($_POST['datea']) && isset($_POST['dated']) )
{
$datea = $_POST['datea']; $d1 = cvt($datea);
$dated = $_POST['dated']; $d2 = cvt($dated);
if(false === $d1)
echo 'Invalid date #1 - must be in dd/mm/yyyy format!<br>';
if(false === $d2)
echo 'Invalid date #2 - must be in dd/mm/yyyy format!<br>';
$v = ($d2 - $d1)/86400;
echo "Time interval between $datea and $dated is $v days<br>";
}
else
{
}
?>
|
Может ошиблась где? | |
| |
|
|
| |
|
|
| |
для: sasch
(26.05.2006 в 17:03)
| | | Что ж, попробуйте выяснить, почему отвергаются даты:
function cvt($ds)
{
if(!is_string($ds))
{
echo "$ds - not a string<br>";
return false;
}
if(strlen($ds) != 10)
{
echo "$ds - not a 10 chars length<br>";
return false;
}
$tri = explode('/',$ds);
if(count($tri) != 3)
{
echo "$ds - not in -/-/- form<br>";
return false;
}
$tm = mktime(0,0,0,$tri[1], $tri[0], $tri[2]);
$dt = date("d/m/Y", $tm);
if($dt != $ds)
{
echo "$ds - not matched backward to $dt<br>";
return false;
}
return $tm;
}
|
| |
| |
|
|
| |
|
|
| |
для: Trianon
(26.05.2006 в 17:14)
| | | Чего то я не пойму куда его надо поместить!
Ну да ладно пусть остается в таком виде, а как но счет проверок?
Ну все же, как мне добавить проверку на месяцы с 30 днями и високосные года? | |
| |
|
|
| |
|
|
| |
для: sasch
(26.05.2006 в 17:33)
| | | Проверка на месяцы с 30 днями, високосные года здесь присутствует.
Реализуется она обратным преобразованием.
Из строки с датой деалется три числа.
Из трех чисел - метка времени unix.
из метки времени делается строка.
если результирующая строка совпала с исходной - значит дата действительна.
А в действительной дате никаких 30 февраля быть не может по определению.
<?php
function cvt($ds)
{
if(!is_string($ds))
{
echo "$ds - not a string<br>";
return false;
}
if(strlen($ds) != 10)
{
echo "$ds - not a 10 chars length<br>";
return false;
}
$tri = explode('/',$ds);
if(count($tri) != 3)
{
echo "$ds - not in -/-/- form<br>";
return false;
}
$tm = mktime(0,0,0,$tri[1], $tri[0], $tri[2]);
$dt = date("d/m/Y", $tm);
if($dt != $ds)
{
echo "$ds - not matched backward to $dt<br>";
return false;
}
return $tm;
}
if(isset($_POST['datea']) && isset($_POST['dated']) )
{
$datea = $_POST['datea']; $d1 = cvt($datea);
$dated = $_POST['dated']; $d2 = cvt($dated);
if(false === $d1)
echo 'Invalid date #1 - must be in dd/mm/yyyy format!<br>';
if(false === $d2)
echo 'Invalid date #2 - must be in dd/mm/yyyy format!<br>';
$v = ($d2 - $d1)/86400;
echo "Time interval between $datea and $dated is $v days<br>";
}
else
{
}
?>
|
| |
| |
|
|
| |
|
|
| |
для: Trianon
(26.05.2006 в 17:38)
| | | Всесто старого кода вставила ваш и получилось см. вложение.
Я ни чего не понимаю у меня код не работает? | |
| |
|
|
| |
|
|
| |
для: sasch
(26.05.2006 в 17:47)
| | | прошу прощения, это я невнимательно прочел, в каком формате у Вас дата.
По идее, вот так должно исправиться.
<?php
function cvt($ds)
{
if(!is_string($ds))
return false;
$tri = explode('/',$ds);
if(count($tri) != 3)
return false;
$tm = mktime(0,0,0,$tri[0], $tri[1], $tri[2]);
$dt = date("m/d/Y", $tm);
if($dt != $ds)
return false;
return $tm;
}
if(isset($_POST['datea']) && isset($_POST['dated']) )
{
$datea = $_POST['datea']; $d1 = cvt($datea);
$dated = $_POST['dated']; $d2 = cvt($dated);
if(false === $d1)
echo 'Invalid date #1 - must be in mm/dd/yyyy format!<br>';
if(false === $d2)
echo 'Invalid date #2 - must be in mm/dd/yyyy format!<br>';
$v = intval(($d2 - $d1+3600*3)/86400);
echo "Time interval between $datea and $dated is $v days<br>";
}
else
{
}
?>
|
А американская последовательность записи даты - начиная с месяца - все равно редкая гадость. | |
| |
|
|
| |
|
|
| |
для: Trianon
(26.05.2006 в 17:58)
| | | О да! Работает!!! СПАСИБО!!! | |
| |
|
|
| |
|
|
| |
для: sasch
(26.05.2006 в 18:10)
| | | Только обратите внимание на исправление в строке
$v = intval(($d2 - $d1+3600*3)/86400);
Без него Плохо будет считаться интервал в разных сезонах (летнее/зимнее время). | |
| |
|
|
| |
|
|
| |
для: Trianon
(26.05.2006 в 18:12)
| | | Я все оставлю как вы написали вот только справки об ошибках переделаю покрасивее по ближе к стилю сайта, кстати как он? Спасибо еще раз за помощь. Это красивый и компактный код. see ya! | |
| |
|
|
| |
|
|
| |
для: sasch
(26.05.2006 в 18:20)
| | | А что надо добавить чтобы если кто-то выбирает последний день месяца, а поле для второй даты пропускает, то при переходе на другую страницу эта пропущенная дата становилась на 1 день больше первой и перепрыгивала на след. месяц? Пр. с 06/30/2006 на 07/01/2006. | |
| |
|
|
| |
|
|
| |
для: sasch
(26.05.2006 в 18:42)
| | |
<?
$days = 10; // сколько дней отсчитать
$prev = "06/30/2006"; // предыдущая дата
$prev_tm = cvt($prev); // метка времени предыдущей даты
$next_tm = $prev_tm + 3600*24*$days ; // метка времени следующей даты
if($days) $next_tm += (($days > 0)? 3 :(-3)) * 3600; // коррекция летнего/зимнего времени
$next = date("m/d/Y", $next_tm); // следующая дата
echo $next;
?>
|
| |
| |
|
|
| |
|
|
| |
для: sasch
(26.05.2006 в 18:20)
| | | Сообщения, конечно, переделайте - это же Ваш сайт.
Я их написал только чтобы понятно было, как условия проверки расставлять.
За оценку спасибо. Компактный ... это как сказать.
Его можно было бы сжать еще в два-три раза, но тогда он бы перестал быть понятным.
Касательно сайта... что я могу сказать, я ж видел только скриншот? Картинка красивая. | |
| |
|
|
| |
|
|
| |
для: Trianon
(26.05.2006 в 18:43)
| | |
$days = 1; // сколько дней отсчитать
$prev = $_POST['datea']; // предыдущая дата
$prev_tm = cvt($prev); // метка времени предыдущей даты
$next_tm = $prev_tm + 3600*24*$days ; // метка времени следующей даты
if($days) $next_tm += (($days > 0)? 3 :(-3)) * 3600; // коррекция летнего/зимнего времени
$next = date("m/d/Y", $next_tm); // следующая дата
//echo $next;
if (empty($_POST['dated'])){
$_POST['dated']=$next;
}
|
Вот так все работает! Я очень долго думала как же все это сделать, а вы просто сделали. Есть у кого поучиться. Извените что так долго мучила вопросами... Спасибо за помощь! | |
| |
|
|
| |
|
|
| |
для: sasch
(26.05.2006 в 19:25)
| | |
if (empty($_POST['dated']) && !empty($_POST['datea']) )
$_POST['dated']=date("m/d/Y",cvt($_POST['datea']) + 3600*27);
|
| |
| |
|
|
| |
|
|
| |
для: Trianon
(26.05.2006 в 19:37)
| | | Я в шоке. Ни чего не понимаю, но все работает. А можно пояснить, please?
$_POST['dated']=date("m/d/Y",cvt($_POST['datea']) + 3600*27);
|
| |
| |
|
|
| |
|
|
| |
для: sasch
(26.05.2006 в 19:47)
| | | Так а почему оно не должно работать?
Я взял код, который Вы показали, выкинул из него все промежуточные переменные и пояснения, которые там были. И чуть упростил оставив случай расчета лишь следующего дня.
Функцию преобразования даты в метку тоже можно вместо
function cvt($ds)
{
if(!is_string($ds))
return false;
$tri = explode('/',$ds);
if(count($tri) != 3)
return false;
$tm = mktime(0,0,0,$tri[0], $tri[1], $tri[2]);
$dt = date("m/d/Y", $tm);
if($dt != $ds)
return false;
return $tm;
}
|
сделать такой:
function cvt($ds) { if(count($tri = explode('/',$ds)) != 3) return false;
if(date("m/d/Y", ($tm = mktime(0,0,0,$tri[0], $tri[1], $tri[2]))) != $ds) return false;
return $tm; }
|
И тоже по сути не изменится ничего, кроме оформления... . | |
| |
|
|
| |
|
|
| |
для: Trianon
(26.05.2006 в 20:10)
| | | Ну почему я не пошла на программиста учиться. А водь хотела. ! До завтра. | |
| |
|
|
| |
|
|
| |
для: sasch
(26.05.2006 в 20:15)
| | | Все работает отлично. Но, если кто-нибудь введет дату типа того, что показано во влож. файле, то выводится ошибка. Отлично понимаю, что нормальный человек не будет вводить все подряд, но это имеет место быть и надо фильтровать введенную инфу. Сама не исправлю, но....
Так же выкладываю все что получилось для тех кого этот вопрос может зантересовать. Это хороший код!
Хочу еще раз поблагодарить Trianonа за помощь.
<?php
$days = 1; // сколько дней отсчитать
$prev = $_POST['datea']; // предыдущая дата
$prev_tm = cvt($prev); // метка времени предыдущей даты
$next_tm = $prev_tm + 3600*24*$days ; // метка времени следующей даты
if($days) $next_tm += (($days > 0)? 3 :(-3)) * 3600; // коррекция летнего/зимнего времени
$next = date("m/d/Y", $next_tm); // следующая дата
if (empty($_POST['dated']) && !empty($_POST['datea']) )
$_POST['dated']=date("m/d/Y",cvt($_POST['datea']) + 3600*27);
function cvt($ds)
{
if(!is_string($ds))
return false;
$tri = explode('/',$ds);
if(count($tri) != 3)
return false;
$tm = mktime(0,0,0,$tri[0], $tri[1], $tri[2]);
$dt = date("m/d/Y", $tm);
if($dt != $ds)
return false;
return $tm;
}
if(isset($_POST['datea']) && isset($_POST['dated']) )
{
$datea = $_POST['datea']; $d1 = cvt($datea);
$dated = $_POST['dated']; $d2 = cvt($dated);
if(false === $d1)
echo("<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>The check-in date does not respond.</p>
<ul>
<li><a>Please, select a date from the calendar only.</a></li>
</ul>
</div>");
if(false === $d2)
echo("<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>The check-out date does not respond.</p>
<ul>
<li><a>Please, select a date from the calendar only.</a></li>
</ul>
</div>");
$v = intval(($d2 - $d1+3600*3)/86400);
// echo "Time interval between $datea and $dated is $v days<br>";
}
else
{
}
// If datea is > dated. Print out the error msg.
list($m, $d, $y) = explode("/", $_POST['datea']);
$datea = mktime(0, 0, 0, $m, $d, $y);
list($m, $d, $y) = explode("/", $_POST['dated']);
$dated = mktime(0, 0, 0, $m, $d, $y);
if( $datea > $dated ) {
echo "<div id=msg-error><img src=../images/icons/attantion.jpg width=18 height=16 />
<p>Please, check entered dates.</p>
<ul>
<li><a>The check-out date must occur after the check-in date. Please change the check-in date.</a></li>
</ul>
</div>";
}
?>
|
| |
| |
|
|
| |
|
|
| |
для: sasch
(27.05.2006 в 11:30)
| | | Ах еще одна штука, даже если все ОК то при переходе на другую страницу эти даты принимают вид: Пр. 05/27/2006 на 1148673600. | |
| |
|
|
| |
|
|
| |
для: sasch
(27.05.2006 в 11:44)
| | | Знаете, убрала проверку на if datea>dated и вроде бы все встало на свои места. Она не нужна! | |
| |
|
|
| |
|
|
| |
для: sasch
(27.05.2006 в 11:58)
| | | Можно проверять вводимые строки более аккуратно:
function cvt($ds)
{
if(!is_string($ds))
return false;
$tri = explode('/',$ds);
if(count($tri) != 3)
return false;
list($m, $d, $y) = $tri;
if(!is_integer($m) || !is_integer($d) || !is_integer($y) )
return false;
$m = intval($m); $d = intval($d); $y = intval($y);
if($m < 1|| $m > 12 || $d < 1 || $d > 31 || $y < 1970 || $y > 2030)
return false;
$tm = mktime(0,0,0,$m, $d, $y);
$dt = date("m/d/Y", $tm);
if($dt != $ds)
return false;
return $tm;
}
|
еще:
Вот этот код явно повторяет мой.
list($m, $d, $y) = explode("/", $_POST['datea']);
$datea = mktime(0, 0, 0, $m, $d, $y);
list($m, $d, $y) = explode("/", $_POST['dated']);
$dated = mktime(0, 0, 0, $m, $d, $y);
if( $datea > $dated ) {
|
его вполне можно поменять на
>Знаете, убрала проверку на if datea>dated и вроде бы все
>встало на свои места. Она не нужна!
Очень плохо. У Вас вылезают побочные эффекты из-за того, похоже, что скрипт написан в стиле regisrer_globals... а поскольку всего скрипта не видно, даже не ясно, почему так происходит, и чем может кончиться. | |
| |
|
|
| |
|
|
| |
для: Trianon
(27.05.2006 в 12:12)
| | | Что вы имеете в виду? Надо отключить reg_glob? Я знаю, что советуют его держать OFF. Все скрипты у меня довольно просты и не требуют включения этой функции. Сейчас заблокирую. | |
| |
|
|
| |
|
|
| |
для: sasch
(27.05.2006 в 12:19)
| | | Register_globals в состоянии OFF и все работает. Вы про это говорили? | |
| |
|
|
| |
|
|
| |
для: sasch
(27.05.2006 в 12:26)
| | | А если заменить старую функцию новой,
function cvt($ds)
{
if(!is_string($ds))
return false;
$tri = explode('/',$ds);
if(count($tri) != 3)
return false;
list($m, $d, $y) = $tri;
if(!is_integer($m) || !is_integer($d) || !is_integer($y) )
return false;
$m = intval($m); $d = intval($d); $y = intval($y);
if($m < 1|| $m > 12 || $d < 1 || $d > 31 || $y < 1970 || $y > 2030)
return false;
$tm = mktime(0,0,0,$m, $d, $y);
$dt = date("m/d/Y", $tm);
if($dt != $ds)
return false;
return $tm;
}
|
то преобразование непроставленной даты происходит на 01/02/1970, а не на следующий день. Оставляю в прежнем виде. Эта функция почему то не работает, а старая отвечает всем моим запросам.
Посоветуйте книгу по PHP. Что бы просто и понятно... Я ни чего не знаю - это мой вывод. | |
| |
|
|
| |
|
|
| |
для: sasch
(27.05.2006 в 12:43)
| | | Как оказалось, is_integer работает совсем не так как описан. Поэтому правильной версией будет следующая:
function cvt($ds)
{
if(!is_string($ds))
return false;
$tri = explode('/',$ds);
if(count($tri) != 3)
return false;
list($m, $d, $y) = $tri;
$m = intval($m); $d = intval($d); $y = intval($y);
if($m < 1|| $m > 12 || $d < 1 || $d > 31 || $y < 1970 || $y > 2030)
return false;
$tm = mktime(0,0,0,$m, $d, $y);
$dt = date("m/d/Y", $tm);
if($dt != $ds)
return false;
return $tm;
}
|
прошу прощения, что сразу не проверил.
Книги по php приведены в правом верхнем углу окна этого форума. Непохие такие книги.
ссылка на онлайн-учебник есть опять же вверху. | |
| |
|
|
|