5

How to make <option selected="selected"> set by MySQL and PHP?

My code:

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

4 に答える 4

6

これを試してください:

    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"]の単一の等号であり、残りのコードではなかったと思います。

于 2010-06-03T21:28:38.143 に答える
5

=/ gotchaを修正することに加えて==、クエリで毎年 1 回だけ返すようにデータベースに要求することで、配列ルックアップを節約し、コードを簡単にすることができます。

<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、入力を減らすことができます。)

于 2010-06-03T21:47:24.740 に答える
2

毎回定義する必要$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>';
于 2010-06-03T21:10:21.120 に答える
1

当時は正しかった古いコード (実際に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>';
    }
于 2015-05-25T14:44:57.023 に答える