前三個月心得回顧

當程式設計師前三個月的心得回顧,有些當時記下的心得回顧時發現是錯的。

《php》

ob_get_clean()除了清除緩衝區之外,也會停止輸出緩衝。 --【林俊信】

《oracle》

mysql有sql injection的疑慮,oracle似乎沒有這個問題。可能是因為所有的oracle查詢都必須先經過ociparse,這個函數應該就避免了sql injection的問題。 --【林俊信】

《javascript》

ready=(ready)?ready:ready;

這是在寫js時候寫出來的,看起來很奇妙的語法。如果用一句話來形容,可以稱作是「永無翻身之日」。

如果ready變數之前曾經是0,那麼接下來就永遠無法變成1。

實際上這一行不寫的話也無所謂,也就是說一開始先將ready設成1,接下來判斷是否符號將ready設成0的狀況,不需要再判斷需不需要設成1。

但寫出最上面那一行還唬人的,而且較能強調「永無翻身之日」的感覺。 --【林俊信】

《php》

目前可行的跨網域session作法,就是使用get或post方法將session_id的值傳給另一個網域。目前使用header函數搭配location表頭來傳遞session_id的值。 --【林俊信】

《FLASH》

點擊FLASH裡的鏈結,IE似乎會讀取優先讀取cache的資料,造成應該已變化的頁面仍舊是以舊的頁面來呈現。 --【林俊信】

《PHP》

在PHP裡,使用者可定義沒有參數的函數,並且在之後仍可以傳入參數使用。方法便是使用下列三個函數

mixed func_get_arg(int) — 取得指定的參數內容,傳入的是參數的位置,從0開始計算

array func_get_args(void) — 取得傳入的所有參數清單,以陣列形式表現

int func_num_args(void) — 取得傳入參數的數量

【使用範例】

function testarg($argv){

echo “傳入”.func_num_args().”個參數<br/>”; //顯示 5

echo “<pre>”;

print_r(func_get_args());

echo “</pre>”;

echo “第2個參數是:”.func_get_arg(1); //顯示123

}

testarg(“dd”,123,”46538″,4568,”kdfkdf”); --【林俊信】

《PHP,Mysql》

從mysql的資料區不區分大小寫可能和系統環境有關,例如windows不區分大小寫,Linux區分大小寫。

但php實作的經驗中是區分大小寫的,不管平台是在windows還是linux下。所以這點特殊狀況在操作時要注意。 --【林俊信】

《oracle》

oracle的sql*plus的連線指令是

connect user/password;

其中的 / 是實際指令的一部份,用來分隔資料庫帳號和密碼的,最後再加上 ; 就是完整的指令。

連線之後才能進一步操作oracle。 --【林俊信】

《ajax》

因為javascript有限制不能存取本機的檔案,所以無法利用ajax上傳檔案。一般jquery的上傳套件是利用iframe隱藏實際表單,實際上是把iframe裡的表單submit出去,所以還是同步的作法。 --【林俊信】

《PHP》

使用big5編碼寫程式時,因為會有衝碼的問題,所以會有需要使用addslashes來避免衝碼的問題。但如果是自己在程式裡寫中文,通常在最後一個中文字和雙引號加一個空白就可以避免衝碼的危機。--【林俊信】

《PHP》

從php4轉到php5的平台,第一個要先處理$HTTP_GET_VARS、$HTTP_POST_VARS及$HTTP_COOKIE_VARS等變數的調整。 --【林俊信】

《Oracle》

使用Oracle資料庫有兩個檔案要設定,分別是listener.ora和tnsnames.ora。

listener.ora是用來設定監聽的內容,包含主機名稱和監聽port號。一般是不需要改,但如果有改主機名稱就需要修改這個檔案,否則伺服器無法啟動監聽。

另外的tnsnames.ora是用來設定連線的名稱,包含欲連線的主機及port號。 --【林俊信】

《javascript》

