Как настроить ‹option selected=selected› с помощью MySQL и PHP?

Как сделать <option selected="selected"> установленным MySQL и PHP?

Мой код:

echo '<select>';
$tempholder = array();
$rs = mysql_query("SELECT * FROM id ORDER BY year");
$nr = mysql_num_rows($rs);
for ($i=0; $i<$nr; $i++){
    $r = mysql_fetch_array($rs);
    //if($year==$r["year"]){ $selected=' selected="selected"'; }//doesn't work so
    if (!in_array($r['year'], $tempholder)){
        $tempholder[$i] = $r['year'];
        echo "<option>".$r["year"]."</option>";//<option$selected>...
    }
}
unset($tempholder);
echo '</select>';

person Binyamin    schedule 03.06.2010    source источник
comment
Почему в своем комментарии вы тестируете $r[year] до того, как присвоили $r? Какую ошибку выдает код, который вы пробовали?   -  person Mark Byers    schedule 04.06.2010
comment
@Mark Byers: Хорошо, я меняю. И это не работает даже после назначения $r.   -  person Binyamin    schedule 04.06.2010


Ответы (4)


В дополнение к исправлению ошибки =/== вы можете избавить себя от поиска в массиве и упростить код, попросив базу данных возвращать каждый год только один раз в запросе:

<select>
    <?php $result= mysql_query('SELECT DISTINCT year FROM id ORDER BY year'); ?>
    <?php while($row= mysql_fetch_assoc($result)) { ?>
        <option <?php if ($row['year']==$year) { ?>selected="selected"<?php } ?>>
            <?php echo htmlspecialchars($row['year']); ?>
        </option>
    <?php } ?>
</select>

(Возможно, вам не понадобится htmlspecialchars(), предполагая, что это числовой год, но хорошей практикой всегда является HTML-экранирование любого простого текста, который вы включаете в шаблон HTML. Вы можете определить функцию с более коротким именем, чтобы сделать echo htmlspecialchars, чтобы сократить ввод. )

person bobince    schedule 03.06.2010
comment
В чем разница между вашим образцом и кодом @Kau-Boy? Какой из них быстрее, безопаснее и т. д. игнорируя htmlspecialchars() добавить? - person Binyamin; 04.06.2010
comment
Экранирование HTML — единственная проблема «безопасности» здесь. Что касается скорости, то использование базы данных, а не PHP для отбрасывания повторяющихся лет, как в этом ответе, обычно будет быстрее (значительно быстрее, если данных много), как в исходном коде вопроса и Кау. Версия -Boy требует, чтобы все содержимое таблицы id было извлечено из базы данных и возвращено в PHP. - person bobince; 05.06.2010
comment
Другое основное отличие состоит в том, что я изменил форматирование, чтобы использовать сам PHP для шаблонирования содержимого в HTML, а не конкатенировать, а затем повторять строки, и изолировал блочные структуры (в данном случае while) в их собственном теге PHP. Это позволяет создать единую согласованную иерархию отступов. Это чисто стилистический выбор, практически не влияющий на производительность, но я думаю, что удобочитаемость помогает. - person bobince; 05.06.2010

Попробуй это:

    echo '<select>';
$tempholder = array();
$rs = mysql_query("SELECT * FROM id ORDER BY year");
$nr = mysql_num_rows($rs);
for ($i=0; $i<$nr; $i++){
    $r = mysql_fetch_array($rs);
    if (!in_array($r['year'], $tempholder)){
        $tempholder[$i] = $r['year'];
        echo "<option".(($year==$r["year"])? ' selected="selected"' : '').">".$r["year"]."</option>";
    }
}
unset($tempholder);
echo '</select>';

Он не сохраняет состояние в переменной, которую вы должны перезаписать.

И я думаю, что настоящей ошибкой был единственный знак равенства в $year=$r["year"], а не в остальной части кода.

person 2ndkauboy    schedule 03.06.2010
comment
Я рад, что смог помочь вам. - person 2ndkauboy; 04.06.2010

Вы должны определять $selected каждый раз, и вы использовали оператор присваивания вместо сравнения:

echo '<select>';
$tempholder = array();
$rs = mysql_query("SELECT * FROM id ORDER BY year");
$nr = mysql_num_rows($rs);
for ($i = 0; $i < $nr; $i++){
    if($year == $r["year"]) { //not $year = $r["year"]
        $selected=' selected="selected"';
    }
    else {
       $selected = "";
    }
    $r = mysql_fetch_array($rs);
    if (!in_array($r['year'], $tempholder)){
        $tempholder[$i] = $r['year'];
        echo "<option$selected>" . $r["year"] . "</option>";
    }
}
unset($tempholder);
echo '</select>';
person Artefacto    schedule 03.06.2010
comment
К сожалению, это так не работает, он всегда сохраняет параметр selected с одним и тем же значением (до последнего year: 2010). - person Binyamin; 04.06.2010
comment
@Binyamin Я не совсем понял, чего вы хотите, но попробуйте этот код - конечно, $selected не является константой. - person Artefacto; 04.06.2010

Добавление нового ответа здесь для потомков, поскольку старый код, который был правильным в то время (на самом деле mysqli существовал, но многие хосты не поддерживали PHP 5), к сожалению, использует устаревший код. Вместо использования расширений mysql_, вот способ справиться с этим, используя объектно-ориентированный подход, который будет работать с соединениями mysqli_:

Вот подключение к базе

$conn = new mysqli($host, $username, $password, $dbname);

if  ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

Предполагая, что переменная $year поступает из формы (хотя ее можно использовать из GET или SESSION или где-то еще)

$year = $_POST['year'];

Вот запрос для кнопки выбора (я разбил его на разные строки, чтобы его было немного легче читать):

$result=$conn->query($sql);
    while($row = $result->fetch_assoc()) {    
        if ($row['year']==$year) {
            $selected = 'selected="selected"';
        }
        else {
            $selected = '';
        }   
        echo '<option value="'.$row['year'].'" '. $selected . '>"'
            . $row['year'] .'</option>';
    }
person nomistic    schedule 25.05.2015