2011年12月28日 星期三

2011年11月22日 星期二

HTTP 狀態碼 301跟HTTP 狀態碼 404

相關參考:

301轉址
http://www.yes-seo.tw/2011/04/html-301-redirect/
http://www.webconfs.com/how-to-redirect-a-webpage.php
http://www.wulongjun.org/301-redirect
http://www.dannytalk.com/redirecting-in-plesk/
http://www.seowhy.com/24_24_zh.html

Response.Status
http://www.lao8.org/html/8/2010-7-10/Response.Status/

HTTP狀態碼
http://blog.miniasp.com/post/2009/01/16/Web-developer-should-know-about-HTTP-Status-Code.aspx

2011年11月9日 星期三

Ajax參考資料

網站位址:

https://developer.mozilla.org/zh_tw/AJAX

[AJAX]檢查帳號是否重複

參考來源:http://eoffice.im.fju.edu.tw/phpbb/viewtopic.php?t=2633

JavaScript :


<script type="text/javascript">
      var xmlHttp;
      var proc;
      
      //程式由此執行
        function chkAccount() {
         proc = document.getElementById("imgproc");
         proc.style.visibility = 'visible';//顯示處理中的圖片
            createXMLHttpRequest();//建立XMLHttpRequest物件
            var myId = document.getElementById("txtAccount").value;
            var url = "ValiAccount.aspx?myId=" + myId;
           
            xmlHttp.onreadystatechange = callback; //資料回傳之後,使用callback這個函數處理後續動作
            xmlHttp.open("POST", url, true);//將輸入的帳號傳至後端作驗證
            xmlHttp.send(null);
        }
        //xmlHttp.open(a,b,c)
        //第一個參數是 HTTP request 的方法,也就是從 GET、POST、HEAD 中選一個使用,都要大寫
        //第二個參數是要呼叫的url,不過只能呼叫同一個網域的網頁
      //第三個參數決定此 request 是否不同步進行
      //如果設定為true則即使後端尚未傳回資料也會繼續執行後面的程式
      //如果設定為false則必須等後端傳回資料才會繼續執行後面的程式
      
      
   //此函式在建立XMLHttpRequest物件
        function createXMLHttpRequest() {
            if (window.ActiveXObject) {//IE
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            else if (window.XMLHttpRequest) {//other browser
                xmlHttp = new XMLHttpRequest();               
            }
        }

        function callback() {
            if (xmlHttp.readyState == 4) {
                if (xmlHttp.status == 200) {
               var xmldoc = xmlHttp.responseXML;//接收後端程式傳回來的xml
                    var mes = xmldoc.getElementsByTagName("message")[0].firstChild.data;//將Tag 為message的值抓出來
                    var val = xmldoc.getElementsByTagName("passed")[0].firstChild.data;//將Tag 為passed的值抓出來
                    setMessage(mes, val);
                }
            }
        }
        //xmlHttp.readyState 所有可能的值: 0 (還沒開始), 1 (讀取中), 2 (已讀取), 3 (資訊交換中), 4 (一切完成)
      //xmlHttp.status = 200 (一切正常), status = 404 (查無此頁), status =500 (內部錯誤)      
       
        function setMessage(message, isValid) {           
            var messageArea = document.getElementById("divAccount");
            var fontColor = "red";
 
            if (isValid == "true" || isValid == "True") {
                fontColor = "green";               
            }
            proc.style.visibility = 'hidden';//隱藏處理中的圖片
            messageArea.innerHTML = "<font color=" + fontColor + ">" + message + " </font>";//顯示是否有重複的帳號
        }
</script>



觸發事件的input及顯示message的div及圖片 :
<input  id="txtAccount" onChange="chkAccount();"><IMG id="imgproc" style="VISIBILITY: hidden; CURSOR: wait" src="checking.gif">
<div id="divAccount"></div>



後端處理程式
ValiAccount.aspx.cs 

 private void Page_Load(object sender, System.EventArgs e)
      {
         Response.ContentType="text/xml";
         Response.AddHeader("Cache-Control", "no-cache");
         Response.Write("<response>");

         
         bool uFlag=false;
         string message="";
         if(Request["myId"]!=null)
         {
            string myId=Request["myId"].ToString();
            if(myId=="paddy")
            {
               message="帳號無人使用";
               uFlag=true;
            }
            else
            {
               message="帳號重覆";
            }

         }
         else
         {
            message="參數錯誤";
         }
         Response.Write("<passed>" + uFlag.ToString() + "</passed>");
         Response.Write("<message>" + message + "</message>");
         Response.Write("</response>");
         Response.End();

      }



回傳的XML如下:
<response>
   <passed>False</passed>
   <message>帳號重覆</message>
</response> 


2011年10月20日 星期四

JavaScript Note

Javascript的參考資料:
http://irw.ncut.edu.tw/peterju/jscript.html

2011年10月19日 星期三

php 傳送POST到別的URL並取得回應內容 使用fsockopen

資料來源:http://blog.hsin.tw/2009/php-post-method-fsockopen/


//接收POST參數的URL
//POST參數,在這個陣列裡,索引是name,值是value,沒有限定組數
$postdata = array('post_name'=>'post_value','acc'=>'hsin','nick'=>'joe');
//函式回覆的值就是取得的內容
$result = sendpost($url,$postdata);
function sendpost($url, $data){
//先解析url 取得的資訊可以看看http://www.php.net/parse_url
$url = parse_url($url);
$url_port = $url['port']==''?(($url['scheme']=='https')?443:80):$url['port'];
if(!$url) return "couldn't parse url";
//對要傳送的POST參數作處理
$encoded = "";
while(list($k,$v)=each($data)){
  $encoded .= ($encoded?'&':'');
  $encoded .= rawurlencode($k)."=".rawurlencode($v);
}
//開啟一個socket
$fp = fsockopen($url['host'],$url_port);
if(!$fp) return "Failed to open socket to ".$url['host'];
//header的資訊
fputs($fp,'POST '.$url['path'].($url['query']?'?'.$url['query']:'')." HTTP/1.0rn");
fputs($fp,"Host: ".$url['host']."n");
fputs($fp,"Content-type: application/x-www-form-urlencodedn");
fputs($fp,"Content-length: ".strlen($encoded)."n");
fputs($fp,"Connection: closenn");
fputs($fp,$encoded."n");
//取得回應的內容
$line = fgets($fp,1024);
if(!eregi("^HTTP/1.. 200", $line)) return;
$results = "";
$inheader = 1;
while(!feof($fp)){
  $line = fgets($fp,2048);
  if($inheader&&($line == "n" || $line == "rn")){
    $inheader = 0;
  }elseif(!$inheader){
    $results .= $line;
  }
}
fclose($fp);
return $results;
}


相關參考:
http://wezfurlong.org/blog/2006/nov/http-post-from-php-without-curl/

PHP CURL 發送 GET 和 POST 語法

資料來源:http://fq-story.blogspot.com/2009/05/php-curl-get-post.html

PHP CURL

1、http的get傳送

$ch = curl_init("/") ;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ;
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true) ;
$output = curl_exec($ch) ;
$fh = fopen("out.html", 'w') ;
fwrite($fh, $output) ;
fclose($fh) ;

2、http的post傳送

EX1

$URL="www.mysite.com/test.php";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"https://$URL");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "Data1=blah&Data2=blah");curl_exec ($ch);
curl_close ($ch);


EX2

//extract data from the post
extract($_POST) ;
//set POST variables
$url = '/get-post.php' ;
$fields = array(
'lname'=>urlencode($last_name) ,
'fname'=>urlencode($first_name) ,
'title'=>urlencode($title) ,
'company'=>urlencode($institution) ,
'age'=>urlencode($age) ,
'email'=>urlencode($email) ,
'phone'=>urlencode($phone)
);
//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&' ; }
rtrim($fields_string ,'&') ;
//open connection
$ch = curl_init() ;
//set the url, number of POST vars, POST data
curl_setopt($ch, CURLOPT_URL,$url) ;
curl_setopt($ch, CURLOPT_POST,count($fields)) ;
curl_setopt($ch, CURLOPT_POSTFIELDS,$fields_string) ;
//execute post
$result = curl_exec($ch) ;
//close connection
curl_close($ch) ;

相關參考:
http://wezfurlong.org/blog/2006/nov/http-post-from-php-without-curl/
http://blog.roodo.com/esabear/archives/16358749.html

2011年9月27日 星期二

常用 Regular Expression 範例

資料來源:http://blog.longwin.com.tw/2009/09/paper-regular-expression-regex-2009/

常用的Regex幾乎都有,超讚的範例網站
http://www.virtuosimedia.com/dev/php/37-tested-php-perl-and-javascript-regular-expressions

2011年9月22日 星期四

Server Side Includes for HTML in IIS7

參考來源:http://tech.mikeal.com/blog1.php/server-side-includes-for-html-in-iis7

