Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проверка и сверка 2-х дат с выводом ошибки
 
 автор: sasch   (26.05.2006 в 14:02)   письмо автору
 
 

У самой ума или опыта не хватило и пришлось полазить в НЕТЕ.
Нашла скрипт и немного доработала. Правда нужна еще проверка на месяца с 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>";
      }
так же необходим, но оно не работает


А вообще можно все это сделать короче?
Спасибо...

   
 
 автор: Саня   (26.05.2006 в 14:20)   письмо автору
 
   для: sasch   (26.05.2006 в 14:02)
 

Для начала расскажите что делает этот скрипт, что он должен делать, а что делает неправильно.
Ещё лучше, расскажите какие данные приходят в скрипт, какие проверки должны производиться, и какие данные должны выходить из скрипта.

P. S.
Такое огромные скрипты принято сохранять в файл и прикреплять к сообщению.

   
 
 автор: sasch   (26.05.2006 в 15:05)   письмо автору
 
   для: Саня   (26.05.2006 в 14:20)
 

Этот скрипт производит проверку дат. Принцип работы аналогичен с http://www.expedia.com/daily/hotels/default.asp?rfrr=-383. Попробуйте вводить неправильные данные даты типа (kj?><!+9) или дату заезда больще дады выезда. Скрипт будет вас информировать об ошибках.

В моем случае данные приходят в скрипт через форму посредством метода POST, результат, даже если дата не в том формате, отображается в похожей форме на другой странице, НО выводится предупреждение об ошибке и результаты запроса не будут веводиться. Если все OK ,то происходит вывод данных.
Мне хотелось бы добавить в этот скрипт проверку на месяца с 30 днями и високосные года, но не знаю как это сделать.

   
 
 автор: ec_stasis   (26.05.2006 в 15:32)   письмо автору
 
   для: sasch   (26.05.2006 в 14:02)
 

а нельзя было сделать защищенный блок, в котором введенную дату скармливать, например, ф-ии mktime(), и если ошибки не было, значит дата введена верно. Весь код занял бы 10 строк... но это только в пхп5, если я не ошибаюсь

   
 
 автор: sasch   (26.05.2006 в 15:34)   письмо автору
 
   для: ec_stasis   (26.05.2006 в 15:32)
 

А вы не могли бы привести пример к моему случаю.
Спасибо

   
 
 автор: sasch   (26.05.2006 в 15:37)   письмо автору
 
   для: sasch   (26.05.2006 в 15:34)
 

Ах, у меня же нет PHP 5, но все равно если вам не трудно приведите пример.

   
 
 автор: Trianon   (26.05.2006 в 15:56)   письмо автору
 
   для: sasch   (26.05.2006 в 15:37)
 

Вы бы написали для начала, в каком виде Вы хотите вводить даты...

   
 
 автор: sasch   (26.05.2006 в 15:58)   письмо автору
 
   для: Trianon   (26.05.2006 в 15:56)
 

Если вы говорите про формат, то mm/dd/yyyy

   
 
 автор: Trianon   (26.05.2006 в 16:21)   письмо автору
 
   для: 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><?
    
}
?>

   
 
 автор: sasch   (26.05.2006 в 16:38)   письмо автору
 
   для: Trianon   (26.05.2006 в 16:21)
 

Не работает. Возможно из-за того, что у меня не PHP5?
Ну все равно спасибо.
Ну все же, как мне добавить проверку на месяцы с 30 днями и високосные года?

   
 
 автор: Trianon   (26.05.2006 в 16:54)   письмо автору
 
   для: sasch   (26.05.2006 в 16:38)
 

Не работает - это как?
php 5 тут ни при чем. Этот код на PHP 4 должен иди. У меня идет, во всяком случае.
А проверка выполняется полностью.
Недопустимые даты не проходят точно также как и даты с неверным форматом.

   
 
 автор: sasch   (26.05.2006 в 17:03)   письмо автору
 
   для: 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 
    { 
    }
?>

Может ошиблась где?

   
 
 автор: Trianon   (26.05.2006 в 17:14)   письмо автору
 
   для: 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; 
    } 

   
 
 автор: sasch   (26.05.2006 в 17:33)   письмо автору
 
   для: Trianon   (26.05.2006 в 17:14)
 

Чего то я не пойму куда его надо поместить!
Ну да ладно пусть остается в таком виде, а как но счет проверок?
Ну все же, как мне добавить проверку на месяцы с 30 днями и високосные года?

   
 
 автор: Trianon   (26.05.2006 в 17:38)   письмо автору
 
   для: 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 
    { 
    } 
?> 

   
 
 автор: sasch   (26.05.2006 в 17:47)   письмо автору
 
   для: Trianon   (26.05.2006 в 17:38)
 

Всесто старого кода вставила ваш и получилось см. вложение.
Я ни чего не понимаю у меня код не работает?

   
 
 автор: Trianon   (26.05.2006 в 17:58)   письмо автору
 
   для: 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 
    { 
    } 
?> 

А американская последовательность записи даты - начиная с месяца - все равно редкая гадость.

   
 
 автор: sasch   (26.05.2006 в 18:10)   письмо автору
 
   для: Trianon   (26.05.2006 в 17:58)
 

О да! Работает!!! СПАСИБО!!!

   
 
 автор: Trianon   (26.05.2006 в 18:12)   письмо автору
 
   для: sasch   (26.05.2006 в 18:10)
 

