<?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>弦の手記 &#187; PHP</title> <atom:link href="http://blog.frost.tw/tag/php/feed" rel="self" type="application/rss+xml" /><link>http://blog.frost.tw</link> <description>紀錄關於弦夜的日記</description> <lastBuildDate>Fri, 30 Jul 2010 13:41:48 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.0.1</generator> <atom:link rel='hub' href='http://blog.frost.tw/?pushpress=hub'/> <item><title>Ajax Push &#8211; 創造即時聊天室</title><link>http://blog.frost.tw/code/poston-2010-07-07/postid-576</link> <comments>http://blog.frost.tw/code/poston-2010-07-07/postid-576#comments</comments> <pubDate>Wed, 07 Jul 2010 11:26:17 +0000</pubDate> <dc:creator>蒼時弦也</dc:creator> <category><![CDATA[程式語言]]></category> <category><![CDATA[AJAX]]></category> <category><![CDATA[PHP]]></category><guid isPermaLink="false">http://blog.frost.tw/?p=576</guid> <description><![CDATA[這昨晚在找好玩的 API 來玩，不過仍然失敗了！ 不過，我卻意外的發現了關鍵字 Server Push 於是我就想，那麼有沒有 PHP Push 呢？ 最後則是得知了 Ajax Push 技術！ 要說這東西，得先把 Server Push(伺服器推送) 和 Client Pull(客戶端拉曳)...]]></description> <content:encoded><![CDATA[<p>這昨晚在找好玩的 API 來玩，不過仍然失敗了！<br /> 不過，我卻意外的發現了關鍵字 Server Push<br /> 於是我就想，那麼有沒有 PHP Push 呢？<br /> 最後則是得知了 Ajax Push 技術！<br /> <span id="more-576"></span><br /> 要說這東西，得先把 Server Push(伺服器推送) 和 Client Pull(客戶端拉曳) 說明一下。<br /> 大家都知道，聊天室是「不斷重新整理頁面」來達成的！<br /> 不過，這卻會造成大量對伺服器請求，讓伺服器產生負擔。<br /> 而 Server Push則是Client Pull的相反作法。</p><p>原本是不斷重新整理，轉變成由伺服器不斷發送資料。<br /> 此時，原本大量消耗伺服器資源問題沒了！<br /> （但是卻多了大量消耗流量問題，畢竟這就像一個下載不完的檔案！）</p><p>不過，在 Ajax 出現後，則出現了混合的作法。<br /> Ajax 的請求作為 Pull, 而伺服器的回應則做為 Push 來使用。<br /> 為什麼不會消耗資源和流量呢？<br /> 因為 Ajax 的特性：「沒有回應，則不動作直到有回應為止。」<br /> 此時，如果發出請求的迴圈因為伺服器不回應而卡死。<br /> 那麼就不存在不斷重複要求伺服器資料的問題。</p><p>另一方面，原本伺服器得一直送出資料。<br /> 現在卻是卡死在無限迴圈中，而且不用段使用如 sleep(1); 來延遲程式執行。<br /> 那麼消耗的流量相對比 Server Push 更少（在加上 Server Push 資料一增加，發送量就會更多。）</p><p>而 Server Push 是無限迴圈不斷發送資料，現在變成無限迴圈檢查新資料。<br /> 此時，是不是變得「省資源」和「更有變化」呢？<br /> 原本瀏覽器和伺服器要即時更新是不可能的，現在卻藉由 Ajax 完美的找到折衷的方法。</p><p>使用方法如何呢？<br /> 以下是某弦研發中的聊天室代碼（還有奇怪東西混在其中啦- -）<br /> *奇怪物已經吃掉了 ^^<br /> Ajax &#8211; 使用 jQuery<br /> Server &#8211; 使用 PHP</p><p><strong>chat.php</strong></p><pre class="brush: html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
&lt;title&gt;蒼時弦也 Real-time Chatroom @ http://frost.tw/&lt;/title&gt;
&lt;script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;

function showChat(){
 $.ajax({
 url: 'chat_server.php',
 global: false,
 dataType: 'text',
 type: 'GET',
 success: function(data){
 $('#chatMsg').append('&lt;div&gt;'+data+'&lt;/div&gt;');
 this.noerror = true;
 },
 complete: function(obj, status){
 if(!this.noerror){
 setTimeout(function(){ showChat(); }, 5000);
 }else{
 showChat();
 }
 }
 });
}

function submitMsg(){
 var nick = $("input[name='nick']").val();
 var say = $("input[name='say']").val();
 $.ajax({
 url: 'say.php',
 global: false,
 type: 'POST',
 dataTyep: 'html',
 data: ({
 'nick' : nick,
 'say' : say
 }),
 success: function(data){
 $("input[name='say']").val('');
 }
 });
}

$(document).ready(function(){
 showChat();
});

&lt;/script&gt;
&lt;/head&gt;

&lt;body&gt;
&lt;div id="chatMsg"&gt;

&lt;/div&gt;
&lt;form action="" method="post" onsubmit="javascript:submitMsg(); return false;"&gt;
 &lt;input type="text" name="nick" value="暱稱" size="10" /&gt;
 &lt;input type="text" name="say" /&gt;
 &lt;input type="submit" value="發言" /&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre><p><strong>chat_server.php</strong></p><pre class="brush: php">&lt;?php
