如何通过MySQL和PHP设置

问题描述:

如何使<option selected="selected">由MySQL和PHP设置?如何通过MySQL和PHP设置<option selected =“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++){ 
    $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>'; 
+0

为什么在您的评论中,您在测试$ r [“year”]之前已将其分配给$ r?你试过的代码给你什么错误? – 2010-06-03 21:09:50

+0

@Mark Byers:O.K.,我改变它。即使在$ r分配后它也不起作用。 – Binyamin 2010-06-03 21:25:45

除了固定=/==疑难杂症,你可以保存自己的数组查找和简化代码通过询问该数据库每年查询一次返回不需要htmlspecialchars()假设这是一个数字年份,但总是以HTML格式转义任何包含在HTML模板中的纯文本是一种很好的做法。您可以使用较短的名称定义一个函数来减少打字时的打字量)

+0

您的样本和@ Kau-Boy代码有什么区别?哪一个更快,更安全等忽略'htmlspecialchars()'add? – Binyamin 2010-06-04 12:58:00

+0

HTML转义是这里唯一的'安全'问题。至于速度,使用数据库而不是PHP来丢弃重复的年份,因为在这个答案中通常会更快(如果有很多数据,速度要快得多),就像原始问题代码和Kau-Boy的版本需要要从数据库中提取“id”表的全部内容并返回到PHP。 – bobince 2010-06-05 14:58:56

+0

另一个主要区别是我已经改变了格式来使用PHP本身来将内容模板化为HTML,而不是连接然后回显字符串,并且在他们自己的PHP中隔离了块结构(在这种情况下是'while')标签。这允许一个一致的缩进层次结构。这纯粹是一种文体选择,对性能影响不大,但我认为可读性有所帮助。 – bobince 2010-06-05 15:02:00

必须定义$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

不幸的是,它**不工作,所以**,它总是保持'选择'选项相同的价值(到最新的'年':2010年)。 – Binyamin 2010-06-03 21:21:16

+0

@Binyamin我没有完全得到你想要的,但试试这个代码 - 当然选择$并不是恒定的。 – Artefacto 2010-06-03 21:34:47

试试这个:

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

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

您可以:

+0

非常感谢!它起作用! – Binyamin 2010-06-03 21:33:39

+0

我很高兴可以帮助你。 – 2ndkauboy 2010-06-03 21:49:51

添加因为旧代码虽然在当时正确(实际上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>'; 
    }