Запросите базу данных, разбейте дату, чтобы получить год, и заполните выпадающий список уникальным годом - PullRequest
1 голос
/ 09 августа 2011

Я пытаюсь заполнить форму SELECT с помощью OPTIONS из таблицы в моей базе данных. Он должен отображаться каждый год один раз.

например. Если полями даты в базе данных являются 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 ]

4 голосов
/ 09 августа 2011
$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 голос
/ 09 августа 2011

SELECT DISTINCT YEAR(date) FROM user_history, возможно, с ORDER BY date, сделает PHP-часть намного проще ...

0 голосов
/ 09 августа 2011

Как уже упоминалось выше, самый простой способ будет

SELECT DISTINCT YEAR(date) FROM user_history ORDER BY date

но если дата не сохраняется в базе данных обычного типа DATE db, вы не можете применить функцию year, а затем вам нужно обработать ее вручную.

$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>';
}
0 голосов
/ 09 августа 2011

Вы не проверяете наличие дубликатов за год до его вывода.Это ваша основная проблема.

Вы должны сначала сохранить возможные годы в виде массива, а затем заполнить опции, основанные на этом массиве.Таким образом, вам не придется беспокоиться о дублировании.Если у вас 11.26.2009, 09.01.2010, 15.15.2010, 06.05.2011, выполните итерацию всех результатов для массива, аналогичного массиву $ yearOptions = ('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>');
}

Надеюсь, это сработает.

0 голосов
/ 09 августа 2011

Прежде всего, могу ли я предложить вам использовать date_parse в строке $ ['date'], что-то вроде этого.

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

Причина, по которой годы появляются дважды, заключается в том, что у вас нет чека дляизбыточность.Я бы порекомендовал добавлять каждый год в массив и использовать in_array ($ year, $ array), чтобы проверить, добавлен ли он у вас.

0 голосов
/ 09 августа 2011

Попробуйте: SELECT DISTINCT YEAR(date) FROM user_history

0 голосов
/ 09 августа 2011

Попробуйте:

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

Вам не нужен код, который вы использовали для извлечения компонента year таким образом ...

Ваш полный код будет:

$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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...