<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>動態下拉式選單 &#8211; 備忘程式碼</title>
	<atom:link href="https://www.weblink.idv.tw/tag/%E5%8B%95%E6%85%8B%E4%B8%8B%E6%8B%89%E5%BC%8F%E9%81%B8%E5%96%AE/feed" rel="self" type="application/rss+xml" />
	<link>https://www.weblink.idv.tw</link>
	<description>Javascript, PHP, HTML5 &#38; CSS3 coding memos</description>
	<lastBuildDate>Tue, 26 Mar 2024 03:17:18 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.2</generator>
	<item>
		<title>ajax搭配PHP、MySQL輸出動態下拉式選單</title>
		<link>https://www.weblink.idv.tw/2017/56</link>
					<comments>https://www.weblink.idv.tw/2017/56#comments</comments>
		
		<dc:creator><![CDATA[Steven LIU]]></dc:creator>
		<pubDate>Sat, 08 Jul 2017 16:10:47 +0000</pubDate>
				<category><![CDATA[Javascript & Jquery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[動態下拉式選單]]></category>
		<guid isPermaLink="false">https://www.weblink.idv.tw/?p=56</guid>

					<description><![CDATA[動態下拉式選單似乎是詢問度很高的設計需求，jquery甚至還有許多plugin可以選；不過試用過好幾個plug [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>動態下拉式選單似乎是詢問度很高的設計需求，jquery甚至還有許多plugin可以選；不過試用過好幾個plugin都不是很順手，後來想想其實動態下拉式選單並不是多難的東西，於是就花了點時間自己寫，順便也測試自己邏輯夠不夠清楚。</p>



<span id="more-56"></span>



<p>動態下拉式選單的邏輯說穿了很簡單：選定第一層選項後（選項可以用html列或是從資料庫拉），第二層選單會根據第一層選項跳出對應的內容（如果有第三層也是同樣的邏輯，只是資料庫的設計會多一層欄位）。</p>



<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9940075534877533"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-9940075534877533"
     data-ad-slot="4891658629"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>
<br>



<p>邏輯了解之後，又要如何用程式表達呢？<br>
1. 假設第一層選單是從資料庫拉，那麼首先就要透過PHP先把第一層選單的項目從資料庫裡撈出來<br>
2. 由jquery取得選取的項目，並用ajax傳到後端負責「打撈」的PHP頁面（假設為deal.php）<br>
3. deal.php取得第一層選項，並把對應的第二層項目撈出來、回傳給ajax<br>
4. 最後，ajax的success:function(res){}再把回傳的第二層項目插入第二層select的option<br>
大功告成！</p>



<p>接下來，在開始準備程式前，首先需要把資料庫準備好。舉例來說，我希望第一層是產品的分類項目，第二層是分類項目下的產品型號，那麼在資料庫就需要先建「分類」與「型號」的欄位，簡單規劃如下：</p>



<figure class="wp-block-table"><table><tbody><tr><th>categories</th><th>items</th></tr><tr><td>TV</td><td>46&#8243;</td></tr><tr><td>TV</td><td>50&#8243;</td></tr><tr><td>Player</td><td>BD</td></tr><tr><td>Player</td><td>DVD</td></tr><tr><td>Player</td><td>VCD</td></tr></tbody></table></figure>



<p>資料庫建好之後，就可以開始著手頁面了：</p>



<p><b>1. 建置html選單：</b></p>



<pre class="wp-block-code"><code>&lt;div&gt;
   &lt;select id='categories'&gt;
      &lt;option&gt;選擇系列&lt;/option&gt;
   &lt;/select&gt;
&lt;/div&gt;
&lt;div&gt;
   &lt;select id='items'&gt;
      &lt;option&gt;選擇產品&lt;/option&gt;
   &lt;/select&gt;
&lt;/div&gt;</code></pre>



<p><b>2. 插入PHP語法把categories的項目從資料庫裡撈出來：</b></p>



<pre class="wp-block-code"><code>&lt;div&gt;
   &lt;select id='categories'&gt;
      &lt;option&gt;選擇系列&lt;/option&gt;
&lt;?
$sql = "SELECT DISTINCT categories FROM 表格名稱";//DISTINCT可選出欄位中具有不同名稱的資料，本例中會挑出TV與Player
$result = mysqli_query($link, $sql) or die("資料選取錯誤！".mysqli_error($link));
while($data=mysqli_fetch_assoc($result)){
?&gt;
      &lt;option value="&lt;?echo $data&#91;'categories'];?&gt;"&gt;&lt;?echo $data&#91;'categories'];?&gt;&lt;/option&gt;
&lt;?
}
?&gt;
   &lt;/select&gt;
&lt;/div&gt;
&lt;div&gt;
   &lt;select id='items'&gt;
      &lt;option&gt;選擇產品&lt;/option&gt;
   &lt;/select&gt;
&lt;/div&gt;</code></pre>



<p><b>3. 抓取被選取的選項，透過ajax丟到後端deal.php：</b></p>



<pre class="wp-block-code"><code>$(document).on('change', '#categories', function(){
   var categories = $('#categories :selected').val();//注意:selected前面有個空格！
   $.ajax({
      url:"deal.php",				
      method:"POST",
      data:{
         categories:categories
      },					
      success:function(res){					
         //處理回吐的資料
      }
   })//end ajax
});</code></pre>



<p><b>4. deal.php取得分類選項，從資料庫裡撈對應的型號出來：</b></p>



<pre class="wp-block-code"><code>$categories = $_POST&#91;'categories'];
$sql = "SELECT items FROM 資料表名稱 WHERE categories = '$categories'";
$result = mysqli_query($link, $sql) or die("取出資料失敗！".mysqli_error($link));
$res = "";//把準備回傳的變數res準備好
while($data=mysqli_fetch_assoc($result)){
   $res .= "
      &lt;option value='{$data&#91;"items"]}'&gt;{$data&#91;'items']}&lt;/option&gt;
   ";//將對應的型號項目遞迴列出
};
echo $res;//將型號項目丟回給ajax</code></pre>



<p><b>5. 最後一個步驟，將deal.php吐回的項目列表塞回DOM的select裡面：</b></p>



<pre class="wp-block-code"><code>$(document).on('change', '#categories', function(){
   var categories = $('#categories :selected').val();
   $.ajax({
      url:"deal.php",				
      method:"POST",
      data:{
         categories:categories
      },					
      success:function(res){					
         $('#items').html(res);
      }
   })//end ajax
});</code></pre>



<p>結束收工！</p>



<p>實際跑過整個流程之後，是不是發現動態下拉式選單真的不複雜，只是若要到三層、四層……，資料庫的設計就要更多欄位而已，說不定反倒是把所有資料輸入資料庫欄位還比較花時間咧！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.weblink.idv.tw/2017/56/feed</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
	</channel>
</rss>