使用setInterval或setTimeout,如果用來呼叫函數使用,而且函數本身也使用setInterval或setTimeout,如果需要 移除setInterval或setTimeout,那麼呼叫函數的id要取消,函數裡的id也要取消,最好設成同一個id比較省事。 --【林俊信】

《jQuery》

之前在測試ajax傳回的資料型態不設為xml,傳回值仍然可以操作dom是正常的,沒想到是瀏覽器個別認定的問題,firefox、chrome可以操作,但IE就不行。所以想要讓ajax傳回值可操作dom,還是要用xml的型態傳回值。 --【林俊信】

《jQuery》

get()方法得到的會是一個陣列,如果要取得單一物件,要加參數,通常是0。另外 $(selector)[0] 這類的語法會得到相同的結果。 --【林俊信】

《PHP》

表單裡如果只有submit,上傳後的$_POST會是空的。 --【林俊信】

《PHP》

session和cookie都必須在輸出前(任何header送出前)就呼叫使用,所以如果有輸出的需要,就必須搭配ob系列函數。 --【林俊信】

《HTML》

切片工作用photoshop感覺比較好做,不會超出去,但版面大小會超乎預期,而illustrator版面正常,但切片工具超乎預期。 --【林俊信】

《jQuery,PHP》

如果使用ajax並且希望server要傳回xml,如果這個xml是由php所產生,不是一個實際的檔案,那麼記得一定要加上 header(‘content-type:text/xml’),否則jquery以xml檔案格式(dataType:xml)接收ajax的回傳結果會出現錯誤。

經測試,如果ajax以非xml的格式接收回傳結果,還是可用透過jquery的selectors來操作dom元件,只要回傳的結果符合xml格式即可,但不需要<?xml version=’1.0’/>。類似下列這種格式即可:

<root>

<item>123</item>

<item>456</item>

</root>

--【林俊信】

《PHP,GD》

經過實際一個點一個點比對,imagepolygon這個gd系列函數所要傳入的點並不一定要按照順序,它自己會找到一個封閉的點的順序,將之連接起來。 --【林俊信】

《PHP》

要當圖片顯示的php檔,相關需要使用的檔案也要引用進來,否則無法顯示。 --【林俊信】

☆email對照表,如果可以直接連到employee最好,如果不行,那就看看能不能每次連線先建立一個暫存資料表,並且從employee抓資料來放,當成employee用。不過,如果不能連,那後者好像也不可行。 --【林俊信】

《javascript,jQuery》

如果有一些屬性可以用javascript物件方式表示,例如obj.checked,在這種條件下如果需要對該屬性進行修改,應採javascript 物件的方式來修改,而不要使用jQuery的attr方法。這種方法就是javascript的原生函數setAttribute,容易產生出乎意料的效 果。 --【林俊信】

《php,oracle》

php5之後要使用php_oci8.dll,系統上必須有oci.dll,而oci.dll必須安裝oracle的client才會有。

取自--http://andy775211.spaces.live.com/default.aspx

--【林俊信】

今天去和教務「聊天」,主要是想瞭解有關一些細節流程的產生,像是班級如何產生,透過瞭解這些細部的流程,讓產生的資料能夠比較好用一點。

在探詢需求的過程,發現開發和需求的對話有些艱辛。像開發系統時,開發的人要知道使用者的需求,而當開發的人去探詢使用者的需求時,使用者也是需要知道開發的人的需求。

當需求無法互相滿足時,對話就會形成障礙。 --【林俊信】

《php》

說寫程式不用數學太好,其實是騙人的。尤其要碰到畫圖、座標等作用時可能都會需要三角函數的概念,沒概念的可能很難繼續下去。 --【林俊信】

《javascript》

取消核選radio、checkbox應使用elm.checked=false,而不要使用setAttribute或 removeAttribute,因為checked是表單物件的內建屬性,不能移除,而setAttribute是XML的設定屬性方法,和 javascript的物件還是有不一樣的地方。 --【林俊信】

《javascript》

表單元件如select、radio、checkbox有專屬屬性如selected,checked等,在不同瀏覽器下有不同的操作方法,例如要取消核 選或選取狀態,firefox可以透過removeAttribute方法取消屬性可達成目的,但在IE下卻會出現預料外的情況;在IE下,無論原始的元 件是否有checked、selected屬性,你都可以透過getAttribute取得屬性值,一是true,一是false,所以在IE下必須透過 setAttribute(“checked”,false)來取消核選或選取。 --【林俊信】(有誤,應以上一則心得為準)

《javascript》

要用 物件名.屬性=’條件’ 這種格式當作判斷條件,如果物件名是null,則script會產生錯誤而停止之後所有的動作。所以最好同時使用 物件名 && 物件名.屬性=’條件’ 這種方式來判斷,這樣就不會影響到後續該執行的動作。 --【林俊信】

《javascript》

各瀏覽器對for in的處理方式不儘相同。結果也會不太一樣。 --【林俊信】

《javascript》

還是有必要熟悉javascript本身的dom跑法。 --【林俊信】

《jQuery》

jQuery很好用,但有時效能並不一定很好。反倒是直接用javascript的語法更輕,更好用。 --【林俊信】

《HTML》

今天為了一組RADIO設為相同的ID屬性,結果找老是找不到正確的值。 --【林俊信】

《PHP》

函數介紹:get_included_files

傳回include,require所載入的檔案清單 --【林俊信】

昨天修改上傳表單的時候並沒有將file欄位名稱陣列註解掉,今天要正式上傳前卻把它注解掉,導致真正檔案上傳時,前面1~5個檔案欄位沒有名稱,因而無法上傳成功。

有時候程式執行成功,之後再修改一行程式碼,可能就要因此多做好幾次的測試。 --【林俊信】

《JAVASCRIPT》

要找到正在作用的物件,可利用增加class屬性的方式來判斷;當focus的時候加上該屬性,而blur的時候移除該屬性,接著只要判斷物件本身是不是擁有該class屬性即可判斷該物件是否為正在作用中。 --【林俊信】

《jQuery》

.hasClass()傳回true/false,用來過濾elements裡的項目,

另可使用.filter()直接篩選項目。 --【林俊信】

《PHP》

imagecreatetruecolor(int width,int height)建立起來的圖片就是黑黑的,而imagecreate(int width,int height)建立的圖片則可以設定背景顏色。 --【林俊信】

《PHP》

$_FILES[‘filename’][‘type’]的結果,每個瀏覽器多少都有些不同。所以檔案的型態並不一定很重要。header的設定直接用application/force-download也行。 --【林俊信】

《SQL》

資料串聯如果需要三張以上的表串聯,最好以兩張做一個子查詢的方式來進行,感覺上這樣效能會比較好一點。例

select a.coA,a.coB,a.coC from (select * from tbla as a inner join tblb as b on a.id=b.id) as a inner join tblc as b on a.ccid=b.ccid --【林俊信】

《javascript》

js檔若要再引入其他js檔,其相對位置的參考應以前者引入的頁面位置為基準。例如,在index.php裡引入js/test.js,而test.js 若要引入ajax/test2.js,相位對置應為ajax/test2.js,和index.php參考的相對位置一樣。 --【林俊信】

《PHP,HTML》

如果表單採「application/x-www-form-urlencoded」編碼,$_GET的值預設是解碼的,所以不需要特別再用urldecode去解碼。

而如果是利用PHP決定查詢字串,利用urlencode先編碼,接收的時候也不需要再利用urldecode解碼。

如果編碼的時候是將整個查詢字串編碼,而不是針對「值」來編碼,將無法利用$_GET取得變數,因為「=」也會被編碼,無法利用「=」來區分$_GET變數及值。 --【林俊信】

《PHP》

要確認檔案是透過引入的方式執行,除了利用debug_backtrace函數來追蹤引入的層數之外,透過上層所定義的變數來判別也是一種作法。 --【林俊信】

《PHP》

繼之前模仿xoops的模組撰寫方式後,今天突發奇想改模仿smarty樣板的概念。

就是把所有需要輸出的資料全部都丟給某幾個固定的變數承接,例如$main。最後再判斷有沒有$main這個變數,有的話再引入樣版檔。

樣板檔的內容其實是單純的HTML主體標籤,在它的<body>標籤裡echo php變數$main。當然變數前後必須再加上php識別標籤(<?php ?>)才行。

因為輸出統一由template.php負責,所以承載輸出資料的變數必須固定才行,但數量卻不一定只能有一個。可以將不同的輸出資料擺到不同的變數,例 如必須放在<head>的資料放到$head,javascript的放到$jsfile…等,然後在樣板檔的適當位置將之echo出來就可 以了。簡易的smarty概念實作就這樣完成。 --【林俊信】

《SQL》

要設定別名(alias),as關鍵字最好不要省略。雖然MySQL官方線上文件有提到可省略as,但測試的結果一直試不出來,總是會出現錯誤。所以為了相容性,需要設定別名的時還是加上as --【林俊信】

《PHP》

以陣列當作函數參數,預設並沒有以傳址傳遞。想要以傳址傳遞陣列參數仍然需要加上「&」。 --【林俊信】

《PHP》

強迫檔案下載標頭

header(“content-type: application/force-download”);

header(“content-disposition: attachment; filename=”.$file); --【林俊信】

《SQL》

若要依據群組語法(group by)之後所產生的欄位作篩選,要用having,而不是where,使用where會不認識群組之後新產生的欄位。 --【林俊信】

《PHP》

GET變數的值如果有空白,處理的過程可能會造成內容中斷。 --【林俊信】

《PHP》

和檔案上傳有關的PHP設定有file_uploads、post_max_size及upload_max_filesize。三者要妥善設定,表單上傳檔案才不會產生問題。 --【林俊信】

《HTML》

檔案上傳表單編碼屬性

enctype=”multipart/form-data” --【林俊信】

《PHP》

$_FILES陣列內容:

$_FILES[‘usrname’][‘name’]

$_FILES[‘usrname’][‘type’]

$_FILES[‘usrname’][‘tmp_name’]

$_FILES[‘usrname’][‘error’]

$_FILES[‘usrname’][‘size’] --【林俊信】

《PHP》

在windows底下,如果檔名裡有中文字,而且程式是以utf-8編碼,檔名務必再轉成big5,否則檔案無法正常開啟。 --【林俊信】

e-mail的表頭項目可以直接參考thunderbird或outlook express的原始信件內容。 --【林俊信】

在使用 PHP 裡的 mail() 來寄信時,如果使用的不是 ASCII 或 ISO8859-1 的編碼,像主旨(Subject)或是寄件者(From:)的欄位就會變成亂碼,解決的方法就是用 BASE64 編碼一下,以下是主旨用 UTF-8 作為字元編碼的範例:

$new_subject = “=?UTF-8?B?” . base64_encode($orig_subject) . “?=”; --【林俊信】

《PHP》

trim($data)指令裡,如果$data是陣列,trim會將$data的內容改為字串”array”,變成一般字串。 --【林俊信】

《javascript》

動態調整select裡的option之後,若要指定某一個option是預設選取的狀態,透過attr新增selected屬性較佳。直接以文字方式加入option,並且附上selected屬性,此方法會有例外的狀況產生。 --【林俊信】

《SQL》

SELECT sum( if( isnull( `reply_cont` ) , 1, 0 ) ) AS a, sum( if( isnull( `reply_cont` ) , 0, 1 ) ) AS b, sum( 1 ) AS c

FROM `guestboard`

從資料庫計算符合條件的數量 --【林俊信】

《php》

ini_get(“register_globals”);

取得某個配置選項的值。如果該配置是on或off之類的值,ini_get回傳後會是1及false。 --【林俊信】

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Proudly using Dynamic Headers by Nicasio WordPress Design