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 (!开发者_StackOverflow中文版in_array($r['year'], $tempholder)){
$tempholder[$i] = $r['year'];
echo "<option>".$r["year"]."</option>";//<option$selected>...
}
}
unset($tempholder);
echo '</select>';
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.
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.
)
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>';
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>';
}
精彩评论