2010-06-03 38 views
5

Làm cách nào để tạo <option selected="selected"> được thiết lập bởi MySQL và PHP?Cách đặt <option selected = "selected"> do MySQL và PHP đặt?

Mã của tôi:

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

Tại sao nhận xét của bạn là bạn thử $ r ["year"] trước khi bạn gán $ r? Bạn đã thử mã lỗi nào cho bạn? –

+0

@Mark Byers: O.K., tôi thay đổi nó. Và nó không hoạt động ngay cả sau khi '$ r' gán. – Binyamin

Trả lời

5

Ngoài sửa chữa các Gotcha =/==, bạn có thể tiết kiệm cho mình tra cứu mảng và làm cho đoạn code đơn giản hơn bằng cách yêu cầu cơ sở dữ liệu trở lại mỗi năm một lần duy nhất trong truy vấn:

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

(Bạn có thể không cần htmlspecialchars() giả định đó là năm số, nhưng thực hành tốt là luôn luôn để HTML-thoát khỏi bất kỳ văn bản thuần túy nào mà bạn đưa vào mẫu HTML. Bạn có thể xác định hàm có tên ngắn hơn để thực hiện echo htmlspecialchars để giảm bớt việc nhập. )

+0

Sự khác biệt giữa mẫu của bạn và mã @ Kau-Boy là gì? Cái nào nhanh hơn, an toàn hơn ... bỏ qua 'htmlspecialchars()' add? – Binyamin

+0

Tính năng thoát HTML là vấn đề 'an toàn' duy nhất ở đây.Đối với tốc độ, sử dụng cơ sở dữ liệu thay vì PHP để loại bỏ năm trùng lặp như trong câu trả lời này nói chung sẽ nhanh hơn (nhanh hơn đáng kể nếu có nhiều * dữ liệu), như trong mã câu hỏi ban đầu và phiên bản Kau-Boy yêu cầu toàn bộ nội dung của bảng 'id' được trích xuất từ ​​cơ sở dữ liệu và được trả về cho PHP. – bobince

+0

Sự khác biệt chính khác là tôi đã thay đổi định dạng để sử dụng PHP để tạo mẫu nội dung thành HTML, chứ không phải là chuỗi nối tiếp và lặp lại, và cô lập cấu trúc khối ('while' trong trường hợp này) trong PHP của riêng chúng nhãn. Điều này cho phép phân cấp thụt đầu dòng duy nhất, nhất quán. Đây hoàn toàn là một sự lựa chọn phong cách, với ít hiệu ứng về hiệu suất, nhưng tôi nghĩ rằng khả năng đọc được giúp đỡ. – bobince

2

Bạn phải xác định $selected mọi lúc, và bạn đang sử dụng toán tử gán thay vì so sánh:

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

Thật không may nó ** không hoạt động như vậy **, nó giữ luôn luôn 'lựa chọn' tùy chọn để cùng một giá trị (đến mới nhất' năm': 2010). – Binyamin

+0

@ Binyamin Tôi đã không hoàn toàn có được những gì bạn muốn, nhưng hãy thử mã này - chắc chắn $ được chọn không phải là hằng số. – Artefacto

6

Hãy thử điều này một:

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

Nó không lưu trạng thái trong một biến mà bạn phải ghi đè lên.

Và tôi nghĩ rằng lỗi thực sự là dấu bằng đơn trong năm $ = $ r ["năm"] và không xóa phần còn lại của mã.

+0

Cảm ơn rất nhiều! Nó hoạt động grate! – Binyamin

+0

Tôi rất vui vì có thể giúp bạn. – 2ndkauboy

0

Thêm một ew trả lời ở đây về hậu thế, vì mã cũ, trong khi chính xác vào thời điểm đó (thực tế là mysqli đã tồn tại, nhưng nhiều máy chủ không hỗ trợ PHP 5), rất tiếc khi sử dụng mã không dùng nữa. Thay vì sử dụng mysql_ phần mở rộng, đây là một cách để xử lý nó sử dụng một cách tiếp cận hướng đối tượng mà sẽ làm việc với mysqli_ kết nối:

Dưới đây là các kết nối cơ sở dữ liệu

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

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

Giả sử rằng biến $year đến từ một hình thức (mặc dù nó có thể được sử dụng từ GET hoặc SESSION hoặc bất cứ nơi nào)

$year = $_POST['year']; 

Dưới đây là các truy vấn cho các nút tùy chọn (tôi có nó bị hỏng thành các hàng khác nhau để giúp dễ đọc hơn):

$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>'; 
    } 
Các vấn đề liên quan