Только обратите внимание на исправление в строке
$v = intval(($d2 - $d1+3600*3)/86400);
Без него Плохо будет считаться интервал в разных сезонах (летнее/зимнее время).

   
 
 автор: sasch   (26.05.2006 в 18:20)   письмо автору
 
   для: Trianon   (26.05.2006 в 18:12)
 

Я все оставлю как вы написали вот только справки об ошибках переделаю покрасивее по ближе к стилю сайта, кстати как он? Спасибо еще раз за помощь. Это красивый и компактный код. see ya!

   
 
 автор: sasch   (26.05.2006 в 18:42)   письмо автору
 
   для: sasch   (26.05.2006 в 18:20)
 

А что надо добавить чтобы если кто-то выбирает последний день месяца, а поле для второй даты пропускает, то при переходе на другую страницу эта пропущенная дата становилась на 1 день больше первой и перепрыгивала на след. месяц? Пр. с 06/30/2006 на 07/01/2006.

   
 
 автор: Trianon   (26.05.2006 в 18:56)   письмо автору
 
   для: 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)) * 3600// коррекция летнего/зимнего времени
$next date("m/d/Y"$next_tm); // следующая дата
echo $next;
?>

   
 
 автор: Trianon   (26.05.2006 в 18:43)   письмо автору
 
   для: sasch   (26.05.2006 в 18:20)
 

Сообщения, конечно, переделайте - это же Ваш сайт.
Я их написал только чтобы понятно было, как условия проверки расставлять.
За оценку спасибо. Компактный ... это как сказать.
Его можно было бы сжать еще в два-три раза, но тогда он бы перестал быть понятным.
Касательно сайта... что я могу сказать, я ж видел только скриншот? Картинка красивая.

   
 
 автор: sasch   (26.05.2006 в 19:25)   письмо автору
 
   для: 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;
}


Вот так все работает! Я очень долго думала как же все это сделать, а вы просто сделали. Есть у кого поучиться. Извените что так долго мучила вопросами... Спасибо за помощь!

   
 
 автор: Trianon   (26.05.2006 в 19:37)   письмо автору
 
   для: sasch   (26.05.2006 в 19:25)
 


if (empty($_POST['dated']) && !empty($_POST['datea']) ) 
  $_POST['dated']=date("m/d/Y",cvt($_POST['datea']) + 3600*27); 

   
 
 автор: sasch   (26.05.2006 в 19:47)   письмо автору
 
   для: Trianon   (26.05.2006 в 19:37)
 

Я в шоке. Ни чего не понимаю, но все работает. А можно пояснить, please?

$_POST['dated']=date("m/d/Y",cvt($_POST['datea']) + 3600*27); 

   
 
 автор: Trianon   (26.05.2006 в 20:10)   письмо автору
 
   для: 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;       }

И тоже по сути не изменится ничего, кроме оформления... .

   
 
 автор: sasch   (26.05.2006 в 20:15)   письмо автору
 
   для: Trianon   (26.05.2006 в 20:10)
 

Ну почему я не пошла на программиста учиться. А водь хотела. ! До завтра.

   
 
 автор: sasch   (27.05.2006 в 11:30)   письмо автору
 
   для: 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)) * 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(000$m$d$y); 
list(
$m$d$y) = explode("/"$_POST['dated']); 
$dated mktime(000$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:44)   письмо автору
 
   для: sasch   (27.05.2006 в 11:30)
 

Ах еще одна штука, даже если все ОК то при переходе на другую страницу эти даты принимают вид: Пр. 05/27/2006 на 1148673600.

   
 
 автор: sasch   (27.05.2006 в 11:58)   письмо автору
 
   для: sasch   (27.05.2006 в 11:44)
 

Знаете, убрала проверку на if datea>dated и вроде бы все встало на свои места. Она не нужна!

   
 
 автор: Trianon   (27.05.2006 в 12:12)   письмо автору
 
   для: 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($d1 > $d2) {


>Знаете, убрала проверку на if datea>dated и вроде бы все
>встало на свои места. Она не нужна!

Очень плохо. У Вас вылезают побочные эффекты из-за того, похоже, что скрипт написан в стиле regisrer_globals... а поскольку всего скрипта не видно, даже не ясно, почему так происходит, и чем может кончиться.

   
 
 автор: sasch   (27.05.2006 в 12:19)   письмо автору
 
   для: Trianon   (27.05.2006 в 12:12)
 

Что вы имеете в виду? Надо отключить reg_glob? Я знаю, что советуют его держать OFF. Все скрипты у меня довольно просты и не требуют включения этой функции. Сейчас заблокирую.

   
 
 автор: sasch   (27.05.2006 в 12:26)   письмо автору
 
   для: sasch   (27.05.2006 в 12:19)
 

Register_globals в состоянии OFF и все работает. Вы про это говорили?

   
 
 автор: sasch   (27.05.2006 в 12:43)   письмо автору
 
   для: 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. Что бы просто и понятно... Я ни чего не знаю - это мой вывод.

   
 
 автор: Trianon   (07.06.2006 в 12:28)   письмо автору
 
   для: 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 приведены в правом верхнем углу окна этого форума. Непохие такие книги.
ссылка на онлайн-учебник есть опять же вверху.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования