PHP bir MYSQL Tarihi doğrulamak nasıl?

6 Cevap php

Kullanıcılar 3 dropdowns (gün, ay, yıl) kendi tarihini seçmek olacaktır. Ben '2008-12-30 'gibi bir dize yapmak için sunucu tarafında bunları birleştirmek. Nasıl o zaman emin bu tarih doğru biçimi / sayısal, vb oldu yapmak doğrulayabilir?

6 Cevap

Onlar 3 ayrı açılan çıkışlar iseniz, üç ayrı değerler olarak onları doğrulamak gerekir.

Yani,

  • Yıl sütun sayısal ve yıl app geçerli olursa olsun arasında olduğunu doğrulayın
  • Ay sütun sayısal olduğunu doğrulamak
  • Günün sütun sayısal olduğunu doğrulamak
  • Hepsi checkdate kullanarak geçerli değerler () olduğunu doğrulayın

Yoksa, sadece, tamsayı bir tarih içinde bir araya, ve elde edilen tarihi geçerli olup olmadığını görmek için hepsini döküm olabilir. Yani,

$time = mktime(0, 0, 0, (int)$_POST['month'], (int)$_POST['day'], (int)$_POST['year']);

// in this example, valid values are between jan 1 2000 (server time) and now
// modify as required
if ($time < mktime(0, 0, 0, 1, 1, 2000) || $time > time())
  return 'Invalid!';

$mysqltime = date('Y-m-d', $time);

// now insert $mysqltime into database

Bu yöntemin dezavantajı, sadece 2038 ya kadar 1970 yani Unix zaman damgası aralığında tarihleri ​​ile çalışmak olacak olmasıdır.

Ben şahsen tarih hem according to format ve valid ise, bu belirlemek için the doğru ve şık bir yol bulundu:

  • davranır gibi Tarihleri ​​20111-03-21 geçersiz gibi - farklı checkdate()
  • olası bir PHP uyarı (herhangi bir parametre sağlanır ise, doğal olarak) - en aksine explode() çözümleri
  • regex sadece çözümlerinin aksine hesaba artık yıl sürer
  • mysql DATE formatı ile tam uyumlu (10.03.21 2010-03-21 aynıdır)

Burada kullanabileceğiniz yöntem:

/**
 * Tests if a string is a valid mysql date.
 *
 * @param   string   date to check
 * @return  boolean
 */
function validateMysqlDate( $date )
{
    return preg_match( '#^(?P<year>\d{2}|\d{4})([- /.])(?P<month>\d{1,2})\2(?P<day>\d{1,2})$#', $date, $matches )
           && checkdate($matches['month'],$matches['day'],$matches['year']);
}

Sen tarih checkdate kullanarak geçerli olup olmadığını kontrol edebilirsiniz. Eğer değerleri sayısal ve doğru uzunlukta olduğundan emin olmak istiyorsanız, önce bir is_int ctype_digit gibi basit bir şey ve bir strlen birleşimini yapabilirdi tarih oluşturmak.

// untested
if( !ctype_digit)( $month ) || strlen( $month ) != 2 ) {
    // handle error
}
// repeat for $day and $year
if ( checkdate( $month, $day, $year ) {
    // do your work
}

I am using this function:

<?php 
function validateMysqlDate( $date ){ 
    if (preg_match("/^(\d{4})-(\d{2})-(\d{2}) ([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/", $date, $matches)) { 
        if (checkdate($matches[2], $matches[3], $matches[1])) { 
            return true; 
        } 
    } 
    return false; 
} 

// check it: 
  $a = validateMysqlDate('2012-12-09 09:04:00');
  $b = validateMysqlDate('20122-12-09 09:04:00');
  $c = validateMysqlDate('2012-12_09 09:04:00');
  $d = validateMysqlDate('');
  var_dump( $a );
  var_dump( $b );
  var_dump( $c );
  var_dump( $d ); 
?>

$ A doğru, diğerleri yanlış - ve doğru olduğunu

The function from Raveren (above) will not cover valid dates with timestamps !!! $a returns false there! And btw: checkdate() would return true for $b although it is not a valid mysql datetime

Eğer ay ile ilişkili değerleri (aşağıda gösterilen) kontrol beri üç dropdowns varsa dropdowns gelen değerleri daima sayılar olmalıdır. Bu daha sonra kombine sonucu geçerli olduğu sonucuna yol açacak.

<option value="01">January</option>

Böyle "seçin Ay" olarak açılan çıkışlar yardım girdilerini sağlayan sağlamak ise o zaman bu değeri 0 yapmak ve her açılan kutusundan gelen değerlerin sıfırdan büyük olduğundan emin olabilirsiniz.

Birisi diğer değerleri sağlamak için HTML formu değiştirmek olacağı olasılığı vardır. Bu bir endişe ise, o zaman sağlanan her değer aslında sayısal bir rakam olduğunu kontrol etmek için PHP işlevi ctype_digit() kullanabilirsiniz.

Sizin endişe tarih aslında checkdate() function geçerli kullanımı olduğunu ise.

Sadece aynı sorun vardı. Ben tarih gerçek olup olmadığını da biçimi doğru olup olmadığını denetler ve kısa bir fonksiyon yazdı:

function valid_mysql_date($str){
    $date_parts = explode('-',$str);
    if (count($date_parts) != 3) return false;
    if ((strlen($date_parts[0]) != 4) || (!is_numeric($date_parts[0]))) return false;
    if ((strlen($date_parts[1]) != 2) || (!is_numeric($date_parts[1]))) return false;
    if ((strlen($date_parts[2]) != 2) || (!is_numeric($date_parts[2]))) return false;
    if (!checkdate( $date_parts[1], $date_parts[2] , $date_parts[0] )) return false;
    return true;
}

yardımcı olur umarım.