//後端
date_default_timezone_set("Asia/Taipei");
set_time_limit(0);
$_GET['first'] = $_GET['first'] ? $_GET['first'] : false;
if(is_file('chat.log')){
 $now = time();
 $modify = filemtime('chat.log');
 while($modify &lt;= $now &amp;&amp; !$_GET['first']){
 usleep(10000);
 clearstatcache();
 $modify = filemtime('chat.log');
 }
 $array = file_get_contents('chat.log');
 echo $array;
}

flush();
?&gt;</pre><p><strong>say.php</strong></p><pre class="brush: php">&lt;?php
//發文處理
date_default_timezone_set("Asia/Taipei");
if($_POST['say'] &amp;&amp; $_POST['nick']){
 /*$fp = fopen('chat.log', 'w+');
 if(filesize('chat.log') &gt; 0){
 $msg =     PHP_EOL."[{$_POST['nick']}] : {$_POST['say']} @ ".date('H:i:s');
 }else{
 $msg =     "[{$_POST['nick']}] : {$_POST['say']} @ ".date('H:i:s');
 }
 fwrite($fp, $msg);
 fclose($fp);*/
 $msg =     "[{$_POST['nick']}] : {$_POST['say']} @ ".date('H:i:s');
 file_put_contents('./chat.log', $msg);
 echo 'success';
}else{
 echo 'nodata!';    
}
?&gt;</pre><p>最後，要提醒大家：「轉貼請附上連結，昨晚查資料時發現自己文章被轉貼，還沒有註明作者和網址！」<br /> *有興趣可以Google搜尋 Push4Free 當關鍵字，看看那些沒品的人如何轉貼的（微笑</p><div class="linkwithin_hook" id="http://blog.frost.tw/code/poston-2010-07-07/postid-576"></div>]]></content:encoded> <wfw:commentRss>http://blog.frost.tw/code/poston-2010-07-07/postid-576/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Discuz 從 7.2 的NC開始的變革</title><link>http://blog.frost.tw/code/poston-2010-06-08/postid-536</link> <comments>http://blog.frost.tw/code/poston-2010-06-08/postid-536#comments</comments> <pubDate>Tue, 08 Jun 2010 11:01:48 +0000</pubDate> <dc:creator>蒼時弦也</dc:creator> <category><![CDATA[程式語言]]></category> <category><![CDATA[Discuz]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[程式]]></category><guid isPermaLink="false">http://blog.frost.tw/?p=536</guid> <description><![CDATA[雖然文章標題挺「全面性」不過我這邊主要在討論NC對插件開發的影響拉！ 尤其到了 Discuz X 這個「威力」又比以往更加強大。 這邊分享的是 7DPS 上的一款插件「反潛水」並且說明一些運用。 首先看看核心原始碼，很短，也只有一個檔案。 &#60;?php if(!defined('IN_DISCUZ')) { exit('Access Denied'); } class plugin_amufqs { } class...]]></description> <content:encoded><![CDATA[<p>雖然文章標題挺「全面性」不過我這邊主要在討論NC對插件開發的影響拉！<br /> 尤其到了 Discuz X 這個「威力」又比以往更加強大。<br /> 這邊分享的是 7DPS 上的一款插件「反潛水」並且說明一些運用。<br /> <span id="more-536"></span><br /> 首先看看核心原始碼，很短，也只有一個檔案。</p><pre class="brush:php">&lt;?php

if(!defined('IN_DISCUZ')) {
 exit('Access Denied');
}

class plugin_amufqs {

}

