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

Форум PHP

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Проверка и сверка 2-х дат с выводом ошибки

Сообщения:  [1-10]    [11-20]   [21-30]  [31-36] 

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

   
 
 автор: 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. Что бы просто и понятно... Я ни чего не знаю - это мой вывод.

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

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

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

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

   
 
 автор: 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 в 11:58)   письмо автору
 
   для: sasch   (27.05.2006 в 11:44)
 

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

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

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

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

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

   
 
 автор: 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;       }

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

   

Сообщения:  [1-10]    [11-20]   [21-30]  [31-36] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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