用HTML設定FB專頁時,在FB瀏覽此專頁IIS出現 HTTP 錯誤 405.0 - Method Not Allowed.
直接用瀏覽器開啟頁面位址的話又可正常瀏覽.
Google後.發現如下圖的設定就可以正常運作

2011年8月1日 星期一

怎麼防止不透過swf.直接傳值給php?

最近幾個幾個案子的狀況讓我思考這個問題~
在google上找到了一個詳細的知識分享.
資料來源:http://www.ptt.cc/bbs/Flash/M.1216140526.A.D4E.html
延伸閱讀:我不是教你詐:七個商業邏輯錯誤案件研究

內容如下:


: 了解到flash不能和伺服器的資料庫連結,只能透過asp或php之類的才能存入資料
: 所以小弟也就開始學習php..但是最近想到了一個問題..
: 假如我寫了一個swf,傳值給php,php再存入資料庫

事實上,你用 swf 呼叫 php,不用反組譯 swf 就可以知道你的 php 接收了甚麼參數。
swf 呼叫 php 的方式其實就和你的瀏覽器打上 php 的網址是一樣的。
(就算是用Post的,其實我也可以看到你Post了甚麼,然後用程式去模擬Post動作...)

: 那如果有心人士反組譯了我的swf,知道該傳什麼給php
: 那就有可能被以作弊的方式,達到他想要的目的(而不是照著我的規則走)

這裡有一個重點,作弊的方式,是甚麼方式?
又你想要保護的資料是甚麼?保護的對象是誰?是使用者還是Server?
而不單單是要怎麼保護 "我傳給php的值"...

提供一些解法:

1. 我要保護我 php?param= 後面的參數:
最直覺的,在Flash中用一組動態的Key加密後傳給php,再由php解密。
只是我覺得反正你那些值到後來也是要顯示在Flash裡面...何必那麼麻煩...
這只能防防小人,真正要防Hacker還是防不了...
(不過我想Hacker應該也沒啥興趣駭這種無聊的東西)

用 AS3 + Encryption 搜尋應該有一些東西參考,我個人是沒作過用AS3加密...


2. 我要保護我的Server不會被人用機器人攻擊。(例如討論版被瘋狂灌水)
例用 CAPTCHA (認證圖),由Server產生一張圖給Flash,
然後要使用者輸入圖上顯示的數字,確認是"人眼"看到圖才能繼續貼文的動作。

搜尋 php + CAPTCHA 應該有一些免費的解決方案可以用。


3. 我要防止User跳過某些步驟。
利用 Session 將資料寫在 Server 端。和寫網頁一樣,翻翻Php的Session那章吧~XD


4. 我要保護我的資料庫不會被 SQL Injection。
只要記住一點,所有User傳入Server的參數都一定要用Server端的程式(即Php)檢查!
例如,我輸入了電話,裡面不應該出現中文,或是長度太長(電話不可能大於20碼)。
資料存進資料庫之前要用 mysql_real_escape_string 跳脫字元一下...

這也和寫網頁程式的觀念一樣。搜尋 SQL Injection 有一大堆討論。


5. 我要保護資料傳遞過程不被竊聽。
使用 SSL (即https) 進行網頁的動作,但要注意的是,用SSL是防止在"傳輸過程"
不被第三者(即Server和用戶兩者"以外")竊聽,而不是資料到了Server和用戶的"面"
前還加密的(加密解不開是要怎麼看)。Flash可以接收https傳進去資料。

2011年7月26日 星期二

壓縮你的js和css

為了增快網頁的讀取速度,可考慮一些最佳化的手段,
其中一項就是讓js和css檔案的大小縮到最小.
有一些工具可以達到這個手套.但是要用command line可操作有點不方便.
有好心人把YUI的壓縮工具弄成了線上版.

線上版YUI壓縮JS及CSS工具:http://refresh-sf.com/yui/

Facebook 分享功能清楚快取的方法

Facebook的分享功能
http://www.facebook.com/sharer/sharer.php

如果再次分享同樣的網頁但內容有修改過的話,share.php會有快取.
如果要清掉快取可以使用Facebook提供的工具:
http://developers.facebook.com/tools/lint

參考連結:
http://achtung.webhop.net/allenj/?p=1218
http://milkmidi.blogspot.com/2009/12/facebook-share.html

2011年7月21日 星期四

放在 File Server 上的 Excel 檔開啟時會整個卡住的解決方法

資料來源:http://phorum.study-area.org/index.php?topic=65939.0

最近微軟的更新真的是搞死人了.之前是Powerpoint現在是Excel......

放在 File Server 上的 Excel 檔開啟時會整個卡住

發現是微軟在 6/28 發佈的安全性更新 Microsoft Office File Validation Add-in 的問題

移除方式是用開始→執行→MsiExec.exe /uninstall {90140000-2005-0000-0000-0000000FF1CE}

把這個安全性更新移除掉就可正常開啟Excel檔

2011年7月19日 星期二

網路投票活動防灌票的幾種參考作法

資料來源:http://www.sudu.cn/info/html/edu/20080325/275171.html

網上調查是快速收集信息的有效方法,但是目前部分網站的網上調查存在一個不足之處,即任何用戶根據自己的愛好可以連續反覆投票。因為所有的調查結果都是為 決策作參考,不管對一個單位還是一個部門,決策失誤都會帶來意想不到的損失,所以防止重複投票具有重要意義。本文所給出的基於 ASP(Active Server Page)的幾種方法在一定程度上可以防止連續反覆投票。

ASP對象
在ASP中 有5個對象:Request、Response、Session、 Application、Server。下面只針對本文能用到的對象屬性進行說明,其 他方面的屬性請參考相關資料。本文提供的方法的原理是:設置一個邏輯變量IsVoted,在投票之前驗證IsVoted 的值,只有值為False時,才 能投票,否則就認為已投過票。
Application對象是處理某一特定ASP應用中所有用戶共享信息的對象,也就是說 Application對象是所有聯網機器上所有網頁所共享的對象。由 Application對象所定義和設置的變量,所有用戶的所有網頁均可訪問。利 用Application對象可以定義變量以及改變變量的值,其語法格式如下: Application(「變量名」)=表達式。在.asp 文件中可通 過Application(「變量名」)加以引用。Application把變量的值保存在Web Server 端。

Session 對象用於單個用戶管理信息,Session變量只在頁面間調用(即在一個Session內)。Session變量是私有的,一個Session中某個變量 值的改變不影響另一個Session中同名變量的值。Session對象也把變量值保存在服務器端,但是各個Session保存的位置不同。因為 Session是私有的,所以有多少個Session對象就存在多少個IsVoted變量,這些變量之間沒有關係。

Cookies 對象是不能單獨存在的,它依附於Request和 Response對象,在使用時必須在Cookies前加上Request或Response。同 Application和Session 一樣,Cookies也能保存變量的值,但是Cookies只在瀏覽器客戶端保存變量的值。用 Cookies 所定義的變量有一個屬性:可以設置Cookies變量的使用期限,而且一旦設置了使用期限, Cookies變量可以被從同一台機器上登 錄的所有用戶所共享,我們可以利用Cookies的這個屬性設置間隔一定時間才能再次投票。

Server對象主要完成一些需要WWW服務器處理的工作,本文中我們主要利用Request.ServerVariables讀取Server的環境變量中客戶端的IP地址,並根據IP地址來設定相隔多長時間同一IP地址才能再次投票。

Global.asa 文件完成共享變量和文件的定義及初始化任務。Global.asa文件必須位於ASP應用的根目錄下,一個ASP應用只能有一個Global.asa文 件。Global.asa中含有Application_OnStart、Application_OnEnd、 Session_OnStart、 Session_OnEnd四個事件,我們在Application_OnStart、 Session_OnStart事件中定義 Application變量和Session變量以及進行初始化,這樣在以後的網頁中就可以讀取這些變 量。 ASP在下列情況下讀取Global.asa內容:

1.在Web Server啟動之後,第一次請求調用ASP應用中的任何.asp文件時;

2.不在Session狀態的用戶請求調用ASP應用的.asp文件。

方法一:利用Session對象
在 Global.asa的Session_OnStart事件中設置邏輯變量 IsVoted,初始值為FALSE(表示還沒有投票),投票之後在.asp 程序中把IsVoted的值改為TRUE(表示已投過票)。每次投票之前都要判斷IsVoted的值。如果IsVoted的值為TRUE,就不能再投票; 如果值為FALSE,則可以投票。
因為Session對象的使用必須與瀏覽器的Cookies功能相配合,所以在判斷IsVoted值之前, 必須先判斷瀏覽器的Cookies功能是否打開。如處於關閉狀態,則此種方法失效,所以在這種情況下必須給出提示信息並用Response.End命令中 斷.asp程序的執行,防止連續反覆投票。其流程如圖1:

其中判斷Cookies是否打開的函數比較複雜,現給出函數實現代碼(VBScript)。

< %
Function IsCookiesOpen()
Dim ClientIP, URL, QueryString, IsNew

Application.Lock
If Session(「SessionID")=Session.SessionID Then
IsCookiesOpen = True
ClearApp
Exit Function
End If

IsNew = False
If Session(「SessionID") = Empty Then
CurrentIP =Request.ServerVariables
(「REMOTE_ADDR")
If CurrentIP <> Application(「IP") Then
ClearApp
IsNew = True
End If
End If
If Not IsNew And Application(「Visit") >= 1 Then
IsCookiesOpen = False
ClearApp
Exit Function
End If
Application(「Visit") = Application(「Visit") + 1
Application(「IP") =Request.ServerVariables
(「REMOTE_ADDR")
Session(「SessionID") = Session.SessionID

URL =「_page_=」&Request.ServerVariables
(「PATH_INFO")
QueryString=Request.ServerVariables
(「QUERY_STRING")
If Len(QueryString) > 0 Then URL = URL & 「&" & QueryString
If Not Response.IsClientConnected Then ClearApp
End Function

Sub ClearApp()
Application(「Visit") = 0
Application(「IP") = 「"
End Sub
% >

在.asp文件中直接用IsCookiesOpen()函數來判定 Cookies是否打開。

此種方法的漏洞:如果再打開一個新瀏覽器窗口,會發現在新打開的瀏覽器窗口中仍然可以投票。這是因為Session是私有的,一個Session中變量的改變並不影響另一個Session的同名變量的值。為瞭解決這個問題,下面給出方法二。
方法二:利用Cookies對象
因 為Cookies對象把變量的值保存在瀏覽器客戶端,所以可以根據Cookies保存的IsVoted的值來判斷用戶是否投過票。Cookies變量和 Session變量一樣是私有的,但是如果我們定義了Cookies變量的生存期限,則Cookies變量是公有的,凡是從同一台機器上登錄的用戶在規定 的時間期限沒有達到時,都無法投票,這在一定程度上也能防止反覆投票。實現程序流程如圖2:

根據實際情況合理地設置Cookies變量的生存期限的長短,例如設定為10分鐘,這樣一台機器即使連續投票最多一天也只能投144張票。

此種方法的漏洞:在Windows Arrayx環境下,只要把 WindowsCookies目錄下所有*.txt文件刪除,又可重複投票。為了再進一步防止反覆投票,下面給出方法三。

方法三:驗證IP地址與登錄時間
此 方法首先利用 Request.ServerVariables(REMOTE_ADDR)取得用戶的IP地址。在Web Server端建立一個標準的 MDB類型的數據庫,此數據庫有一個表,該表只有兩個字段:IP地址和登錄時間。之所以設置登錄時間這個字段,是考慮到撥號上網用戶可能共用同一個IP地 址,如果一個IP 地址只能投一次票,那麼顯然不合理。同時,我們還採用方法二同樣的思想,必須每隔一個設定的時間段,同一個IP地址才能再次投票。所以 這種方法比方法一、方法二在防止反覆投票方面要嚴格得多。其實現的程序流程如圖3:

方法四:小範圍調查
這種方法只適用於小範圍調查,思想與方法三相 同,只是把方法三中的 IP地址換成可以唯一代表用戶的字段,如學生證號、工作證號等。這時建立的MDB數據庫只包括兩個字段:證件號碼與 IsVoted(其中IsVoted是邏輯型字段, TRUE表示已投過票,FALSE表示還未投票,在建庫時所有記錄的IsVoted的值都設 為 FALSE)。在投票之前,要求先輸入正確的證件號碼,然後再判斷IsVoted的值。實現這種方法的程序流程如圖4:

從方法一到方法四,安全性越來越高,防止重複連續投票功能越來越強,但是各種方法都有各自的侷限性。在應用中,用戶應 根據實際情況選擇合適的方法。如果小範圍投票,方法四無疑是最好的;如果在Internet上投票,方法三是最好的。另外一點必須提及的是:雖然 Application有保存變量的功能,但是我們沒有用到。因為 Application變量是一個全局性變量,如果用Application把 IsVoted設為TRUE,則任何用戶都無法投票;如果用Application把IsVoted設為FALSE,則任何用戶都可以投票,就沒有任何防 範功能了.

Request.ServerVariables("HTTP_REFERER")有的沒的

資料來源:http://www.itlearner.com/article/2837


下列情況是從瀏覽器的地址欄正常取得Request.ServerVariables("HTTP_REFERER")的:
1.直接用<a href>
2.用Submit或<input type=image>提交的表單(POST or GET)
3.使用Jscript提交的表單(POST or GET)

Request.ServerVariables("HTTP_REFERER")不能正常取值的情況:
1.從收藏夾鏈接
2.單擊'主頁'或者自定義的地址
3.利用Jscript的location.href or location.replace()
4.在瀏覽器直接輸入地址
5.<%Response.Redirect%>
6.<%Response.AddHeader%>或<meta http-equiv=refresh>轉向
7.用XML加載地址

顯然,Request.ServerVariables("HTTP_REFERER")在多數情況下是不能正常工作的,下面我們看一個例子:
ref.asp
<%
response.write "You came from: " & request.servervariables("http_referer")
%>
ref.htm
<%
Response.AddHeader "Refresh", "10;URL=ref.asp"
%> 
<meta http-equiv='refresh' content='10;URL=ref.asp'> 
<form method=GET action=ref.asp name=getform> 
<input type=submit value=' Go there (GET) >> '> 
<input type=image style='cursor:hand'> 
</form><p> 
看看上面的代碼會得到什麼的結果.
<form method=POST action=ref.asp name=postform> 
<input type=submit value=' Go there (POST) >> '> 
<input type=image style='cursor:hand'> 
</form><p> 
<a href='ref.asp'>直接鏈接<p> 
<a href='#' onclick='window.location.href="ref.asp";return false;'>javascript location</a> 
<a href='#'onclick='window.location.replace("ref.asp");return false;'>javascript replace</a> 
<a href='#' onclick='document.getform.submit();return false;'>javascript GET</a> 
<a href='#' onclick='document.postform.submit();return false;'>javascript POST </a>

2011年7月15日 星期五

利用 SQL 找出欄位值重覆的記錄

資料來源:http://killworm737.pixnet.net/blog/post/21934570

2011年7月12日 星期二

利用 Google Analytics API 抓取資料

資料來源:
1.http://tech.ed65.com/2010/12/02/%E5%88%A9%E7%94%A8-google-analytics-api-%E6%8A%93%E5%8F%96%E8%B3%87%E6%96%99-php/
2.http://www.askaboutphp.com/63/google-analytics-api-class-for-php.html

利用 Google Analytics API 抓取資料-PHP


<?php
// include the Google Analytics PHP class
include "googleanalytics.class.php";
try {
// create an instance of the GoogleAnalytics class using your own Google {email} and {password}
$ga = new GoogleAnalytics('email','密碼');

// set Google Analytics ID - 格式為 'ga:123456';
$ga->setProfile('google analytics ID');

// set the date range we want for the report - format is YYYY-MM-DD
$ga->setDateRange('2010-11-29','2010-12-01');

// get the report for date and country filtered by Australia, showing pageviews and visits
$report = $ga->getReport(
array('dimensions'=>urlencode('ga:date,ga:country'),
'metrics'=>urlencode('ga:pageviews,ga:visits'),
'filters'=>urlencode('ga:country=@Taiwan'),
'sort'=>'-ga:pageviews'
)
);

//print out the $report array
print_r($report);

} catch (Exception $e) {
print '錯誤: ' . $e->getMessage();
}
?>
其中 Google Analytics ID 為網址中xxxxx的部份 >>
https://www.google.com/analytics/reporting/?reset=1&id=xxxxx&pdr=20101101-20101201
請於此下載需要呼叫的檔案: googleanalytics.class

SQL隨機查詢的方法

資料來源:http://www.flatws.cn/article/program/mysql/2010-08-23/8791.html


SQL Server:
Select TOP N * From TABLE Order By NewID()  
view plaincopy to clipboardprint?
Select TOP N * From TABLE Order By NewID()
Select TOP N * From TABLE Order By NewID()
NewID()函数将创建一个 uniqueidentifier 类型的唯一值。上面的语句实现效果是从Table中随机读取N条记录。
Access:
Select TOP N * From TABLE Order By Rnd(ID)   
view plaincopy to clipboardprint?
Select TOP N * From TABLE Order By Rnd(ID) 
Select TOP N * From TABLE Order By Rnd(ID)
Rnd(ID) 其中的ID是自动编号字段,可以利用其他任何数值来完成,比如用姓名字段(UserName)
Select TOP N * From TABLE Order BY Rnd(Len(UserName))  
view plaincopy to clipboardprint?
Select TOP N * From TABLE Order BY Rnd(Len(UserName))
Select TOP N * From TABLE Order BY Rnd(Len(UserName))
MySql:
Select * From TABLE Order By Rand() Limit 10  
view plaincopy to clipboardprint?
Select * From TABLE Order By Rand() Limit 10
Select * From TABLE Order By Rand() Limit 10

postgreSQL:
select * from glxt022 order by random() limit 5  
view plaincopy to clipboardprint?
select * from glxt022 order by random() limit 5

Javascript開新視窗的函數

function wshow(a_Url){
  var sUrl = a_Url;
  var sTitle = "Cupon"; // 視窗標題
  var sToolbar = "no"; //
  var sLocation = "no"; //位置列
  var sDirectories = "no"; //目錄
  var sStatus = "no"; // 狀態列
  var sMenubar = "no";
  var sScrollbars = "no";
  var sResizable = "no";
  var sWidth = "410";
  var sHeight = "240";
  var sParams = "toolbar=" + sToolbar + ",directories=" + sDirectories + ",status=" + sStatus + ",menubar=" + sMenubar + ",scrollbars=" + sScrollbars + ",resizable=" + sResizable + ",width=" + sWidth + ",height=" + sHeight;
  //alert(sParams);
  //
  window.open(sUrl,sTitle,sParams);
 }

2011年6月29日 星期三

FTP的主動模式( active )和被動模式( passive ) 比較

資料來源:http://forum.icst.org.tw/phpbb/viewtopic.php?t=79

FTP 的主動模式( active )和被動模式( passive )

FTP 是一種檔傳輸協定 (File Transfer Protocol),它的連線模式有兩種﹕
主動模式( active )和被動模式( passive )。以下說明 FTP 的連線是怎樣建立的﹕

在 active 模式下 (一般預設的模式)﹕
1. FTP client 開啟一個隨機選擇的TCP port 呼叫 FTP server 的 port 21請求連線。當順
利完成 Three-Way Handshake 之後,連線就成功建立,但這僅是命令通道的建立

2.當兩端需要傳送資料的時候,client 透過命令通道用一個 port command 告訴 server
,client可以用另一個TCP port 做數據通道。
3.然後 server 用 port 20 和剛才 client 所告知的 TCP port 建立數據連線。請注意:連
線方向這是從 server 到 client 的,TCP 封包會有一個 SYN flag。
4.然後 client 會返回一個帶 ACK flag的確認封包﹐並完成另一次的 Three-Way
Handshake 手續。這時候,數據通道才能成功建立。
5.開始數據傳送。

在 passive 模式下
1.FTP client 開啟一個隨機選擇的TCP port 呼叫 FTP server 的 port 21請求連線,並完
成命令通道的建立。
2.當兩端需要傳送資料的時候,client 透過命令通道送一個 PASV command 給
server,要求進入 passive 傳輸模式。
3.然後 server 像上述的正常模式之第 2 步驟那樣,挑一個TCP port ,並用命令通道
告訴 client。
4.然後 client 用另一個TCP port 呼叫剛才 server 告知的 TCP port 來建立數據通道。此
時封包帶 SYN flag。
5.server 確認後回應一個 ACK 封包。並完成所有交握手續﹑成功建立數據通道。
6.開始數據傳送。

在實際使用上, active mode 用來登入一些開設在主機上及沒有安裝防火牆的 FTP server,或是開設於 client side 的 FTP server!

Passive mode (簡稱 PASV)用來登入一些架設於防火牆保護下而又是開設於主機上的 FTP server!

如果您覺得太深奧而弄不清楚, 那就先用預設的 active mode 登入, 失敗改用 passive mode 登入就是了。

PHP中單引號跟雙引號有什麼不同?

資料來源:http://www.neo.com.tw/archives/958

單引號跟雙引號到底有什麼不同?

PHP 會解譯「雙引號」字串內的變數,而「單引號」則視為純字串出,PHP 不會再處理單引號內的內容。

2011年6月27日 星期一

PHP補零的作法

資料來源:http://blog.hsin.tw/2009/php-pad-a-string/

PHP有內建的函數可以方便的做補齊位數的函數,
google了一番找到清楚的說明,文章轉載如下:


會找到有些使用sprintf函式的方法 像下面這樣
$var = 1;
echo sprintf("%02d", $var);
其實php本身就有一個專門可以補齊位數的函式 : str_pad()
string str_pad ( string $input , int $pad_length [, string $pad_string= " " [, int $pad_type= STR_PAD_RIGHT ]] )
$input : 原字串
$pad_length : 補齊後的位數
$pad_string : 用來補齊的字串
$pad_type : 補齊的方式 有三種,STR_PAD_RIGHT (由右邊補)、STR_PAD_LEFT (由左邊補)、STR_PAD_BOTH (左右兩邊都補), 預設為STR_PAD_RIGHT
所以其實不只可以補零,要補什麼字都可以
而以補零來舉例的話就是


$value = 7;
//將數字由左邊補零至三位數
$value = str_pad($value,3,'0',STR_PAD_LEFT);
echo $value;
// 結果會印出 007;
 
//下面這是document裡的例子
$input = "Alien";
echo str_pad($input, 10);                      // produces "Alien     "
echo str_pad($input, 10, "-=", STR_PAD_LEFT);  // produces "-=-=-Alien"
echo str_pad($input, 10, "_", STR_PAD_BOTH);   // produces "__Alien___"
echo str_pad($input, 6 , "___");               // produces "Alien_"

2011年6月26日 星期日

IE使用錨點時.Title後面會帶錨點值

資料來源:http://www.zwjoy.com/blog/?p=131


解决方法1:修改FLASH(这个是网上的,但我没有用这个方法)
<param name="movie" value="images/banner.swf" />
    <param name="loop" value="true" />
    <param name="menu" value="false" />
    <param name="quality" value="best" />
    <param name="wmode" value="transparent" />
生成的代码;
解决方法2:(JS修改标题,替换锚点后的内容)
$(document).ready(function() {
 //js 更换标题(去掉锚点产生的标题后缀)
 var title = $('#_headerTitle').html(); 
 var regx = /(\#.+)+/;
 title = title.replace(regx, '');
 document.title = title;
 
});

2011年6月21日 星期二

ASP + MySQL + MyODBC 3.51 亂碼的問題

某個案子發生了讀取資料庫資料亂碼的問題,
經過比對資料庫是用utf-8,頁面也已設定為utf-8,
但是頁面還是亂碼,拜請google後找到如下的資料;
連線資料庫的字串加上"Set Names big5",就不會亂碼.

參考資料來源:http://tlcheng.wordpress.com/2006/04/23/mysql-for-windows-net/
參考資料來源:http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/332931a4-b764-4839-ac21-e887d58a71c7

2011年6月17日 星期五

Warning: Cannot modify header information - headers already sent by解法

資料來源:http://amjet.dyndns.biz/blog/IT/?p=12


寫 php 時常遇到這個錯誤訊息,解法也很簡單,如果 php 有 include 其他程式檔的話檢查 <?php 的前面不可以有任何的空行或文字,?> 後面也不要有空行和其他文字就可以了。
2007/12/25 加註:
有些 editor 在處理 utf-8 編碼文件檔時,會在檔案最前面加上幾個 byte 的檔頭,一般編輯時看不到,利用 UltraEditor、NotePad++ 的 Hex mode 可以看到及修改,這種檔案也會造成上述的錯誤,也有看過這種 jsp 檔案 java 無法 compile 的情形。

Undefined index 錯誤PHP

資料來源:http://plog.tcc.edu.tw/post/530/12708

治標不治本的就是將php.ini內的reporting部份修改,讓notice不顯示
error_reporting = E_ALL; display all errors, warnings and notices
改成
error_reporting = E_ERROR & ~E_NOTICE & ~E_WARNING

不然
isset($_GET["page"])做個if-else判斷!!

或者在這段敘述前面加上'@'表示這行敘述如果有錯誤或是警告時不要輸出
如:@$page=$_GET["page"]

php5.3開始出現的Function ereg() is deprecated Error問題解決辦法

資料來源:http://www.liuhuadong.com/archives/727/index.html


PHP 5.3 ereg() 無法正常使用,提示「Function ereg() is deprecated Error」。問題根源是php中有兩種正則表示方法,一個是posix,一個是perl,php6打算廢除posix的正則表示方法所以後來就加了個 preg_match。此問題解決辦法很簡單,在ereg前加個過濾提示信息符號即可:把ereg()變成@ereg()。這樣屏蔽了提示信息,但根本問 題還是沒有解決,php在5.2版本以前ereg都使用正常,在5.3以後,就要用preg_match來代替ereg。所以就需要變成這樣,原來:
ereg("^[0-9]*$",$page)
變成:
preg_match("/^[0-9]*$/",$page)
特別提醒:posix與perl的很明顯的表達區別就是是否加斜槓,所以與ereg相比,後者在正則的前後分別增加了兩個」/」符號,不能缺少。
Tips:此問題在php5.2之前版本不會出現。

幾個用PHP產生縮圖的參考

1.資料來源:
http://blog.twkang.net/2006/08/25/php-%E7%94%A2%E7%94%9F%E7%B8%AE%E5%9C%96%E7%9A%84%E6%96%B9%E6%B3%95/

2.資料來源:http://inspire.twgg.org/c/programming/php/using-php-function-imagecopyresized-gd-the-establishment-of-high-precision-thumbnail.html

3.資料來源:http://blog.ring.idv.tw/comment.ser?i=173

4.資料來源:http://blog.longwin.com.tw/2007/08/php_image_resize_2007/

最後參考了資料來源4的PHP 等比例縮圖程式的寫作方法

2011年6月16日 星期四

mysql 裡 utf8_general_ci 跟 utf8_unicode_ci 連線校對的差異

資料來源:http://origin2.pixnet.net/blog/post/1244682

utf8_general_ci 在轉換時速度比較快
utf8_unicode_ci 在轉換時比較精準

轉換?怎麼講呢?
簡單說就是當資料要從一個編碼換成另外一個編碼時,
mysql 要在兩個 codepage 裡面找出來相對應的字元位置在哪裡。
對 utf8_general_ci 來說,來源 codepage 裡面的一個字元只能對應到目標 codepage 裡面的一個字元,
而 utf8_unicode_ci 則可以把來源 codepage 裡的一個字元對應到目標 codepage 裡的多個字元(或反過來)。
例如德文裡的 ß 要轉換成英文的時候如果是用 utf8_unicode_ci 轉換會變成正確的 ss ,
但是如果用 utf8_general_ci 的話則會變成單一的 s 而已。

所以如果可以的話請盡量用 utf8_unicode_ci 而不要用 utf8_general_ci ,
雖然對 multibyte 字元來說這兩個都沒差,
但是 utf8 的網頁誰也不知道哪天會不會有這種字元出現在你的網頁上,
所以如果設成 utf8_unicode_ci 你就不需要擔心貼上去之後資料在轉換間遺失了。

2011年6月15日 星期三

如何判斷使用 ADO 資料錄集欄位的屬性

資料來源:http://support.microsoft.com/kb/193947


* DEFINEs for field types - provided for reference only.
   #DEFINE ADEMPTY               0
   #DEFINE ADTINYINT            16
   #DEFINE ADSMALLINT            2
   #DEFINE ADINTEGER            3
   #DEFINE ADBIGINT            20
   #DEFINE ADUNSIGNEDTINYINT      17
   #DEFINE ADUNSIGNEDSMALLINT      18
   #DEFINE ADUNSIGNEDINT         19
   #DEFINE ADUNSIGNEDBIGINT      21
   #DEFINE ADSINGLE            4
   #DEFINE ADDOUBLE            5
   #DEFINE ADCURRENCY            6
   #DEFINE ADDECIMAL            14
   #DEFINE ADNUMERIC            131
   #DEFINE ADBOOLEAN            11
   #DEFINE ADERROR               10
   #DEFINE ADUSERDEFINED         132
   #DEFINE ADVARIANT            12
   #DEFINE ADIDISPATCH            9
   #DEFINE ADIUNKNOWN            13
   #DEFINE ADGUID               72
   #DEFINE ADDATE               7
   #DEFINE ADDBDATE            133
   #DEFINE ADDBTIME            134
   #DEFINE ADDBTIMESTAMP         135
   #DEFINE ADBSTR               8
   #DEFINE ADCHAR               129
   #DEFINE ADVARCHAR            200
   #DEFINE ADLONGVARCHAR         201
   #DEFINE ADWCHAR               130
   #DEFINE ADVARWCHAR            202
   #DEFINE ADLONGVARWCHAR         203
   #DEFINE ADBINARY            128
   #DEFINE ADVARBINARY            204
   #DEFINE ADLONGVARBINARY         205
   #DEFINE ADCHAPTER            136

   oRecordSet = CREATEOBJECT("ADODB.Recordset")

   lcSQL = "select * from authors"

   oRecordSet.OPEN(lcSQL, ;
      "DRIVER={SQL Server};" + ;
      "SERVER=YourServerName;" + ;
      "DATABASE=pubs;" + ;
      "UID=YourUserID;" + ;
      "PWD=YourPassword")

   lcFieldInfo = ""
   FOR EACH FIELD IN oRecordSet.FIELDS
      ? "Field name: ", FIELD.NAME, ;
         " Type: ", LTRIM(STR(FIELD.TYPE)), ;
         " Defined size: ", LTRIM(STR(FIELD.DEFINEDSIZE)), ;
         " Actual size: ", LTRIM(STR(FIELD.ACTUALSIZE))
      ?
   NEXT
    

2011年6月13日 星期一

FB分享按鈕相關的參考資訊

參考資訊:
http://blogger.mbdmt.com/?p=127

http://blog.webgene.com.tw/?p=1993

http://epromotor.pixnet.net/blog/post/30997291

http://epromotor.pixnet.net/blog/post/30099287

2011年6月1日 星期三

Unicode Code Converter Unicode轉碼網頁

好用的轉碼網站,可以幫你文字轉為多種的編碼

http://people.w3.org/rishida/tools/conversion/

2011年5月18日 星期三

上傳元件的參考說明

資料來源:http://www.blueshop.com.tw/board/show.asp?subcde=BRD20070213101830DF8

1.iNotesUpload 

大陸人寫的、支援中文檔上傳

免費

效能不佳(會停留在上傳表單畫面,好像當了一般)

程式出問題後從資料庫取出的資料中文會變成亂碼,必須關閉IE後重來,此元件測到會怕


2.LyfUpload

大陸人寫的、支援中文檔上傳

免費

效能不佳(會停留在上傳表單畫面,好像當了一般)

程式出問題後從資料庫取出的資料中文會變成亂碼


3.basp21

日本人寫的、支援中文檔上傳(?)

免費

效能不佳(會停留在上傳表單畫面,好像當了一般)


4.aspsmartupload

外國人寫的(不知哪一國)、「不」支援中文檔上傳

免費

效能很不錯,可惜無法上傳中文檔,看其說明文件是說有支援,但測不出來


5.aspupload

外國人寫的(不知哪一國)、支援中文檔上傳、下載

99元美金,試用版30天

效能很好

有progress bar顯示上傳狀態、速度;不會死死的停在上傳畫面

官網:http://www.aspupload.com/index.html

6.dundasUpload

免費

‧一次上傳多個檔案、支援建立中文資料夾、中文檔案 

‧可設定上傳資料上限, 檔案數上限, 檔案容量上限 

‧透過 ProgressBar 及 StateServer 元件實作 progress bar 

‧上傳的檔案可選擇儲存至磁碟或記憶體 

‧可操作檔案及目錄 

‧模擬使用者帳號, 並設定權限 

‧COM registration 

‧支援 MacBinary(Macintosh client 端) 

‧上傳的檔案可操作其 ACL, 擁有者及屬性 

缺點:StateServer必須先run起來,才能使用ProgressBar,而StateServer無法縮到狀態列

下載網站:http://www.dundas.com/
-------------------------------------------------------------------------------------
其中第五項aspupload是公認最好低元件,但要錢^^

2011年5月12日 星期四

ASP的分頁範例

資料來源:http://www.blueshop.com.tw/board/show.asp?subcde=BRD20050926133403S2E&fumcde=&odr=cdt&odrtyp=0


' 檔案pageft.asp
'----------------------------------------------------------------------------------
<%
'   作者:阿言
'   功能:ASP利用Mysql分頁,利用偶然PHP分頁所改
'   取得目前頁碼及筆數起始點函數
Function getPageNum(perpage)
    if(request("page")="" or request("page")<=1) then
        page = 1
        startline = 0
    else
        page = request("page")
        startline = (request("page")-1)*perpage
    end if
    Mypagenum = page
    mystartline = startline
    getPageNum=array (Mypagenum, mystartline)
end Function

'   參數:num ----------- 總數
'        perpage ------- 每頁條數
'        curr_page ----- 目前頁數,可以通過get 得到
'        mpurl --------- 目前網頁url,如:index.asp?op=Opp_add.asp
'
'/

function multi(num, perpage, curr_page, mpurl,mytype)
    if(num > perpage) then
        page   = 5 ' 設定顯示的數目     1 2 3 4 5 .......  or    ...... 3 4 5 6 7 .....
        offset = 2
' Response.Write (curr_page-page+1)
        pages  = num \ perpage '得到頁數
        from   = curr_page - offset  '偏移兩頁
        to_p  = curr_page + page - offset - 1
        if(page > pages) then
            from = 1
            to_p   = pages
        else
            if(from < 1) then
                to_p   = curr_page + 1 - from
                from = 1
                if((to_p - from) < page or (to_p - from) < pages) then
                    to_p = page
  end if
            elseif(to_p > pages) then
                from = curr_page - pages + to_p
                to_p   = pages
                if((to_p - from) < page or (to_p - from) < pages) then
                    from = pages - page + 1
  end if
     end if
        end if 
 Select Case (mytype) 
  case "0":
          fwd_back =""
          fwd_back=fwd_back & "<form name=breakpage>共有 "&num&" 筆  |  "&perpage&" 筆/頁|  目前第 "&curr_page&" 頁|  "

   If(curr_page-page+1>=0) Then
    fwd_back=fwd_back & "<a href="""&mpurl&"&page=1"">|<<</a>  "   
   End if
  case "1":
   fwd_back = fwd_back & "<a href="""&mpurl&"&page=1"">|<<</a>  "
 End Select
        for i = from to to_p+1
            if(i <> int(curr_page)) then
                fwd_back = fwd_back & "<a href="""&mpurl&"&page="& i &""">["& i &"]</a> "
            else
                fwd_back = fwd_back & "<u><b>["&i&"]</b></u> "
     end if
 next

 if(pages > page and (pages+2-curr_page) >= page) then
  fwd_back = fwd_back & " <a href="""&mpurl&"&page="&pages+1&""">>>|</a> "
 end if
 multi = fwd_back
    end if
end function

%>
'-----------------------------------------------------------------------


' index.asp
<!-- #INCLUDE virtual="pageft.asp" --> 
<%
'-------------------------------------分頁設定開始-------------------------------------
'query 跟 get_results 是我自己寫的開啟資料庫函式,小弟不提供方法,請大大們自行修正為自己開啟的方法
 SET RSVAR =  query("select count(*) from  table") '取的資料庫中相對應的資料筆數
 Myallpages = RSVAR(0) '設定所得筆數變數
 Mypagesize = 8  '設定每頁筆數
 myurl = "index.asp" '設定檔案連結,如自己已有所帶的參數亦可使用  index.asp?xxx=xxx
 GetPagestar = getPageNum(Mypagesize) '  GetPagestar(0) 為目前頁碼  GetPagestar(1) 為頁數起始點
 mypagelist = multi(Myallpages,Mypagesize,GetPagestar(0),myurl,"0")  'mypagelist即為分頁變數、可直接印出測試  Response.write (mypagelist)
 SET RS =  get_results ("select * from  table limit "& GetPagestar(1) &","& Mypagesize &"")
'-------------------------------------分頁設定結束-------------------------------------
  While Not RS.EOF
        '這邊自己寫,輸出的訊息
   Wend
%>

2011年5月5日 星期四

XMLHTTP抓取同主機的檔案卻出現無法顯示網頁的情形

問題描述:
使用XMLHTTP抓取同主機不同應用程式的檔案卻出現無法顯示網頁的情形

解決方式:
檢查了許多才發現,IIS沒有繫結主機的Domain Name只有繫結IP位址.
將Domain Name也繫結至IIS上就ok了.

2011年4月25日 星期一

[轉]如何使用 CAST 與 CONVERT 格式化日期與時間資料

資料來源:
http://ithelp.ithome.com.tw/question/10008820

SQL Server 的 CAST 與 CONVERT 可以讓我們明確地轉換運算式的資料型別,這次我們就是要討論如何使用這兩個函式來格式化日期與時間資料。


CAST 與 CONVERT 都提供類似的功能讓我們明確地轉換運算式的資料型別,我們就先看看 CONVERT 的語法:

  1. CONVERT ( 資料型別 [ (資料長度) ] , 運算式 [ , 日期格式樣式 ] )  


由上面的語法可以看出來 CONVERT 擁有指定「日期格式樣式」的選項,就讓我們透過實際的例子來看看轉換效果:
  1. -- 定義變數  
  2. DECLARE @myDate DATETIME  
  3. -- 指派一個日期給該變數  
  4. SET @myDate = '2008/09/09 08:25 AM'  
  5.   
  6. -- 開始轉換  
  7. PRINT CONVERT(CHAR(19), @myDate)  
  8. PRINT CONVERT(CHAR(19), @myDate, 0)  
  9. PRINT CONVERT(CHAR(8),  @myDate, 1)  
  10. PRINT CONVERT(CHAR(8),  @myDate, 2)  
  11. PRINT CONVERT(CHAR(8),  @myDate, 3)  
  12. PRINT CONVERT(CHAR(8),  @myDate, 4)  
  13. PRINT CONVERT(CHAR(8),  @myDate, 5)  
  14. PRINT CONVERT(CHAR(9),  @myDate, 6)  
  15. PRINT CONVERT(CHAR(10), @myDate, 7)  
  16. PRINT CONVERT(CHAR(8),  @myDate, 8)  
  17. PRINT CONVERT(CHAR(26), @myDate, 9)  
  18. PRINT CONVERT(CHAR(8),  @myDate, 10)  
  19. PRINT CONVERT(CHAR(8),  @myDate, 11)  
  20. PRINT CONVERT(CHAR(6),  @myDate, 12)  
  21. PRINT CONVERT(CHAR(24), @myDate, 13)  
  22. PRINT CONVERT(CHAR(12), @myDate, 14)  
  23. PRINT CONVERT(CHAR(19), @myDate, 20)  
  24. PRINT CONVERT(CHAR(23), @myDate, 21)  
  25. PRINT CONVERT(CHAR(20), @myDate, 22)  
  26. PRINT CONVERT(CHAR(10), @myDate, 23)  
  27. PRINT CONVERT(CHAR(8),  @myDate, 24)  
  28. PRINT CONVERT(CHAR(23), @myDate, 25)  
  29. PRINT CONVERT(CHAR(19), @myDate, 100)  
  30. PRINT CONVERT(CHAR(10), @myDate, 101)  
  31. PRINT CONVERT(CHAR(10), @myDate, 102)  
  32. PRINT CONVERT(CHAR(10), @myDate, 103)  
  33. PRINT CONVERT(CHAR(10), @myDate, 104)  
  34. PRINT CONVERT(CHAR(10), @myDate, 105)  
  35. PRINT CONVERT(CHAR(11), @myDate, 106)  
  36. PRINT CONVERT(CHAR(12), @myDate, 107)  
  37. PRINT CONVERT(CHAR(8),  @myDate, 108)  
  38. PRINT CONVERT(CHAR(26), @myDate, 109)  
  39. PRINT CONVERT(CHAR(10), @myDate, 110)  
  40. PRINT CONVERT(CHAR(10), @myDate, 111)  
  41. PRINT CONVERT(CHAR(8),  @myDate, 112)  
  42. PRINT CONVERT(CHAR(24), @myDate, 113)  
  43. PRINT CONVERT(CHAR(12), @myDate, 114)  
  44. PRINT CONVERT(CHAR(19), @myDate, 120)  
  45. PRINT CONVERT(CHAR(23), @myDate, 121)  
  46. PRINT CONVERT(CHAR(23), @myDate, 126)  
  47. PRINT CONVERT(CHAR(23), @myDate, 127)  
  48. PRINT CONVERT(CHAR(32), @myDate, 130)  
  49. PRINT CONVERT(CHAR(25), @myDate, 131)  


執行結果:


接下來看 CAST 的語法:
  1. CAST (運算式 AS 資料型別 [ (資料長度) ])  


與 CONVERT 相比,CAST 馬上就遜掉了,因為 CAST 沒有辦法指定日期格式樣式,如果要指定的話,勢必要自己加工過。
例如,我們要像 YYYY-MM-DD HH:MI:SS.sss 這樣的結果:
  1. -- 定義變數  
  2. DECLARE @myDate DATETIME  
  3. -- 指派一個日期給該變數  
  4. SET @myDate = '2008/09/09 08:25 AM'  
  5.   
  6. -- 開始轉換  
  7. PRINT '使用 CONVERT 轉換 ==> ' +  
  8.     CONVERT(CHAR(23), @myDate, 21)  
  9. PRINT '使用 CAST 轉換 =====> ' +  
  10.     CAST(DATEPART(YY, @myDate) AS CHAR(4)) + '-'  
  11.     + RIGHT(CAST(100 + DATEPART(MM, @myDate) AS CHAR(3)), 2) + '-'  
  12.     + RIGHT(CAST(100 + DATEPART(DD, @myDate) AS CHAR(3)), 2) + ' '  
  13.     + RIGHT(CAST(100 + DATEPART(HH, @myDate) AS CHAR(3)), 2) + ':'  
  14.     + RIGHT(CAST(100 + DATEPART(MI, @myDate) AS CHAR(3)), 2) + ':'  
  15.     + RIGHT(CAST(100 + DATEPART(SS, @myDate) AS CHAR(3)), 2) + '.'  
  16.     + RIGHT(CAST(1000+ DATEPART(MS, @myDate) AS CHAR(4)), 3)  


執行結果:


接下來我們直接透過實際的程式碼,討論如何把 AM 或 PM 換成中文的上午或下午:
  1. DECLARE @myDate DATETIME  
  2. SET @myDate = '2008/09/09 08:25 AM'  
  3. SELECT CAST(DATEPART(YYYY, @myDate) AS CHAR(4)) + '/'   
  4.     + RIGHT(CAST(100 + DATEPART(MM, @myDate) AS CHAR(3)), 2) + '/'  
  5.     + RIGHT(CAST(100 + DATEPART(DD, @myDate) AS CHAR(3)), 2) + ' '  
  6.     + CASE WHEN DATEPART(HH, @myDate) < 13  
  7.         THEN RIGHT(CAST(100 + DATEPART(HH, @myDate) AS CHAR(3)), 2)  
  8.         ELSE CAST(DATEPART(HH, @myDate) - 12 AS CHAR(2))  
  9.     END + ':'  
  10.     + RIGHT(CAST(100 + DATEPART(MI, @myDate) AS CHAR(3)), 2)  
  11.     + CASE WHEN DATEPART(HH, @myDate) < 13  
  12.         THEN '上午'  
  13.         ELSE '下午'  
  14.     END  


執行結果:


最後,就以轉換西元日期成為民國年作為最後一個轉換的範例吧:
  1. DECLARE @myDate DATETIME  
  2. SET @myDate = '2008/09/09 08:25 AM'  
  3. SELECT CAST(YEAR(@myDate) - 1911 AS NVARCHAR(3)) + '年'  
  4.     + CAST(Month(@myDate) AS NVARCHAR(2)) + '月'  
  5.     + CAST(Day(@myDate) AS NVARCHAR(2)) + '日'  


執行結果:

2011年4月20日 星期三

讓window.open的彈出視窗置中

function openwindow(url,name,iWidth,iHeight)
{
  var url;     //網頁位置;
  var name;    //網頁名稱;
  var iWidth;  //視窗的寬度;
  var iHeight; //視窗的高度;
  var iTop = (window.screen.availHeight-30-iHeight)/2;  //視窗的垂直位置;
  var iLeft = (window.screen.availWidth-10-iWidth)/2;   //視窗的水平位置;
  window.open(url,name,'height='+iHeight+',,innerHeight='+iHeight+',width='+iWidth+',innerWidth='+iWidth+',top='+iTop+',left='+iLeft+',status=no,location=no,status=no,menubar=no,toolbar=no,resizable=no,scrollbars=no');
}

資料來源:http://www.cnblogs.com/shiyu007/archive/2006/12/05/582801.html

2011年4月18日 星期一

Microsoft Office PowerPoint 2003 資訊安全更新 (KB2464588) 更新後,PowerPoint 2003編輯PowerPoint 2007另存成97-2003版的檔案會造成PowerPoint 無回應

裝了KB2464588的安全性更新以後會出現這個錯誤,



只要移除KB2464588就不會出現錯誤,可以暫時解決這個問題

參考資源:
http://social.technet.microsoft.com/Forums/zh-TW/officezhcht/thread/24ea7738-520e-43a1-a4f0-59d061cbcd1d

2011年4月12日 星期二

UTM設定的23事

UTM設定網路介面的畫面中有一個負載分配模式,在設定的實務上發現了其中的巧妙.
負載分配模式共有四個選項,大略的功能如下:
1.自動分配:讓UTM自行決定負載的線路,最傻瓜但是使用某些網頁系統如Plesk,會有無法正常登入系統的問題(登入後會一直跳回帳號密碼提示頁面).

2.手動分配:管理者自行決定線路的優先權.

3.依來源IP分配:判別連線是由內部哪用戶來進行連線,維持由此連線路徑,彼此互傳封包。

4.依目的IP分配:判別內部用戶是透過UTM的哪條對外線路,和遠端設備建立連線,於終止(完成)所有和同一設備的連線前,維持由此連線路徑,彼此互傳封包。

目前是選擇用"依目的IP分配",來解決無法正常登入Plesk的問題。
依內部用戶需求測試調整後改為"依來源IP分配"。(20110504)

2011年4月2日 星期六

使用Facebook PHP SDK在IE無法使用getsession的問題

最近寫了幾個Facebook的App.
發生了一個蠻怪的問題就是IE以外的瀏覽器都可以正常的取得$_POST變數的值,
唯獨使用IE的時候沒有辦法取得$_POST變數值.
搞了好久才發現是Facebook PHP SDK在ie執行的時候.
在接收傳值的頁面,如果使用$facebook->getsession(),他會先redirect以取得目前的session.
這個狀況會導致$_POST的值跑掉.
最後用google找到一個方法.解決跨網域的問題.
在執行PHP SDK前先判斷是不是瀏覽器是不是ie.
如果是的話就餵給他一段檔頭.
以下為程式碼的範例:

if (stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE'))
    {
    header('p3p: CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"');
    }

也可以直接加在IIS或Apache上.
IIS:
功能檢視->HTTP回應標頭->新增->名稱:p3p;值:CP=CAO PSA OUR

apache:
<VirtualHost>  
Header set P3P 'CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'  
</VirtualHost> 

參考來源:
http://forum.developers.facebook.net/viewtopic.php?id=73645
http://forum.developers.facebook.net/viewtopic.php?id=74056
http://www.neatstudio.com/show-1390-1.shtml

2011年3月23日 星期三

MS SQL char 與 varchar 和 nchar 與 nvarchar

參考資料:http://blog.yam.com/clayclay76/article/25172410
http://msdn.microsoft.com/zh-tw/library/ms186939%28v=sql.90%29.aspx

char在MS SQL中
假設指定長度為char(10)
如果填入的值是abcd
因為長度沒有達到10
所以會自動在字串右邊補空白
也就是abcd後面會有6個空白


而varchar則是相反
假設指定長度為varchar(10)
如果填入的值是abcd
並不會自動填補空白
字串一樣是abcd


固定長度 (nchar) 或可變長度 (nvarchar) 的 Unicode 資料,且使用 UNICODE UCS-2 字元集。
nchar [ ( n ) ]
n 字元的固定長度 Unicode 字元資料。n 必須是 1 到 4,000 的值。儲存體大小是 n 位元組的兩倍。nchar 的 SQL-2003 同義字是 national charnational character
nvarchar [ ( n | max ) ]
可變長度,Unicode 字元資料。n 可以是 1 到 4,000 的值。max 表示最大儲存體大小是 2^31-1 位元組。儲存體大小是輸入字元數的兩倍 + 2 位元組 (以位元組為單位)。輸入的資料長度可以是 0 字元。nvarchar 的 SQL-2003 同義字是 national char varyingnational character varying

2011年3月22日 星期二

ASP和PHP語法對照表

資料來源:http://www.design215.com/toolbox/asp.php

要改寫某些案子的時候就可以拿來參考.

2011年3月18日 星期五

Facebook在ie使用stream publish被IE8的XSS (Cross Site Scripting) filter擋掉的解法

資料來源:http://wiselysong.blogspot.com/2010/10/2010-10-08-facebook-javascript-sdk-in.html

百思不得其解的狀況下,拜求google大神.得到的籤詩如下:

HTML最前方的!DOCTYPE定義區段沒寫才造成的。這在非IE8瀏覽器下基本都不會有影響的,但是在IE8底下就會造成這問題!
在HTML最前面補上了 <!DOCTYPE html>
同樣的中文內容在測試會被擋掉的在這就都可以正常了 .

用ie打開UTF8的網頁卻一片空白..........

資料來源:http://zonble.net/archives/2004_05/485.php

用ie以外的瀏覽器看都正常.唯獨ie一開就一片空白.怎解?
解法如下:

如果使用的是Mozilla、Mozilla Firefox、Sarafi等其他目前流行的瀏覽器,通常就不會有這樣的問題。
如果您在Windows作業系統上,使用Internet Explorer瀏覽器的話,往往會出現這樣的狀況:在瀏覽使用UTF-8編碼製作的中文網頁時,瀏覽器並不能夠自動偵測網頁的編碼方式,從原本預設的語 系編碼(例如Big5正體中文等),切換成改以UTF-8編碼,結果畫面上就是一片空白,什麼都沒有,即使在網頁當中,已經加上了特別標明內文語系的 metadata標籤:

在Internet Explorer中,還是沒有辦法正常處理。
我之前也遇過這樣的狀況,在做了一些嘗試之下,發現有個方法可以解決這樣的問題,那就是,在網頁的<head> 到</head>當中的檔頭部份,調整一下各種<meta>標籤在檔案中的順序。如果說,在<head>當中,排在 最前面的是像網頁標題標籤<title></title>,當中就出現了UTF-8中文,就很容易造成在瀏覽器中畫面一片空白, 我在想,或許是因為Internet Explorer會一開始就用預設的語系解讀、分析網頁,而在標題的地方遇到UTF-8字元,就解讀錯誤,而不會繼續往下讀,讀到meta標籤,讀出這個 網頁是以UTF-8編碼。
所以,在</head>的部份,把”Content-Type”放在最前面,便可以解決這樣的問題了。

文章來源: http://zonble.net/archives/2004_05/485.php

2011年3月14日 星期一

將資料匯出到Excel(*.csv),文字格式資料的處理手法

目前查到的有幾種解法:
1.設定儲存格格式
<td style="mso-number-format:\@">
資料參考來源:http://yanyoliu.blogspot.com/2006/04/asp-excel.html

2.數字前面加上單引號
參考資料:http://www.programmer-club.com.tw/ShowSameTitleN/asp/12676.html

3.數字前面加上chr(127)
參考資料:http://www.blueshop.com.tw/board/show.asp?subcde=BRD200606191649367F8
ASCII字碼對應表
http://www.roubaixinteractive.com/PlayGround/Binary_Conversion/The_Characters.asp

2011年3月9日 星期三

Recordset 語法及相關運作

資料來源:http://blog.blueshop.com.tw/mars/archive/2004/09/08/177.aspx


語法
Set Rs = Server.CreateObject("ADODB.Recordset")
Rs.Open Source, ActiveConnection, CursorType, LockType, Options

參數
Source 選擇性參數:  此 Variant 是為一個有效的 Command 物件變數名稱、SQL 陳述式、資料表名稱、已存的程序呼叫,或是一個保存的 Recordset 的檔名。
ActiveConnection 選擇性參數:  不是 Variant 得到一個有效的 Connection 物件變數名稱,就是 String 包含 ConnectionString 參數。
CursorType 選擇性參數:  此 CursorTypeEnum 值決定提供者在開啟 Recordset 時應使用的指標類型。其可以是下列其中一種常數。

常數說明
adOpenForwardOnly:開啟一個順向資料指標。(預設)
AdOpenKeyset:開啟一個索引鍵集 (keyset-type) 資料指標。
AdOpenDynamic:開啟一個動態資料指標。
AdOpenStatic:開啟一個靜態資料指標。
LockType 選擇性參數:
此 LockTypeEnum 值決定提供者在開啟 Recordset 時應使用何種鎖定 (同時性)。其可以是下列其中一種常數。
常數說明adLockReadOnly:唯讀,資料無法變更。(預設)
AdLockPessimistic:悲觀鎖定,提供者會進行必要的動作以確保能順利編輯資料錄,其方法通常是在編輯時立即在資料源處鎖定資料錄。
AdLockOptimistic:樂觀鎖定,提供者使用樂觀性鎖定,當您呼叫 Update 方法時,僅鎖定資料錄。
AdLockBatchOptimistic:樂觀批次更新,此為批次更新模式所需,與即時更新模式相反。
Options 選擇性參數:  
一個 Long 值,表示提供者在 Source 引數代表 Command 物件以外的東西時應如何評估它,否則 Recordset 應從前次儲存的檔案還原。它可以是下列其中一種常數。

常數說明
adCmdText:提供者會將 Source 評估為指令的文字定義。
AdCmdTable:ADO 會產生一個 SQL 查詢,從 Source 中指定的資料表傳回所有資料列。
AdCmdTableDirect:提供者會從 Source 中指定的資料表傳回所有資料列。
AdCmdStoredProc:提供者會將 Source 評估為一個預存程序。
AdCmdUnknown:Source 引數中未知的指令類型。
AdCommandFile:保留的 (已儲存的) Recordset 會從 Source 中指定的檔案還原。
AdExecuteAsync:Source 作非同步執行。
AdFetchAsync:表示在 CacheSize 屬性中指定的初始數量被抓取後,剩下的資料列就會被非同步地抓取。
應用函數
RecordSet.BOF 判斷指標是否超過最前面
RecordSet.EOF 判斷指標是否超過最後面
RecordSet.MoveFirst 將資料錄指標移至第一筆
RecordSet.MoveLast 將資料錄指標移至最後一筆
RecordSet.MoveNext 將資料指標往後移一筆
RecordSet.MovePrevious 將資料指標往前移一筆
RecordSet.Fields.Count 傳回Recordset中的欄位數
RecordSet(i).Name 傳回Recordset中第i個欄位的名稱
RecordSet.RcordCount 傳回Recordset中資料錄的筆數
RecordSet("欄位名稱") 傳回指定欄位名稱的資料內容
RecordSet(i) 傳回RecordSet中的第i個欄位資料
RecordSet.Fields(i).DefinedSize 傳回RecordSet中的第i個欄位資料欄位長度
RecordSet.Fields(i).Type 傳回RecordSet中的第i個欄位資料欄位資料型別
RecordSet.BookMark 傳回設定的書籤以儲存現在紀錄的位置。RecordSet.AbsolutePostition 將指標移至RecordSet中的某一筆資料上
RecordSet.PageSize 設定每頁顯示的資料筆數
RecordSet.PageCount 傳回分頁後的總頁數
RecordSet.AbsolutePage 傳回目前所在的頁數
RecordSet.AddNew 新增資料至資料表中
RecordSet.Update 更新目前這筆資料
RecordSet.Delete 刪除目前這筆資料
RecordSet.Find 尋找資料值
RecordSet.GetRows 可將Recordset中的資料儲存至陣列中
RecordSet.Sort 可將Recordset中的資料排序

2011年2月28日 星期一

Switching DIV Background Image With jQuery

範例如下:
$('#divID').css("background-image", "url(/myimage.jpg)"); 

$('#divID').click(function()
{
  // do my image switching logic here.
});

$('#divID').mouseover(function()
{
  // do my image switching logic here.
});

$('#divID').mouseout(function()
{
  // do my image switching logic here.
});
 

2011年2月25日 星期五

表格的colspan在firefox顯示不出來怎麼辦?

參考資料:http://thedesignspace.net/MT2archives/000376.html

<table border=1>
<tr style="display:block">
<th colspan="3">
Using display:block on this table. This th should span 3 columns
</th>
</tr>
<tr> 
<td>cell 1</td>
<td>cell 2</td>
<td>cell 3</td>
</tr>
</table>
<table border=1>
<tr style="display:table-row">
<th colspan="3">
Using display:table-row on this table. This th should span 3 columns
</th>
</tr>
<tr> 
<td>cell 1</td>
<td>cell 2 </td>
<td>cell 3</td>
</tr>
</table>
把display:block改用display:table-row,就ok啦!


2011年1月27日 星期四

PHP限制顯示字數語法,中英文混雜時不亂碼

資料來源:http://tommy.ironman.tw/php-syntax-restrictions-in-words-in-english-and-chinese-will-not-garbled-mixed/


<?php
//裁切字串
function cut_content($a,$b){
    $a = strip_tags($a); //去除HTML標籤
    $sub_content = mb_substr($a, 0, $b, 'UTF-8'); //擷取子字串
    echo $sub_content//顯示處理後的摘要文字
    //顯示 "......"
    if (strlen($a) > strlen($sub_content)) echo "...";
}
 
//以上程式已經包裝起來,您可存放在例如:function.php網頁
//往後只要使用include("function.php");
//加上 cut_content($a,$b);即可,不需每次撰寫.
//$a代表欲裁切內容.
//$b代表欲裁切字數(字元數)
?>

2011年1月16日 星期日

ASP儲存遠端圖片至網站

資料來源:http://www.pro-soho.com/Blog/article.asp?id=274

<%
'先下載遠端圖片
url="http://www.im286.com/images/im286/logo.gif" '遠端圖片位址
savepath="D:\photo\" '保存路徑
'為檔重命名
randomize
ranNum=int(999*rnd)
filename=year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum
'為檔重命名結束
set xmlhttp=server.createobject("Microsoft.XMLHTTP")
xmlhttp.open "get",url,false
xmlhttp.send
img = xmlhttp.ResponseBody
set xmlhttp=nothing
set objAdostream=server.createobject("ADODB.Stream")
objAdostream.Open()
objAdostream.type=1
objAdostream.Write(img)
objAdostream.SaveToFile(savepath&filename&".jpg")
objAdostream.SetEOS
set objAdostream=nothing
'圖下載結束
Set Upload = Server.CreateObject("Persits.Upload") '打開物件
Set File = Upload.OpenFile(savepath&filename&".jpg") '打開已經保存的檔

If File.ImageType <> "JPG" and File.ImageType <> "GIF" and File.ImageType <> "BMP" and File.ImageType <> "PNG" Then
Upload.DeleteFile savepath&filename&".jpg" '如果格式不正確就刪除這張已下載的圖片
response.write "錯誤的圖片格式"
end if
'登出實例
Set Upload = nothing
Set File = nothing
%>