Binyamin
Binyamin

Reputation: 7803

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

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>';

Upvotes: 6

Views: 64645

Answers (4)

nomistic
nomistic

Reputation: 2962

Adding a new answer here for posterity, since the old code, which while correct at the time (actually mysqli did exist, but many hosts didn't support PHP 5), is unfortunately using deprecated code. Instead of using mysql_ extensions, here's a way to handle it using an object oriented approach which will work with mysqli_ connections:

Here's the database connection

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

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

Assuming that the $year variable is coming from a form (though it could be used from GET or SESSION or wherever)

$year = $_POST['year'];

Here's the query for the option button (I have it broken out into different rows to make it a little easier to read):

$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>';
    }

Upvotes: 1

bobince
bobince

Reputation: 536339

In addition to fixing the =/== gotcha, you can save yourself the array lookup and make the code simpler by asking the database to return each year only once in the query:

<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>

(You may not need htmlspecialchars() assuming that's a numeric year, but it's good practice always to HTML-escape any plain text you include in an HTML template. You can define a function with a shorter name to do the echo htmlspecialchars to cut down on typing. )

Upvotes: 6

2ndkauboy
2ndkauboy

Reputation: 9377

Try this one:

    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>';

It doesn't saves the state in a variable which you have to overwrite.

And I think the real error was the single equal sign in $year=$r["year"] and not wihtin the rest of the code.

Upvotes: 7

Artefacto
Artefacto

Reputation: 97805

You must define $selected everytime, and you were using the assignment operator instead of the comparison:

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>';

Upvotes: 2

Related Questions