0

私は学生の Web プログラマーで、最近割り当てられたタスクで問題が発生しています。前の担当者は、少しバグのあるニュース レポート サイトを作成していました。

このサイトの問題は、表示するニュース記事の日付範囲を指定すると、日付が以前の日付に戻るか、ランダムに変更されることです。この問題を毎回発生させる唯一の方法は、2010 年より前の日付を設定しようとすることです。問題が発生する前に、多くの用途で機能する場合があります。

明確にするために、特に私は本当に自分のスキルを学び、向上させようとしているので、誰かが私に完全な答えをくれたり、私の仕事をしてくれることを求めたり望んだりしていません. 誰かがこの問題を解決するための正しい方向に私を向けることができれば、本当に感謝しています.

私が見ているファイルからの日付へのすべての参照は次のとおりです。

// Create dates
$year = ( isset( $get['year'] ) ) ? $get['year'] : date("Y");
$year2 = ( isset( $get['year2'] ) ) ? $get['year2'] : date("Y");
$month = ( isset( $get['month'] ) ) ? $get['month'] : date("m");
$month2 = ( isset( $get['month2'] ) ) ? $get['month2'] : date("m");
$day = ( isset( $get['day'] ) ) ? $get['day'] : date("d");
$day2 = ( isset( $get['day2'] ) ) ? $get['day2'] : date("d");

//create first and second dates for range
$t_current = mktime(0, 0, 0, $month, $day, $year); // Current month Unix timestamp
$t_next = mktime(0, 0, 0, $month2, $day2+1, $year2); // date2 unix timestamp for date range

// Criteria
if ( $author_url) {
    $this->EE->db -> where ( $author_name_field_id, $author_name);

$this->EE->db
    -> where ("exp_channel_titles.entry_date >= $t_current")
    -> where ("exp_channel_titles.entry_date <= $t_next");

}

else {
    $this->EE->db
    -> where ("exp_channel_titles.entry_date >= $t_current")
    -> where ("exp_channel_titles.entry_date <= $t_next");
}

テンプレート:

<div class="datelists">
    <select id="month" name="month" style="display:none">
<?php
//lists months
            for ($i = 0; $i <= 11; ++$i) 
            {
                $time = strtotime(sprintf('+%d months', $i));
                $value = date('m', $time);
                $label = date('F', $time);

//if month is set stay on that month    
                if($month==$value)
                    { printf('<option value="%s" selected="selected">%s</option>' , $value, $label);
                    }
                else
                    {printf('<option value="%s">%s</option>', $value, $label);}
            }

  ?>
//first month selected instead of blank
        $("#target option:first")

    </select>
    <select id="day" name="day" style="display:none">   
<?php
//lists days
            for ($i = 0; $i <= 31; ++$i) 
            {

                $time = strtotime(sprintf('+%d days', $i));
                $value = date('d', $time);
                $label = date('d', $time);
//if day is set stay on that day            
                if($day==$value)
                    { printf('<option value="%s" selected="selected">%s</option>' , $value, $label);
                    }
                else
                    {printf('<option value="%s">%s</option>', $value, $label);} 
            }           
//first year selected instead of blank
  ?>
    $("#target option:first")
    </select>
    <select id="year" name="year" style="display:none"> 
<?php   
//lists years
            for ($i = 0; $i <= 3; ++$i) 
            {                 
                $time = strtotime(sprintf('-%d years', $i));
                $value = date('Y', $time);
                $label = date('Y', $time);  
//if year is set stay on that year          
                if($year==$value)
                    { printf('<option value="%s" selected="selected">%s</option>' , $value, $label);
                    }
                else
                    {printf('<option value="%s">%s</option>', $value, $label);}         
            }

//first year selected instead of blank
  ?>
    $("#target option:first")
    </select>
    <input type="hidden" id="datepicker" />
    <select id="month2" name="month2" style="display:none">
<?php
//lists months
            for ($i = 0; $i <= 11; ++$i) 
            {
                $time = strtotime(sprintf('+%d months', $i));
                $value = date('m', $time);
                $label = date('F', $time);
//if month is set stay on that month        
                if($month2==$value)
                    { printf('<option value="%s" selected="selected">%s</option>' , $value, $label);
                    }
                else
                    {printf('<option value="%s">%s</option>', $value, $label);}
            }
  ?>
//first month selected instead of blank
        $("#target option:first")
    </select>
    <select id="day2" name="day2" style="display:none">
<?php
//lists days
            for ($i = 0; $i <= 31; ++$i) 
            {     
                $time = strtotime(sprintf('+%d days', $i));
                $value = date('d', $time);
                $label = date('d', $time);
//if day is set stay on that day            
                if($day2==$value)
                    { printf('<option value="%s" selected="selected">%s</option>' , $value, $label);
                    }
                else
                    {printf('<option value="%s">%s</option>', $value, $label);}     
            }
//first year selected instead of blank
  ?>
    $("#target option:first")
    </select>
    <select id="year2" name="year2" style="display:none">
