Как сделать <option selected = "selected"> установленным MySQL и PHP? - PullRequest
5 голосов
/ 04 июня 2010

Как сделать <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>';

Ответы [ 4 ]

6 голосов
/ 04 июня 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"], а не остальная часть кода.

5 голосов
/ 04 июня 2010

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

<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 сократить печатать. )

2 голосов
/ 04 июня 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>';
0 голосов
/ 25 мая 2015

Добавление нового ответа здесь для потомков, поскольку старый код, который хотя и был правильным в то время (на самом деле 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>';
    }
...