我正在尝试从数据库中的表中使用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>';
任何人都可以看到我做错了什么并提出建议吗?
答案 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>';
}