<?php
//lists years
            for ($i = 0; $i <= 3; ++$i) 
            {             
                $time = strtotime(sprintf('-%d years', $i));
                $value = date('Y', $time);
                $label = date('Y', $time);  
//if year is set stay on that year          
                if($year2==$value)
                    { printf('<option value="%s" selected="selected">%s</option>' , $value, $label);
                    }
                else
                    {printf('<option value="%s">%s</option>', $value, $label);}             
            }               
//first year selected instead of blank
  ?>
    $("#target option:first")
    </select>
    <input type="hidden" id="datepicker" />  
</div>
<label for="from">From</label>
<input type="text" id="from" value="<?php echo $month."/".$day."/".$year; ?>" />
<label for="to">to</label>
<input type="text" id="to" value="<?php echo $month2."/".$day2."/".$year2; ?>" />               
<input type="submit" value="Filter" />
        </form>
               </p>
</div>     
<!--<h1><?php echo "$month/$day/$year - $month2/$day2/$year2" . ' <br/>'?></h1>-->
<?php
    if ( isset($get['institute']) && is_numeric( $get['institute'] )  ) {

        echo "<h2><center>" . $institute_cat . "</center></h2>";
    }

    if ( empty($entries) ) {
        echo "<h2><center>No articles found</center></h2>";
    }
    else {
?>  

Javascript:

<!-- javascript datepicker -->
<link rel="stylesheet" type="text/css" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" /></link>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
<link rel="stylesheet" type="text/css" href="http://expeng.anr.msu.edu/css/sitewide/datepicker.css" />  </link>
<script type="text/javascript">
$(document).ready(function(){
    $('#from').datepicker({
        defaultDate: "+1w",
        changeMonth: true,
        numberOfMonths: 1,
        onSelect: function(dateText, inst) {
                //dateText comes in as MM/DD/YY
                var datePieces = dateText.split('/');
                var month = datePieces[0];
                var day = datePieces[1];
                var year = datePieces[2];
                //define select option values for
                $('select#month').val(month);
                $('select#day').val(day);
                $('select#year').val(year);
        },                  
    }); 
    $('#to').datepicker({
        defaultDate: "+1w",
        changeMonth: true,
        numberOfMonths: 1,
        onSelect: function(dateText, inst) {
                //dateText comes in as MM/DD/YY
                var datePieces = dateText.split('/');
                var month2 = datePieces[0];
                var day2 = datePieces[1];
                var year2 = datePieces[2];
                //define select option values for
                $('select#month2').val(month2);
                $('select#day2').val(day2);
                $('select#year2').val(year2);
         },     
    }); 
});
</script>   

http://msue.anr.msu.edu/news/reportは、この問題を自分の目で確かめたいという人のために用意された Web サイトです。

前もって感謝します!

4

2 に答える 2

1

コードのこのセクションでは ( for()47 行目のループに注意してください):

    <select id="year" name="year" style="display:none"> 
<?php   
//lists years
            for ($i = 0; $i <= 3; ++$i)    // Try to change this to: for ($i = 0; $i <= 5; ++$i)
            {                 
                $time = strtotime(sprintf('-%d years', $i));
                $value = date('Y', $time);
                $label = date('Y', $time);  
//if year is set stay on that year          
                if($year==$value)
                    { printf('<option value="%s" selected="selected">%s</option>' , $value, $label);
                    }
                else
                    {printf('<option value="%s">%s</option>', $value, $label);}         
            }

for()そして、このセクション ( 106 行目のループに注意してください):

    <select id="year2" name="year2" style="display:none">
<?php
//lists years
            for ($i = 0; $i <= 3; ++$i)    // Try to change this to: for ($i = 0; $i <= 5; ++$i) 
            {             
                $time = strtotime(sprintf('-%d years', $i));
                $value = date('Y', $time);
                $label = date('Y', $time);  
//if year is set stay on that year          
                if($year2==$value)
                    { printf('<option value="%s" selected="selected">%s</option>' , $value, $label);
                    }
                else
                    {printf('<option value="%s">%s</option>', $value, $label);}             
            }               
//first year selected instead of blank
  ?>

現在の年から 3 年前までの年でドロップダウン選択を作成しています。そのため、それ以降 (2010 年より前) の年を指定すると、その年は<select>ボックスの一部ではありません。for についても同様<select>ですyear2

より多くの年数をサポートしたい場合は、3 の値を別の値に変更してください。

ところで、開始日 <= 終了日のチェックを追加してみてください。試してみましたが、エラーは発生しませんが、無効な日付範囲であると言う代わりに、結果が表示されません。

于 2013-10-09T15:05:56.583 に答える
0

コードのこの時点で:

//create first and second dates for range
$t_current = mktime(0, 0, 0, $month, $day, $year); // Current month Unix timestamp
$t_next = mktime(0, 0, 0, $month2, $day2+1, $year2); // date2 unix timestamp for date range

$t_next が $t_current より後であることを確認するチェックを必ず追加します。これは、私が探す最初のロジックの問題だからです。

if($t_current>$t_next){
    // swap them over
    $tmp=$t_current;
    $t_current=$t_next;
    $t_next=$tmp;
}
于 2013-10-09T14:23:02.097 に答える