# 使用PHP建立五層下拉式選單並動態連結資料庫,並使用datatables套件,並同一頁面顯示,並搭配註解說明 ###### tags: `AUO` `前端` 以下是使用PHP建立五層下拉式選單並動態連結資料庫、使用datatables套件並同一頁面顯示的範例程式碼,並搭配註解說明: ``` <!DOCTYPE html> <html> <head> <title>Five-level Dropdown using PHP and DataTables</title> <!-- 引入jQuery和DataTables CSS和JavaScript --> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.11.4/css/jquery.dataTables.css"> <script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.11.4/js/jquery.dataTables.js"></script> </head> <body> <?php // 資料庫連線設定 $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "dbname"; // 建立資料庫連線 $conn = new mysqli($servername, $username, $password, $dbname); // 檢查連線是否成功 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // 取得第一層資料 $sql = "SELECT DISTINCT category FROM products"; $result = $conn->query($sql); // 印出第一層下拉式選單 echo "<select id='category' name='category'>"; echo "<option value=''>--請選擇--</option>"; while($row = $result->fetch_assoc()) { echo "<option value='".$row['category']."'>".$row['category']."</option>"; } echo "</select>"; // 釋放第一層資料的資源 $result->free(); // 印出第二層下拉式選單的空框 echo "<select id='subcategory' name='subcategory'></select>"; // 印出第三層下拉式選單的空框 echo "<select id='subsubcategory' name='subsubcategory'></select>"; // 印出第四層下拉式選單的空框 echo "<select id='subsubsubcategory' name='subsubsubcategory'></select>"; // 印出第五層下拉式選單的空框 echo "<select id='subsubsubsubcategory' name='subsubsubsubcategory'></select>"; // 釋放資料庫連線資源 $conn->close(); ?> <!-- JavaScript區塊 --> <script type="text/javascript"> $(document).ready(function() { // 當第一層下拉式選單改變時觸發事件 $("#category").change(function() { // 取得第一層下拉式選單的值 var category = $(this).val(); // 如果第一層下拉式選單沒有選擇值,就清空其他下拉式選單 if (category == "") { $("#subcategory").html(""); $("#subsubcategory").html(""); $("#subsubsubcategory").html(""); $("#subsubsubsubcategory").html(""); } else { // 如果第一層下拉式選單有選擇值,就用AJAX從後端取得第二層資料 $.ajax({ type: "POST", url: "get_data.php", data: {category: category, level: 2}, success: function(data) { // 將第二層資料填入第二層下拉式選單 $("#subcategory").html(data); // 清空其他下拉式選單 $("#subsubcategory").html(""); $("#subsubsubcategory").html(""); $("#subsubsubsubcategory").html(""); } }); } }); // 當第二層下拉式選單改變時觸發事件 $("#subcategory").change(function() { // 取得第二層下拉式選單的值 var subcategory = $(this).val(); // 如果第二層下拉式選單沒有選擇值,就清空其他下拉式選單 if (subcategory == "") { $("#subsubcategory").html(""); $("#subsubsubcategory").html(""); $("#subsubsubsubcategory").html(""); } else { // 如果第二層下拉式選單有選擇值,就用AJAX從後端取得第三層資料 $.ajax({ type: "POST", url: "get_data.php", data: {category: subcategory, level: 3}, success: function(data) { // 將第三層資料填入第三層下拉式選單 $("#subsubcategory").html(data); // 清空其他下拉式選單 $("#subsubsubcategory").html(""); $("#subsubsubsubcategory").html(""); } }); } }); // 當第三層下拉式選單改變時觸發事件 $("#subsubcategory").change(function() { // 取得第三層下拉式選單的值 var subsubcategory = $(this).val(); // 如果第三層下拉式選單沒有選擇值,就清空其他下拉式選單 if (subsubcategory == "") { $("#subsubsubcategory").html(""); $("#subsubsubsubcategory").html(""); } else { // 如果第三層下拉式選單有選擇值,就用AJAX從後端取得第四層資料 $.ajax({ type: "POST", url: "get_data.php", data: {category: subsubcategory, level: 4}, success: function(data) { // 將第四層資料填入第四層下拉式選單 $("#subsubsubcategory").html(data); // 清空其他下拉式選單 $("#subsubsubsubcategory").html(""); } }); } }); // 當第四層下拉式選單改變時觸發事件 $("#subsubsubcategory").change(function() { // 取得第四層下拉式選單的值 var subsubsubcategory = $(this).val(); // 如果第四層下拉式選單沒有選擇值,就清空其他下拉式選單 if (subsubsubcategory == "") { $("#subsubsubsubcategory").html(""); } else { // 如果第四層下拉式選單有選擇值,就用AJAX從後端取得第五層資料 $.ajax({ type: "POST", url: "get_data.php", data: {category: subsubsubcategory, level: 5}, success: function(data) { // 將第五層資料填入第五層下拉式選單 $("#subsubsubsubcategory").html(data); } }); } }); // 當第五層下拉式選單改變時觸發事件 $("#subsubsubsubcategory").change(function() { // 取得第五層下拉式選單的值 var subsubsubsubcategory = $(this).val(); // 如果第五層下拉式選單有選擇值,就用AJAX從後端取得相關資料並顯示於頁面上 if (subsubsubsubcategory != "") { $.ajax({ type: "POST", url: "get_data.php", data: {category: subsubsubsubcategory, level: 6}, success: function(data) { // 將資料填入datatable並顯示於頁面上 $("#datatable").html(data); $('#datatable').DataTable(); } }); } }); }); </script> </head> <body> <div> <label>第一層:</label> <select id="category"> <option value="">請選擇</option> <!-- 第一層下拉式選單選項由後端動態產生 --> <?php echo $categories; ?> </select> </div> <div> <label>第二層:</label> <select id="subcategory"> <option value="">請選擇</option> </select> </div> <div> <label>第三層:</label> <select id="subsubcategory"> <option value="">請選擇</option> </select> </div> <div> <label>第四層:</label> <select id="subsubsubcategory"> <option value="">請選擇</option> </select> </div> <div> <label>第五層:</label> <select id="subsubsubsubcategory"> <option value="">請選擇</option> </select> </div> <div id="datatable"></div> </body> </html> ``` 解釋: 以上程式碼建立了一個五層下拉式選單,並且使用AJAX技術來動態從資料庫取得資料,並用datatables套件來顯示表格。 首先,在HTML中建立五個下拉式選單,每個下拉式選單的id屬性分別為category、subcategory、subsubcategory、subsubsubcategory和subsubsubsubcategory。然後,在JavaScript中設定了一些事件處理器。 當第一層下拉式選單改變時,將觸發事件處理器。此事件處理器使用AJAX從後端的get_data.php檔案中取得第二層資料。get_data.php檔案會接收category和level兩個參數,category代表要查詢的資料類別,level代表要查詢的資料層級。此檔案會回傳一個JSON格式的資料,其中包含第二層資料的選項。然後,此事件處理器會將第二層資料填入第二層下拉式選單中。 接著,當第二層下拉式選單改變時,將觸發事件處理器。此事件處理器會使用AJAX從後端的get_data.php檔案中取得第三層資料。然後,此事件處理器會將第三層資料填入第三層下拉式選單中。 接著,當第三層下拉式選單改變時,將觸發事件處理器。此事件處理器會使用AJAX從後端的get_data.php檔案中取得第四層資料。然後,此事件處理器會將第四層資料填入第四層下拉式選單中。 接著,當第四層下拉式選單改變時,將觸發事件處理器。此事件處理器會使用AJAX從後端的get_data.php檔案中取得第五層資料。然後,此事件處理器會將第五層資料填入第五層下拉式選單中。 最後,當第五層下拉式選單改變時,將觸發事件處理器。此事件處理器會使用AJAX從後端的get_data.php檔案中取得相關資料,並將資料填入datatables中,並在頁面上 get_data.php檔案 以下是get_data.php檔案的程式碼,這個檔案會從資料庫中取得相關資料,並回傳一個JSON格式的資料,其中包含該層級資料的選項。 ``` <?php // 建立資料庫連線 $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "dbname"; $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // 取得從前端傳來的參數 $category = $_GET['category']; $level = $_GET['level']; // 根據不同的層級,從資料庫取得相關資料 if ($level == 1) { $sql = "SELECT DISTINCT category FROM items ORDER BY category ASC"; } elseif ($level == 2) { $subcategory = $_GET['subcategory']; $sql = "SELECT DISTINCT subcategory FROM items WHERE category = '$subcategory' ORDER BY subcategory ASC"; } elseif ($level == 3) { $subcategory = $_GET['subcategory']; $subsubcategory = $_GET['subsubcategory']; $sql = "SELECT DISTINCT subsubcategory FROM items WHERE category = '$subcategory' AND subcategory = '$subsubcategory' ORDER BY subsubcategory ASC"; } elseif ($level == 4) { $subcategory = $_GET['subcategory']; $subsubcategory = $_GET['subsubcategory']; $subsubsubcategory = $_GET['subsubsubcategory']; $sql = "SELECT DISTINCT subsubsubcategory FROM items WHERE category = '$subcategory' AND subcategory = '$subsubcategory' AND subsubcategory = '$subsubsubcategory' ORDER BY subsubsubcategory ASC"; } elseif ($level == 5) { $subcategory = $_GET['subcategory']; $subsubcategory = $_GET['subsubcategory']; $subsubsubcategory = $_GET['subsubsubcategory']; $subsubsubsubcategory = $_GET['subsubsubsubcategory']; $sql = "SELECT * FROM items WHERE category = '$subcategory' AND subcategory = '$subsubcategory' AND subsubcategory = '$subsubsubcategory' AND subsubsubcategory = '$subsubsubsubcategory'"; } $result = $conn->query($sql); // 將查詢結果轉換成JSON格式,並回傳給前端 $data = array(); if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { $data[] = $row; } } echo json_encode($data); $conn->close(); ?> ``` 解釋: 以上程式碼是get_data.php檔案的程式碼。當AJAX從前端傳來的參數後,此檔案會根據不同的層級,從資料庫取得相關資料。然後,將查詢結果轉換成JSON格式,並回傳給前端。 首先,建立資料庫連線。接著,使用$_GET從前端取得傳來的參數$category和$level。