<?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>PHP &#8211; 備忘程式碼</title>
	<atom:link href="https://www.weblink.idv.tw/category/php/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:50 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</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>
		<item>
		<title>ajax搭配PHP將文字資料存入資料庫</title>
		<link>https://www.weblink.idv.tw/2017/40</link>
					<comments>https://www.weblink.idv.tw/2017/40#respond</comments>
		
		<dc:creator><![CDATA[Steven LIU]]></dc:creator>
		<pubDate>Sat, 08 Jul 2017 06:13:58 +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[sql]]></category>
		<guid isPermaLink="false">https://www.weblink.idv.tw/?p=40</guid>

					<description><![CDATA[在沒有使用ajax將資料從前端往後端傳輸之前，一般的作法都是用HTML的form把表單包起來，然後在actio [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>在沒有使用ajax將資料從前端往後端傳輸之前，一般的作法都是用HTML的form把表單包起來，然後在action與method的地方設定傳輸參數丟給後端處理，像是：<br>
</p>



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



<pre class="wp-block-code"><code>&lt;form action='res.php' method='post'&gt;
   &lt;input name='name' type='text'&gt;
   &lt;input name='submit' type='submit'&gt;
&lt;/form&gt;</code></pre>



<p>這樣後端的res.php頁面就可以透過POST取得name的值作處理（通常是INSERT INTO資料庫）：</p>



<pre class="wp-block-code"><code>&lt;?
require_once('connect.php');//引入資料庫連結設定檔
$name = $_POST&#91;'name'];//取得name值
$sql = "INSERT INTO 表格名稱 (欄位名稱) VALUES ('$name') ";//插入表格語法
mysqli_query($link, $sql) or die("錯誤訊息：".mysqli_error($link));//執行插入
echo "資料插入成功！";//顯示訊息
?&gt;
//這段程式沒有做任何處理，建議實際使用時對變數作if判斷來決定成功與失敗的回傳訊息</code></pre>



<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>但因為這樣會將整頁html都傳出去，而這些資料大部分都是重複沒有必要的，所以後來才開始發展出ajax這種方式，僅把需要的資料丟到後端，不必整頁html都傳。如此一來不僅降低傳輸量，透過jquery的DOM操作，我們還能跳過html的form與input限制，直接把任何我們想傳的值透過抓取DOM元素丟到後端，並且把後端丟回來的東西再透過DOM作更多元的處理。</p>



<p>舉例來說，html碼我們可以用最習慣的div去包裹表單內容：</p>



<pre class="wp-block-code"><code>&lt;div id='input'&gt;
   &lt;input type='text' id='name'&gt;
   &lt;button id='submit'&gt;送出&lt;/button&gt;
&lt;/div&gt;
&lt;div id='response' style='display:none;'&gt;
&lt;/div&gt;</code></pre>



<p>然後javascript就變成：</p>



<pre class="wp-block-code"><code>$(document).on('click', '#submit', function(){ 
/*使用$(document).on()的原因是如果id為submit的按鈕是一開始沒有載入、透過ajax互動後才產生的DOM，那用$().click會抓不到，需以$(document).on()才行 */
   var name = $('#name').val();
   $.ajax({
      url:'res.php',
      method:'POST',
      data:{
         name:name
      },
      success:function(res){
         $('#input').hide();
         $('#response').show().html(res);
      }
   })
}</code></pre>



<p>後端php保持原來的樣子：</p>



<pre class="wp-block-code"><code>&lt;?
require_once('connect.php');//引入資料庫連結設定檔
$name = $_POST&#91;'name'];//取得name值
$sql = "INSERT INTO 表格名稱 (欄位名稱) VALUES ('$name') ";//插入表格語法
mysqli_query($link, $sql) or die("錯誤訊息：".mysqli_error($link));//執行插入
echo "資料插入成功！";//顯示訊息
?&gt;</code></pre>



<p>若ajax傳輸成功，res.php就會吐回</p>



<pre class="wp-block-code"><code>echo "資料插入成功！";</code></pre>



<p>echo的內容會成為success:function(res){}的res，於是我們就能利用這個res變數在現有的DOM上面任意處理啦！以例子來說，就是把id為response的div從隱藏改為顯示，並將res的內容印上去：</p>



<pre class="wp-block-code"><code>$('#response').show().html(res);</code></pre>



<p>如何？用ajax傳值是不是非常簡單？</p>



<p>透過res.php裡面的echo，我們可以決定任何想回傳給前端的callback（例如從資料庫裡撈東西出來作判斷後回吐，許多即時驗證用戶名是否重複的ajax功能即是這種應用），然後前端再於success:function(res){}裡面對回傳的res作處理。只要理解ajax與後端的溝通流程，光是簡單的前後端互動就能創造很多漂亮又即時的網頁效果囉！至於圖片與多個重複欄位的表單要如何以ajax處理，就留給下一篇介紹吧！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.weblink.idv.tw/2017/40/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TCPDF使用中英文字型不亂碼、不缺字</title>
		<link>https://www.weblink.idv.tw/2017/10</link>
					<comments>https://www.weblink.idv.tw/2017/10#comments</comments>
		
		<dc:creator><![CDATA[Steven LIU]]></dc:creator>
		<pubDate>Fri, 07 Jul 2017 08:38:45 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tcpdf]]></category>
		<category><![CDATA[中文]]></category>
		<category><![CDATA[亂碼]]></category>
		<category><![CDATA[字型]]></category>
		<category><![CDATA[英文]]></category>
		<guid isPermaLink="false">http://www.weblink.idv.tw/?p=10</guid>

					<description><![CDATA[之前製作公司報價系統時，遇到了要把報價單匯出的需求，而通常我們寄給客戶的報價單都是.pdf的格式，因此解決方案 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>之前製作公司報價系統時，遇到了要把報價單匯出的需求，而通常我們寄給客戶的報價單都是.pdf的格式，因此解決方案自然就朝輸出.pdf的方向找。</p>



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



<p> <br>google &#8220;php pdf&#8221;，很快就能找到「TCPDF」這個class。 </p>



<p>TCPDF的使用方式非常簡單，只要新增一張負責輸出的.php頁面，並require進去即可。例如：<br> </p>



<pre class="wp-block-code"><code>&lt;?php 
require_once('tcpdf.php'); 
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
?&gt;</code></pre>



<p>這樣檔案裡就能以$pdf-&gt;blablabla去設定輸出內容與格式了。</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>BUT!人生永遠有個BUT，那就是TCPDF的預設中文字體是msungstdlight，非常醜，醜到我沒有臉用這個字體產生的報價單寄給客戶。於是就得找其他字體來用：TCPDF內建的日文漢字cid0jp很不錯，但太多中文字會缺字，沒辦法用；網路上有很多人教說用android的預設字體DroidSansFallback可行，我也去下載了這個字體來用，但竟然發生了中英文一起出現時，英文（或阿拉伯數字）變亂碼的詭異狀況。爬文爬了很久，直到找到<a href="https://blog.tiger-workshop.com/android-tcpdf-missing-chinese-english-fonts/" target="_blank" rel="noopener noreferrer">這篇</a>才知道問題出在哪裡：原來是字體檔內建字型不全造成的阿！改成這個<a href="https://github.com/android/platform_frameworks_base/blob/de0fe2daafb769cc37ca922ffef6dbafb8c6cae2/data/fonts/DroidSansFallback.ttf" target="_blank" rel="noopener noreferrer">版本</a>就中英文都ok啦！</p>



<p>完整處理方式如下：<br> <b>1. 下載中英文字型都完整的<a href="https://github.com/android/platform_frameworks_base/blob/de0fe2daafb769cc37ca922ffef6dbafb8c6cae2/data/fonts/DroidSansFallback.ttf" target="_blank" rel="noopener noreferrer">DroidSansFallback</a>，放在TCPDF資料夾中的fonts資料夾</b><br> <b>2. 隨便做一張.php放在同一個fonts資料夾內，利用下列程式碼將DroidSansFallback.ttf轉成TCPDF可以用的TrueTypeUnicode字型：</b></p>



<pre class="wp-block-code"><code>&lt;?php 
require_once('tcpdf.php'); 
$font = TCPDF_FONTS::addTTFfont('DroidSansFallback.ttf'); 
?&gt;</code></pre>



<p><b>3. 用網頁開啟這個.php檔開始轉檔，轉好之後會在fonts裡面產生三個檔案：droidsansfallback.php、droidsansfallback.ctg.z、droidsansfallback.z<br>
這樣就能用DroidSansFallback字體輸出中英文阿拉伯數字都正常的.pdf檔了！</b><br>
</p>



<pre class="wp-block-code"><code>$pdf-&gt;SetFont('DroidSansFallback', '', 12, '', true);</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://www.weblink.idv.tw/2017/10/feed</wfw:commentRss>
			<slash:comments>24</slash:comments>
		
		
			</item>
	</channel>
</rss>
