【问题标题】:How to make <option selected="selected"> set by MySQL and PHP?如何让 MySQL 和 PHP 设置 <option selected="selected">?
【发布时间】:2011-02-27 12:36:34
【问题描述】:

如何让&lt;option selected="selected"&gt;被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>';

【问题讨论】:

  • 为什么在你的评论中你在分配给 $r 之前要测试 $r["year"]?您尝试的代码给您带来了什么错误?
  • @Mark Byers:好的,我改变它。即使在$r 分配之后它也不起作用。

标签: php mysql select option


【解决方案1】:

试试这个:

    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"] 中的单个等号,而不是其余代码。

【讨论】:

  • 很高兴能帮到你。
【解决方案2】:

除了修复=/== 陷阱之外,您还可以通过要求数据库在查询中每年仅返回一次来节省数组查找并简化代码:

<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 转义。您可以定义一个名称较短的函数来执行 @987654325 @ 减少打字。 )

【讨论】:

  • 您的示例代码和@Kau-Boy 代码有什么区别?哪个更快,更安全等忽略htmlspecialchars()添加?
  • HTML 转义是这里唯一的“安全”问题。至于速度,在原始问题代码和 Kau 中,使用数据库而不是 PHP 来丢弃此答案中的重复年份通常会更快(如果有 lot 数据则明显更快) -Boy的版本需要将id表的全部内容从数据库中提取出来返回给PHP。
  • 另一个主要区别是我更改了格式以使用 PHP 本身将内容模板化为 HTML,而不是连接然后回显字符串,并隔离块结构(while in本例)在他们自己的 PHP 标记中。这允许单一、一致的缩进层次结构。这纯粹是一种风格选择,对性能几乎没有影响,但我认为可读性是有帮助的。
【解决方案3】:

您必须每次都定义$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>';

【讨论】:

  • 不幸的是它不起作用,它始终将selected 选项保持为相同的值(到最新的year:2010)。
  • @Binyamin 我没有完全得到你想要的,但试试这个代码——当然 $selected 不是恒定的。
【解决方案4】:

在这里为后代添加一个新答案,因为旧代码虽然在当时是正确的(实际上 mysqli 确实存在,但许多主机不支持 PHP 5),但不幸的是使用了已弃用的代码。不是使用mysql_ 扩展,而是使用面向对象的方法来处理它,该方法适用于mysqli_ 连接:

这是数据库连接

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

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

假设$year 变量来自一个表单(尽管它可以从GETSESSION 或任何地方使用)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 2013-02-19
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多