class plugin_amufqs_forum extends plugin_amufqs {
 function viewthread_amufqs_output(){
 global $_G,$postlist;
 $wxfid = unserialize($_G['cache']['plugin']['amufqs']['wxfid']);
 if(!$_G['uid']){
 if($_G['cache']['plugin']['amufqs']['rd']==1 &amp;&amp;(!in_array($_G['fid'],$wxfid)||!$_G['uid'])){
 foreach($postlist as $id =&gt; $postvalue){
 $message=$postvalue['message'];
 if($postvalue['first']==1){$ah=$_G['cache']['plugin']['amufqs']['zlgd'];}else{$ah=$_G['cache']['plugin']['amufqs']['otgd'];}
 if($postvalue['first']&lt;&gt;1 &amp;&amp; $_G['cache']['plugin']['amufqs']['otgd']==-1){$messageot=$message;}
 $message='&lt;div style="height:'.$ah.'px; overflow:hidden;"&gt;'.$message.'&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;em&gt;訪客無法觀看完整內容,請：&lt;a
onclick="showWindow(\'login\', this.href);hideWindow(\'register\');" href="member.php?mod=logging&amp;action=login"&gt;登錄&lt;/a&gt; 沒有帳號？&lt;a onclick="showWindow(\'register\', this.href);hideWindow(\'login\');" href="member.php?mod=register"&gt;'.$_G['setting']["reglinkname"].'&lt;/a&gt;&lt;/em&gt;&lt;/div&gt;';
 $postlist[$id]['message']=$message;
 if($postvalue['first']&lt;&gt;1 &amp;&amp; $_G['cache']['plugin']['amufqs']['otgd']==-1){$postlist[$id]['message']=$messageot;}
 }
 }
 }
 }

}</pre><p>結尾不加上 ?&gt; 似乎是某種新習慣，我不太瞭解就是了……<br /> 除了一貫的檢查是否在Discuz中運行外，緊接著的就是「物件」的概念。<br /> 不過充其量，也就只是建立物件，然後給Discuz調用。</p><p>因為是針對討論區的部份，所以物件建立完畢後，就放著（望<br /> 緊接著建立繼承父物件的子物件（加上_forum對論壇）</p><p>因為插件是限制「訪客無法觀看完整文章」所以就出現所謂的 viewthread_amufqs_output 函式。<br /> 函式影響Discuz的相關資訊可以參考開發手冊，上面有內定義的列表。<br /> 加上 _output 是在輸出前處理，這點算是程式開發的好習慣運用吧！<br /> *一般寫網站用程式，為了版面和運算分離，會有運算區和輸出區。這點在Discuz就是很明顯的例子 *include temple(&#8216;xxx&#8217;) 這類語法</p><p>中間的運算過程就不用討論了……<br /> 其實這樣看來，原本需要去修改 viewthread.php 才能做到的事情，現在只需要一個PHP檔案就完成。<br /> 在開發者的角度來看，可以說是「方便」至少不用做教學說明和修改多個檔案了！<br /> 而在使用者的角度來看，可以說是「簡單」畢竟除開發者造成的Bug之外，安裝上不會出錯。</p><p>雖然 Discuz 7.2 / X 還有一部分插件需要手動修改，原因我也不清處。<br /> 不過可以確定自從 7.2 的 NC 開始被運用後，開發插件容易很多。</p><p>尤其是許多「修改版模」的零碎處理。<br /> 在這方面，原本看到眼花的程式碼，用程式就能解決，是非常「使人愉悅」<br /> 畢竟很多麻煩都沒了！而且NC在許多功能也有輔助到開發者，可以說是「輕鬆愉快」<br /> 而之前在Discuz 的 APP 網站上看到 Discuz X 還能直接新增後台選單。<br /> 看到這點，讓我感受到Discuz對開發者的友善。<br /> （在7.2的時候我還得自己去修改後台選單呢！）</p><p>不過多用戶Discuz是否會因為DiscuzX而隱沒呢？<br /> 這點我就不得而知了！<br /> 畢竟類CMS論壇提供多用戶版本，消耗的資源挺可觀的，開發的難度也相對升高。<br /> 也許有時間我會去研究個「DiscuzX多用戶論壇獨立版」指針對論壇部份開發呢！<br /> （當然，那是我考上大學之後的事情了……）</p><p>NC的改變對我影響很大，因為讓我更加的自由開發。<br /> （比起phpBB我倒是很喜歡Discuz這點）</p><div class="linkwithin_hook" id="http://blog.frost.tw/code/poston-2010-06-08/postid-536"></div>]]></content:encoded> <wfw:commentRss>http://blog.frost.tw/code/poston-2010-06-08/postid-536/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>理解物件導向更多</title><link>http://blog.frost.tw/life/poston-2010-05-06/postid-525</link> <comments>http://blog.frost.tw/life/poston-2010-05-06/postid-525#comments</comments> <pubDate>Thu, 06 May 2010 10:52:08 +0000</pubDate> <dc:creator>蒼時弦也</dc:creator> <category><![CDATA[生活雜記]]></category> <category><![CDATA[ActionScript]]></category> <category><![CDATA[Java]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[生活]]></category> <category><![CDATA[程式]]></category><guid isPermaLink="false">http://blog.frost.tw/?p=525</guid> <description><![CDATA[學程式中，物件這東西算是精華的一部分吧！ 雖然還有演算法等等技巧，不過許多語言都是物件導向語言。 如最近學的ActionScript 3.0 和我有興趣學習的 Java都是。 不過，前幾個月學習 Java 時，其實沒有很懂物件導向。 這次藉由 Action Script 3.0 的學習，我對物件導向其實更瞭解了！ 當初使用 PHP 時，所用的物件其實和 Java 等不太相同。 我想是因為...]]></description> <content:encoded><![CDATA[<p>學程式中，物件這東西算是精華的一部分吧！<br /> 雖然還有演算法等等技巧，不過許多語言都是物件導向語言。<br /> 如最近學的ActionScript 3.0 和我有興趣學習的 Java都是。<br /> 不過，前幾個月學習 Java 時，其實沒有很懂物件導向。<br /> <span id="more-525"></span><br /> 這次藉由 Action Script 3.0 的學習，我對物件導向其實更瞭解了！<br /> 當初使用 PHP 時，所用的物件其實和 Java 等不太相同。</p><p>我想是因為 PHP 大多用於開發網站，而 AS3, Java 用於開發應用軟體的關係。<br /> 也因此，想要深入瞭解物件，其實也要花費挺大的功夫。<br /> 在整本書中，我想我是在物件導向這方面花費較大的心思。</p><p>當我閱讀 Java 的教學時，其實沒有很清楚把繼承等觀念搞懂。<br /> （其實那一系列教學的作者真的很厲害，可惜範例有點少，得靠自己思考。）</p><p>不過 AS3 的這本書，則就不同了！<br /> 各種情況都予以假設，因此能夠很輕鬆的把「可用和不可用」等問題釐清。<br /> 而作者也是善用「比喻」的類型，和我的程式概念建構比較接近。<br /> （我對學電腦的人都會建議選擇「自己能理解」的書，而非「好書」因為每個人理解的方式不一樣。）</p><p>經過這次 ActionScript 3.0 的學習，我想往後的 ThinkQuest 比賽會更順利些。<br /> （和朋友希望參加 Application Developement 的項目，因此需要應用軟體開發能力。）</p><p>而對於 Java, JavaScript, Flash 等的學習都會有更多的效益。</p><p>*總覺得，自己學東西的感覺比考試好很多呢～～</p><div class="linkwithin_hook" id="http://blog.frost.tw/life/poston-2010-05-06/postid-525"></div>]]></content:encoded> <wfw:commentRss>http://blog.frost.tw/life/poston-2010-05-06/postid-525/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Discuz! X 測試版發布日</title><link>http://blog.frost.tw/life/poston-2010-03-28/postid-465</link> <comments>http://blog.frost.tw/life/poston-2010-03-28/postid-465#comments</comments> <pubDate>Sun, 28 Mar 2010 10:36:43 +0000</pubDate> <dc:creator>蒼時弦也</dc:creator> <category><![CDATA[生活雜記]]></category> <category><![CDATA[Discuz]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[網站]]></category><guid isPermaLink="false">http://blog.frost.tw/?p=465</guid> <description><![CDATA[今天在網路上閒晃，突然想要看看 7DPS 是否有新的技術文章。 打開來之後，就馬上看到 Discuz! X 的提示。 「點進去一看，天阿！今天是測試版發布日呢！」 這下可不得了了！ 我正開發的 Discuz 7.2 插件還沒完成呢！ 於是，計畫馬上改變，全力投入 Discuz! X 行列。 可惜，官方一直不肯公佈下載點。 有人推測 6...]]></description> <content:encoded><![CDATA[<p>今天在網路上閒晃，突然想要看看 7DPS 是否有新的技術文章。<br /> 打開來之後，就馬上看到 Discuz! X 的提示。<br /> 「點進去一看，天阿！今天是測試版發布日呢！」<br /> <span id="more-465"></span><br /> 這下可不得了了！<br /> 我正開發的 Discuz 7.2 插件還沒完成呢！</p><p>於是，計畫馬上改變，全力投入 Discuz! X 行列。<br /> 可惜，官方一直不肯公佈下載點。</p><p>有人推測 6 點，有人說今天不發布了！<br /> 不過，我是相信官方的誠信，畢竟人家是間「公司」<br /> 不過，和我推測的 5 點左右，已經開始有落差了！</p><p>不過我現在認為，大約7點後就會發布。<br /> 不過，到底Discuz! X 有多肥呢？<br /> 這就讓我很好奇，畢竟上傳個Discuz得花很多時間阿！</p><p>不過，比起這些還是「有可以下載」最重要了！</p><p>希望 NC 會有對 X 的文件，不然我想開發更多可就頭痛了！<br /> （說真的，這次Discuz! X 的預設風格很好看呢！）</p><div class="linkwithin_hook" id="http://blog.frost.tw/life/poston-2010-03-28/postid-465"></div>]]></content:encoded> <wfw:commentRss>http://blog.frost.tw/life/poston-2010-03-28/postid-465/feed</wfw:commentRss> <slash:comments>7</slash:comments> </item> <item><title>Discuz 7.2 插件開發筆記 &#8211; 技能系統(1)</title><link>http://blog.frost.tw/web-project/poston-2010-03-22/postid-458</link> <comments>http://blog.frost.tw/web-project/poston-2010-03-22/postid-458#comments</comments> <pubDate>Mon, 22 Mar 2010 10:47:06 +0000</pubDate> <dc:creator>蒼時弦也</dc:creator> <category><![CDATA[網站專案]]></category> <category><![CDATA[AJAX]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[網站]]></category><guid isPermaLink="false">http://blog.frost.tw/?p=458</guid> <description><![CDATA[最近在開發論壇插件，說真的，這個系統挺有意義的。 一般人會認為這是「娛樂插件」不過，錯了！！ 這是一個「能力指標」的插件喔！ 其實我的技能系統，並非「遊戲娛樂」的使用。 技能，如果在現實世界中，可以說是「會使用的技巧與擁有的能力」 那麼，我的技能系統就是用來「紀錄」的系統。 不過，仰賴 7.2 的強大插件擴充，讓我開發上非常順手。 目前系統共兩個資料檔案：「技能資訊」與「修煉資訊」 會這樣做其實很簡單，因為要避免「隨意的升級」 每項技能想要升級，就得通過「修煉選項」的達成，才可以進行升級。 整體來看，可以說是不錯的系統了！ 下面就簡單分享使用到的「技巧」 不過說真的，有使用到的就只有 Discuz 上的 Ajax 控制屬於高難度。 我使用的是...]]></description> <content:encoded><![CDATA[<p>最近在開發論壇插件，說真的，這個系統挺有意義的。<br /> 一般人會認為這是「娛樂插件」不過，錯了！！<br /> 這是一個「能力指標」的插件喔！<br /> <span id="more-458"></span><br /> 其實我的技能系統，並非「遊戲娛樂」的使用。</p><p>技能，如果在現實世界中，可以說是「會使用的技巧與擁有的能力」<br /> 那麼，我的技能系統就是用來「紀錄」的系統。</p><p>不過，仰賴 7.2 的強大插件擴充，讓我開發上非常順手。</p><p>目前系統共兩個資料檔案：「技能資訊」與「修煉資訊」<br /> 會這樣做其實很簡單，因為要避免「隨意的升級」</p><p>每項技能想要升級，就得通過「修煉選項」的達成，才可以進行升級。<br /> 整體來看，可以說是不錯的系統了！</p><p>下面就簡單分享使用到的「技巧」<br /> 不過說真的，有使用到的就只有 Discuz 上的 Ajax 控制屬於高難度。</p><p>我使用的是 Ajax 視窗，因此用 showWindow() 的 JavaScript函式呼叫。</p><pre class="brush: html">&lt;a href="plugin.php?id=dofskill:upskill&amp;skillid=$key" onclick="javascript:showWindow('upskill', this.href);return false;" title="升級技能"&gt;升級技能！&lt;/a&gt;</pre><p>整體上為模仿 Discuz 的作法，而 showWindow 的參數共四個：<br /> 1. id 名稱(方便控制)<br /> 2. 目標位子<br /> 3. 傳遞資料方式，預設get (post用法我其實不會)<br /> 4. 是否緩存預設似乎是開啟的</p><p>而目標位子的頁面，就很講究了！<br /> Discuz 設計成「直接讀取正常版模」的設計。</p><p>所以設計版模時，要照常加入 {template header} 與 {template footer}<br /> 否則，就會看空白畫面！</p><p>其餘大多是使用 PHP 達成的控制，其實也沒有什麼特別。</p><p>說實在的，其實技能系統只是一個基礎系統，實際上沒有太大的意義。</p><div class="linkwithin_hook" id="http://blog.frost.tw/web-project/poston-2010-03-22/postid-458"></div>]]></content:encoded> <wfw:commentRss>http://blog.frost.tw/web-project/poston-2010-03-22/postid-458/feed</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Discuz7.2 NC插件新核感想</title><link>http://blog.frost.tw/life/poston-2010-03-20/postid-455</link> <comments>http://blog.frost.tw/life/poston-2010-03-20/postid-455#comments</comments> <pubDate>Sat, 20 Mar 2010 11:44:52 +0000</pubDate> <dc:creator>蒼時弦也</dc:creator> <category><![CDATA[生活雜記]]></category> <category><![CDATA[Discuz]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[網站]]></category><guid isPermaLink="false">http://blog.frost.tw/?p=455</guid> <description><![CDATA[自上次事件後，我就決定出來自己架設網站。 不過，自己的網站要有什麼特色呢？ 這就是一個問題啦！ 隨著 Discuz! X 的發布，我便決定使用 Discuz 做為往後的系統。 而這幾天主要在注意的就是特殊主題、頁面插入兩項。 首先是特殊主題，這部份有點「妙」 首先，在 class 檔的格式似乎有要求，前面幾次因為我沒依照格式而發生錯誤。 接著，當我成功撰寫後，卻遲遲無法使用。 光是這點就讓我殘念到死了…… 不過後來還是成功的在「版塊」設定打開了，但是仍然沒有反應。 最後，竟然是「用戶組」沒有設定，這點可是一個大大的盲點。 不過，最後還是成功的使用了特殊主題！ 接著，今天我又繼續研究頁面插入。...]]></description> <content:encoded><![CDATA[<p>自上次事件後，我就決定出來自己架設網站。<br /> 不過，自己的網站要有什麼特色呢？<br /> 這就是一個問題啦！<br /> 隨著 Discuz! X 的發布，我便決定使用 Discuz 做為往後的系統。<br /> <span id="more-455"></span><br /> 而這幾天主要在注意的就是特殊主題、頁面插入兩項。</p><p>首先是特殊主題，這部份有點「妙」<br /> 首先，在 class 檔的格式似乎有要求，前面幾次因為我沒依照格式而發生錯誤。</p><p>接著，當我成功撰寫後，卻遲遲無法使用。<br /> 光是這點就讓我殘念到死了……</p><p>不過後來還是成功的在「版塊」設定打開了，但是仍然沒有反應。<br /> 最後，竟然是「用戶組」沒有設定，這點可是一個大大的盲點。</p><p>不過，最後還是成功的使用了特殊主題！</p><p>接著，今天我又繼續研究頁面插入。<br /> 除了預定的點之外，其他的插入方法其實非常妙。</p><p>其他想在不存在的點插入，竟然是「把變數加東西進去」<br /> 這部份真的很妙，許多的變更都是這樣改出來的！</p><p>不過也有缺點，因為要配合預設的方式去更動。</p><p>不過到最後我卻發現，原來一個插件最多兩個 class 檔案。<br /> 一個是一般的插件，另一個是特殊主題。</p><p>原因，簡單到讓人會忽略。<br /> 因為「插件唯一識別」只有一個！</p><p>不過整體而言，新核真的超棒、超好用。<br /> （尤其是避免使用者改錯，還有開發完畢後上傳不需要重改等等。）</p><p>大家也試試看吧！<br /> 雖然一開始可能會抓不到，不過挺好上手的！</p><div class="linkwithin_hook" id="http://blog.frost.tw/life/poston-2010-03-20/postid-455"></div>]]></content:encoded> <wfw:commentRss>http://blog.frost.tw/life/poston-2010-03-20/postid-455/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>DIY一個PHP留言板之讀取解析</title><link>http://blog.frost.tw/web-project/poston-2010-03-12/postid-446</link> <comments>http://blog.frost.tw/web-project/poston-2010-03-12/postid-446#comments</comments> <pubDate>Fri, 12 Mar 2010 11:08:55 +0000</pubDate> <dc:creator>蒼時弦也</dc:creator> <category><![CDATA[網站專案]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[專案]]></category> <category><![CDATA[程式]]></category><guid isPermaLink="false">http://blog.frost.tw/?p=446</guid> <description><![CDATA[經過前幾次的「教學」 其實我也發現，直接提供程式碼和註解對新手實在不利。 因此本篇文章會解析讀取的技巧。 首先，是 glob() 函式的使用。 $paths = glob("./data/*.txt"); //讀取留言路徑 glob是一個依照「路徑」讀取檔案的函式，這點大家一定都很清楚。 不過卻可以使用 * 字元，把所有路徑都讀取。 如 data 目錄下有 a.txt , b.txt,...]]></description> <content:encoded><![CDATA[<p>經過前幾次的「教學」<br /> 其實我也發現，直接提供程式碼和註解對新手實在不利。<br /> 因此本篇文章會解析讀取的技巧。<br /> <span id="more-446"></span><br /> 首先，是 glob() 函式的使用。</p><pre class="brush: php">
$paths = glob("./data/*.txt"); //讀取留言路徑
</pre><p>glob是一個依照「路徑」讀取檔案的函式，這點大家一定都很清楚。<br /> 不過卻可以使用 * 字元，把所有路徑都讀取。<br /> 如 data 目錄下有 a.txt , b.txt, c.dat 3個檔案，在上述的情況下，會將 a.txt 與 b.txt 的路徑存入陣列。</p><p>而留言需要排序，因此使用 sort() 函式。</p><pre class="brush: php">
sort($paths, SORT_NUMERIC); //將路徑以數值排序
</pre><p>通過 sort 排序陣列，如果鎮列原本是混亂的，那麼會被排列整齊，並且依照規則。<br /> 如：依照字母、數字大小等等<br /> SORT_NUMERIC 則是「將值以數字排序」<br /> 當然，也可以利用「自訂排列規則」的方式進行排列。</p><p>接著我們需要能夠讀取檔案。</p><pre class="brush: php">
$contents = file_get_contents('./data/comments.txt'); //讀取 ./data/comments.txt 的內容
</pre><p>file_get_contents() 是 PHP4 新增的函式，我想市面上應該沒有 PHP3 的主機。<br /> 如果不確定版本，可以使用 phpinfo() 來檢查。</p><p>這個函式原理很簡單，把路徑的檔案內容一次不漏的讀取，並且放進變數。</p><p>不過我們的留言是特殊的規則：</p><pre class="brush: html">
;subject
留言標題
;nickname
暱稱
;contents
留言
換行
</pre><p>因此需要使用迴圈搭配，來找出各數值的內容。<br /> *其實也可以用preg_match之類的方式把數值抓出，使用迴圈慢慢讀取是為了「可擴充欄位」</p><pre class="brush: php">
$contents = file_get_contents('./data/comments.txt'); //讀取
$contents = explode(PHP_EOL, $contents); //用換行字元分割 *Linux以 \n 換行， Windows 以 \r\n 換行
foreach($contents as $line){ //foreach 是把陣列值一一讀取
  if(!$line) continue;
  if($line[0] == ';'){
    $dKey = substr(1, $line);
    continue;
  }
  if(!$dKey) continue;
  if($dkey == 'contents')
    $data[$dkey][] = $line;
  else
    $data[$dkey] .= $line;
}
</pre><p>exoplde() 函式會依照指定的字元、字串，將字串切割。<br /> 如：a|b|c 以 | 為切割字元，則傳回 Array( [0] => a [1] => b [2] => c )</p><p>接著在迴圈中，做非常多的判斷。<br /> Ex. if(!$line) continue;<br /> ! 為相反字元，當變數有值時也相當於 boolen 的 true, 因此 false 反轉就是 true<br /> 而執行 continue; 結束本次迴圈。<br /> 這類用法也有 break; 結束迴圈，可以在某條件下停止。</p><p>substr() 則是擷取字串，如 abcdef 使用 substr(2, &#8216;abcdef&#8217;) 則傳回 cdef<br /> 這點原理何在呢？</p><p>程式中，字串其實是由 char[] 陣列組成，因此 $line[0] 即是 $line 字串的第一個字元。<br /> 而 substr 就是把字串從指定的陣列key開始讀取到最後一個。</p><p>經過這些步驟之後，終於完成了「讀取」的效果。<br /> 傳回的 $data 可以讀到檔案中各種資料。</p><p>不過仍有一個小 bug 會發生，在正式的實作時，這個會直接修正掉。<br /> ( 在這之前，檢查看看讀取的判斷式，哪裡出現矛盾，資料中含有什麼會發生問題。 )</p><div class="linkwithin_hook" id="http://blog.frost.tw/web-project/poston-2010-03-12/postid-446"></div>]]></content:encoded> <wfw:commentRss>http://blog.frost.tw/web-project/poston-2010-03-12/postid-446/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>新的作品完成！</title><link>http://blog.frost.tw/life/poston-2010-03-11/postid-445</link> <comments>http://blog.frost.tw/life/poston-2010-03-11/postid-445#comments</comments> <pubDate>Thu, 11 Mar 2010 11:16:51 +0000</pubDate> <dc:creator>蒼時弦也</dc:creator> <category><![CDATA[生活雜記]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[專案]]></category> <category><![CDATA[程式]]></category><guid isPermaLink="false">http://blog.frost.tw/?p=445</guid> <description><![CDATA[其實這樣斷斷續續做下來，大致上花了一星期。 不過整個開發時間卻集中在上周日的一整天，相較過去，開發速度快上很多。 不過，我想這個系統大概沒什麼人有興趣吧！ 這款其實是開發來給我放置教學用的系統，因此構造非常簡單。 不過也不算是小型的系統，算是一種輕巧的網頁產生器。 主要特色： 1. 版模系統 &#8211; 更換容易 2. BBCode + Wiki &#8211; 方便的撰寫結構 3. 簡易快取 &#8211; 減少多次分析版模的次數，加快運作...]]></description> <content:encoded><![CDATA[<p>其實這樣斷斷續續做下來，大致上花了一星期。<br /> 不過整個開發時間卻集中在上周日的一整天，相較過去，開發速度快上很多。<br /> 不過，我想這個系統大概沒什麼人有興趣吧！<br /> <span id="more-445"></span><br /> 這款其實是開發來給我放置教學用的系統，因此構造非常簡單。<br /> 不過也不算是小型的系統，算是一種輕巧的網頁產生器。</p><p>主要特色：<br /> 1. 版模系統 &#8211; 更換容易<br /> 2. BBCode + Wiki &#8211; 方便的撰寫結構<br /> 3. 簡易快取 &#8211; 減少多次分析版模的次數，加快運作<br /> 4. 中文支援 &#8211; 從 MediaWiki 學來的方法，其實挺不錯的！<br /> 5. 簡潔的畫面 &#8211; 其實我很不擅長做複雜的東西，所以畫面非常簡單。<br /> 6. 簡易管理功能 &#8211; 其實修改設定檔還挺累的，所以就做了簡易的更改頁。</p><p>不過，很多人看到這款，都會有疑問「要做什麼用？」</p><p>說真的，用途就是「快速產生網頁」<br /> 沒什麼特別的意義，唯一的優點就是「產生網頁」</p><p>從一個空白的檔案寫出一個網頁，並且設置連結、目標，有點稍嫌麻煩。<br /> 不過使用這個系統，只需要把創作的頁面位子輸入，並且編輯即可完成畫面。<br /> 不過目前功能過於簡單，還無法提供大量使用。</p><p>整款系統參考很多 MediaWiki 和 Discuz 的技巧，也許很多人會感到親切吧！<br /> 另外還有幾項缺陷，打算下次更新時改進。<br /> 第一個是 Index (索引) 和 Page (頁面) 還未有區分，因為我還想不出來如何索引資料比較好。<br /> 另外則是我希望像 MediaWiki 設計一個輸入 [分類:PHP] 而打開 分類:PHP 就會開到其下檔案的功能。<br /> 不過目前也無方向製作，希望有一天能夠完成。</p><p>看這自己進步，算是有點成就感吧！<br /> 今天在看書的時候，看到一句話：「放慢腳步，好好思考。」<br /> 其實，我很多時候真的走太快，但是我很慶幸我最後會停下思考。</p><div class="linkwithin_hook" id="http://blog.frost.tw/life/poston-2010-03-11/postid-445"></div>]]></content:encoded> <wfw:commentRss>http://blog.frost.tw/life/poston-2010-03-11/postid-445/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>DIY一個PHP留言板之反思(一)</title><link>http://blog.frost.tw/web-project/poston-2010-03-10/postid-444</link> <comments>http://blog.frost.tw/web-project/poston-2010-03-10/postid-444#comments</comments> <pubDate>Wed, 10 Mar 2010 11:01:16 +0000</pubDate> <dc:creator>蒼時弦也</dc:creator> <category><![CDATA[網站專案]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[專案]]></category> <category><![CDATA[網站]]></category><guid isPermaLink="false">http://blog.frost.tw/?p=444</guid> <description><![CDATA[經過一斷時間的思考之後，多多少少會發現先前的系統有問題。 在許多情況之下，一開始的設計並不是很好。 在經過幾次開發之後，其實開始發現有些不切實際的製作和多餘的動作。 首先，先把原本預定的功能找出來： 1. 版模 2. 仿HTML標籤 3. 可覆蓋 4. BBcode 等等…… 但是現在反思，「這個留言板要給誰用？讓誰學會呢？」 一開始我的目標是針對「新手」 那麼這些功能是否太困難了？ 「是的，真的太困難！」 那個改進方向呢？ 「針對『製作留言板』來進行重點教學」 結論：...]]></description> <content:encoded><![CDATA[<p>經過一斷時間的思考之後，多多少少會發現先前的系統有問題。<br /> 在許多情況之下，一開始的設計並不是很好。<br /> 在經過幾次開發之後，其實開始發現有些不切實際的製作和多餘的動作。<br /> <span id="more-444"></span><br /> 首先，先把原本預定的功能找出來：<br /> 1. 版模<br /> 2. 仿HTML標籤<br /> 3. 可覆蓋<br /> 4. BBcode<br /> 等等……</p><p>但是現在反思，「這個留言板要給誰用？讓誰學會呢？」</p><p>一開始我的目標是針對「新手」<br /> 那麼這些功能是否太困難了？<br /> 「是的，真的太困難！」</p><p>那個改進方向呢？<br /> 「針對『製作留言板』來進行重點教學」</p><p>結論：<br /> 1. 留言、回覆留言<br /> 2. BBCode ( 基於安全性，這點要重點教學 )<br /> 3. 管理功能 ( 就算再討厭，還是得做 )</p><p>下次的教學會和大家分享留在「資料存取(一)提到的讀取技巧，並且加以改善」</p><div class="linkwithin_hook" id="http://blog.frost.tw/web-project/poston-2010-03-10/postid-444"></div>]]></content:encoded> <wfw:commentRss>http://blog.frost.tw/web-project/poston-2010-03-10/postid-444/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>DIY一個PHP留言板之資料存取(四)</title><link>http://blog.frost.tw/web-project/poston-2010-03-08/postid-441</link> <comments>http://blog.frost.tw/web-project/poston-2010-03-08/postid-441#comments</comments> <pubDate>Mon, 08 Mar 2010 10:59:35 +0000</pubDate> <dc:creator>蒼時弦也</dc:creator> <category><![CDATA[網站專案]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[專案]]></category> <category><![CDATA[程式]]></category><guid isPermaLink="false">http://blog.frost.tw/?p=441</guid> <description><![CDATA[呼呼~ 接下來是製作刪除檔案的處理，其實這方面只是把之前讀取留言的功能改良而已。 除了改成只「讀主題」和「加入刪除函式」之外，就沒有其他的處理。 首先，在目錄下建立一個 remove.php 的檔案，並且撰寫程式碼(如下) &#60;?php function removeComment(array $paths){ //建立移除函式 foreach($paths as $path){ //將路徑陣列一個一個讀取 if(!is_file($path)) continue; //如果不是檔案則切到下一個繼續 unlink($path); //刪除檔案...]]></description> <content:encoded><![CDATA[<p>呼呼~<br /> 接下來是製作刪除檔案的處理，其實這方面只是把之前讀取留言的功能改良而已。<br /> 除了改成只「讀主題」和「加入刪除函式」之外，就沒有其他的處理。<br /> <span id="more-441"></span><br /> 首先，在目錄下建立一個 remove.php 的檔案，並且撰寫程式碼(如下)</p><pre class="brush: php">
&lt;?php

function removeComment(array $paths){ //建立移除函式
	foreach($paths as $path){ //將路徑陣列一個一個讀取
		if(!is_file($path)) continue; //如果不是檔案則切到下一個繼續
		unlink($path); //刪除檔案
		++$i;
	}
	return $i;
}

function getSubject($file){ //建立 getSubject 函式
	$data = file_get_contents($file); //讀取檔案內容
	$data = explode(PHP_EOL, $data); //以斷行分割檔案內容( PHP_EOL 會依照作業系統切換 \n 或 \r\n )

	foreach($data as $key => $line){ //將內容陣列放入 foreach 運作
		if($line == ';subject'){ //檢查是否為註解
			$logSubject = (bool) true; //啟動紀錄主旨
			continue; //直接結束本次迴圈
		}

		if(!$logSubject) continue; //如果非主旨則跳過，並且繼續尋找

		$subject = $line; //紀錄主旨
		break; //離開迴圈

	}

	return $subject; //傳回取得之主旨
}

if($_POST['submit']){ //檢查是否有送出表單
	$dels = removeComment($_POST['del']); //傳入移除陣列
	echo "
<div style=\"width:50%; margin:5px auto; border:1px solid #EEE; padding:5px; text-align:center;\">成功移除{$dels}筆留言</div>

";//產生表單(送出)
}

$glob = glob('./data/*.txt'); //搜尋資料檔案
sort($glob, SORT_NUMERIC); //排序檔案( 由大到小 )

$_GET['page'] = !$_GET['page'] ? 1 : $_GET['page'];  //檢查是否有指定頁碼
$start = ($_GET['page'] - 1) * 15; //設定迴圈開始編號
$end = $_GET['page'] * 15; //設定回圈結束編號

echo '
<form action="" method="post">'; //產生表單
for($i = $start; $i < $end; ++$i){ //從開始編號運作到結束編號。
	if(empty($glob[$i])) break; //檢查是否有此筆資料，無則跳出
	$subject = getSubject($glob[$i]); //呼叫 getSubject 函式取得主旨
	/* 開始產生畫面 */
	echo "
<div style=\"width:50%; margin:5px auto; border:1px solid #EEE; padding:5px;\">主題: {$subject} -
<input type=\"checkbox\" value=\"{$glob[$i]}\" name=\"del[]\" /></div>

";

}
echo '
<div style="width:50%; margin:5px auto; border:1px solid #EEE; padding:5px; text-align:center;">
<input type="submit" name="submit" value="刪除選取" /></div>

';//產生表單(送出)
echo '</form>

';//產生表單

?&gt;
</pre><p>上方的 HTML 部份可能會有問題，請各位在使用時稍微注意。</p><p>原理大致解說：</p><p>顯示部份和 comment.php 無異，只是將讀取部份改為「只讀取標題」<br /> 並且為了防止意外，只在「確認為標題時」才會做儲存。</p><p>而另外就是加入了「刪除函式」<br /> 構造很簡單，將傳入的陣列依序使用 unlink 刪除檔案函式刪除。</p><p>而 name="del[]" 為表單的陣列用法，在 PHP 收到為 $_POST['del'] 的陣列(method="post" 狀況)<br /> 每個 checkbox 儲存的 value 都是該筆留言路徑，因此刪除時只需將取得的路徑陣列傳入。</p><p>&#8212;</p><p>到了這部份，其實已經準備好製作留言板的技術。<br /> 明天，即將開始的就是「正式製作」</p><p>不過到了這個部份，其實整個架構是很混亂的。<br /> 因此明天要先做「重新規劃、整理」的處理，以免成品過度混亂。</p><div class="linkwithin_hook" id="http://blog.frost.tw/web-project/poston-2010-03-08/postid-441"></div>]]></content:encoded> <wfw:commentRss>http://blog.frost.tw/web-project/poston-2010-03-08/postid-441/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> </channel> </rss>