查询数据库,将日期分解为获取年份,并使用唯一年份填充下拉列表

时间:2011-08-09 16:23:07

标签: php mysql arrays forms

我正在尝试从数据库中的表中使用OPTIONS填充表单SELECT。它应该每年显示一次。

例如。如果数据库中的日期字段为02-09-2010,10-14-2010,08-09-2011:

下拉列表应显示:
2010
2011

相反,它显示:
2010
2010
2011

我的代码:

$result = mysql_query("SELECT date FROM user_history");

        $yearoptions = "";

        while($row = mysql_fetch_array($result)) {
            $date = $row['date'];
            $yeararray = explode("-", $date);
            $year = array_unique($yeararray);
            $yearoptions .= '<option value="' . $year[2] . '">'
           . $year[2] . '</option>';

任何人都可以看到我做错了什么并提出建议吗?

7 个答案:

答案 0 :(得分:4)

$result = mysql_query("SELECT distinct year(date) as years FROM user_history ORDER BY 1 ASC");

<?php while($row = mysql_fetch_array($result)) { ?>
  <option value="<?php echo $row['years'];"><?php echo $row['years']; ?></option>
<?php endwhile; ?>

答案 1 :(得分:1)

SELECT DISTINCT YEAR(date) FROM user_history,也许使用ORDER BY date,可以使PHP部分更加简单......

答案 2 :(得分:0)

尝试:

SELECT DISTINCT YEAR(date) as date FROM user_history ORDER BY date asc

您不需要以这种方式提取年份组件的代码......

您的完整代码将是:

$result = mysql_query("SELECT DISTINCT YEAR(date) as date FROM user_history ORDER BY date asc");

        $yearoptions = "";

        while($row = mysql_fetch_array($result)) {
            $date = $row['date'];
            $yearoptions .= '<option value="' . $date . '">'
           . $date . '</option>';

Edite 以后使用日期/时间时,您可能会发现以下内容有用http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

答案 3 :(得分:0)

尝试:SELECT DISTINCT YEAR(date) FROM user_history

答案 4 :(得分:0)

首先,我可以建议你在$ row ['date']上使用date_parse,就像这样。

$date = date_parse($row['date']);
$year = $date['year'];

多年来出现两次的原因是您没有检查冗余。我建议每年将一年添加到数组中并使用in_array($ year,$ array)来检查是否已添加它。

答案 5 :(得分:0)

在输出之前,您没有在一年内检查重复项。这是你的基本问题。

您应该首先将可能的年份存储为数组,然后根据该数组填充选项。这样,您就不必担心重复了。如果您有11.26.2009,09.01.2010,12.15.2010,06.05.2011,则迭代所有结果,类似于$ yearOptions = array('2009','2010','2011');

此处的另一个好处是,如果日期显示方式出现错误,您只需var_dump($yearOptions);即可查看其中显示的内容。

最后,我建议使用strtotime()而不是explode(),因为它可以接受可能的非标准日期格式并仍然返回正确的UNIX时间戳。然后你可以使用date()来操纵它。额外的迷你奖励:如果您想切换到'09而不是2009,这是一个简单的转换。

$result = mysql_query("SELECT date FROM user_history");
$yearOptions = array();
while($row = mysql_fetch_array($result)) {
     $date = $row['date'];
     // convert the date to a UNIX timestamp
     $date = strtotime($date);
     // retrieve just the Y (xxxx) from the timestamp
     $year = date('Y', $date)
     // if the year doesn't already exist in the array, add it.
     if(!in_array($year, $yearOptions)) { $yearOptions[] = $year; }
}

foreach($yearsOptions as $year) {
     echo('<option value="' . $year . '">' . $year . '</option>');
}

希望它有效。

答案 6 :(得分:0)

如上所述,最简单的方法是

SELECT DISTINCT YEAR(date) FROM user_history ORDER BY date

但如果日期未在数据库中保存为常规DATE数据库类型,则无法应用年份函数,然后需要手动处理。

$result = mysql_query("SELECT date FROM user_history");

$yearoptions = "";
$yearArray = array();
while($row = mysql_fetch_array($result)) {
    $date = $row['date'];
    $yeararray = explode("-", $date);
    array_push($yearArray, $year[2]);
}
$yearArray = array_unique($yearArray); // Keep only distinct elements
$yearArray = array_sort($yearArray); // To have years in asc order


for(int i=0; i<sizeof($yearArray); i++) {
    $yearoptions .= '<option value="' . $yearArray[i] . '">'. $yearArray[i] . '</option>';
}