2012-02-06 14 views
1

私はYiiに妥当性検査のルールを書こうとしていますが、仕事と比較して日付を得ることはできません。 EndStartの30日を超えない場合、エラーメッセージを表示するようにします。日付と30日間の妥当性確認

public function checkDate($attribute,$params) 
    { 
     $duration = strtotime(date('Y-m-d', strtotime($this->Start)) . ' +30 days'); 
     if ($this->End < $duration) 
       $this->addError('End','30 days or more!'); 
    } 

これを入力すると、エラーメッセージが表示されます。私は、MySQL DBを使用していますし、開始と終了はdate形式です

EDIT: 私は今でもページが表示されません

この

を試してみましたが、下の解答で入力を考えます。

$startDate = $this->Start; 
    $endDate = $this->End; 
    $interval = $startDate->diff($endDate); 
    if ($interval < 30) 
       $this->addError('End','30 days or more!'); 

これはエラーに100%の時間を与えます。

$duration = date('Y-m-d', strtotime($this->Start . '+ 30 days')); 
if ($this->End < $duration) 
    $this->addError('End','30 days or more!'); 
+0

有効にするにはstrtotimeを使用するように注意してくださいユーザー入力は[strtotime PHP Manual](http://php.net/manual/en/function.strtotime.php)を参照してください。タイムスタンプの有効範囲は、通常、金曜日、1901年12月13日20:45:54 UTCからあなたがphp [Datetime](http://www.php.net/manual/en/class.datetime.php)を使用できるのであれば、2038年1月19日03:14:07 UTC。 – Henesnarfel

+0

理由と理由を説明するマインド? – enfield

答えて

4

あなたは、あなたはリンゴとオレンジ

ある date('Y-m-d')へのstrtotimeをcompairingている $this->END に対してチェックする前に date('Y-m-d', $duration)を配置する必要があります(右のデータベースから出てくる) $this->END$durationをcompairingしている場合

変更 $ duration = strtotime(date( 'Ym-d'、strtotime($ this-> Start))。 '+30日'); 〜 $ duration = date( 'Y-m-d'、strtotime($ this-> START。 '+ 30 days'));あなたはその後、私はエラー

+0

これは、ユーザー入力のフォームを検証するためのものです。だから、私はDBの内容ではなく、ユーザーの入力を検証しようとしています。 – enfield

+0

あなたのライン: $期間= strtotime(日付( 'Y-m-d'、strtotime($ this-> Start))。 '+30日'); は、YYYY-MM-DDにコンパイルするとunixタイムスタンプ を返します。タイムスタンプは常に大きくなります – AMayer

+0

入力していただきありがとうございます。変更と結果を表示するために私の質問を編集しました。エラーは常に表示されます。 – enfield

2
#source: http://www.php.net/manual/en/datetime.diff.php 
$datetime1 = new DateTime('2009-10-11'); 
$datetime2 = new DateTime('2009-10-13'); 
$interval = $datetime1->diff($datetime2); 
echo $interval->format('%R%a days'); 
+0

入力していただきありがとうございます。質問を編集して変更と結果を表示しました。私はそれを正しく使用しているが、ページがレンダリングされず、ログに理由が表示されないかどうかはわかりません。 – enfield

+0

'var_dump($ interval); $ days_diff = $ interval-> d; echo $ days_diff; ' – cetver

+0

また、プロパティ 'invert'に注目してください – cetver

0

を支援

public function rules() 
{ 
    return array(
    ... 
     array('dateX','timeoutSomething'), 
    ... 
    ); 
} 


public function timeoutSomething($dateX){ 
    // If you try to modify the model after 300 seconds the error arise 
    if((strtotime($this->dateX)+300) < time()){ 
     $this->addError($dateX,"Timeout exceed"); 
    } 
} 
0

をトリガーDateTime->diffを使用して、日数の差が30以下であるかどうかを確認することをお勧めします

とスクリプトが

希望を動作するはずです、これは

+0

このシナリオでは私が探していたものではありませんが、他の多くの状況ではそれほど役に立ちません。私はそれをうまく使います。 – enfield