2009年7月24日 星期五

PHP裡的 & 運算子

在PHP中 下面這段寫法並不會出現警告訊息
< ?php
$a=&$b;
? >

這也許會讓人覺得 $b 變數未宣告即使用 應該會出現警告才對
但是在PHP官網裡的 What References Do有這一段說明:
Note: If you assign, pass, or return an undefined variable by reference, it will get created.

所以 當 &$b 出現時 $b 就會被創造 並且設為NULL 然後將 $a 設為 $b的 alias
因此上面的寫法在PHP裡 其實是合法的

不過PHP裡還有我較有疑問的地方是 只要一個變數設為NULL 則使用不存在的index也不會有事 例如:
< ?php
$a=NULL;
$b=$a['aaa']['bbb'];
? >
以上的寫法 在PHP中是不會出現警告訊息的 這是蠻讓人奇怪的一點

2009年7月23日 星期四

當網頁裡event發生時 阻擋default action的執行

在網頁裡 一個event發生時 通常會有default action
例如在一個text element中打字 則會發生 onkeydown onkeypress onkeyup這三個事件
default action就是在輸入框裡顯示打入的字串

想要阻止瀏覽器的default action執行時 如果是用inline的方式註冊event handler 直接return false就可以了
例如 < input type="text" onkeypress="return false;" >

但如果使用addEventListener註冊 event handler 就需採用別的方法 而且IE和firefox必須用不同的方法
例如:
< input type="text" id="text_element" >

< script type="text/javascript" >
function foo(e)
{
if (e.preventDefault)
e.preventDefault(); //firefox
else
e.returnValue=false; //IE
}
document.getElementById('text_element').addEventListener('keypress', foo, false);
< /script >

W3C的標準是用event object的preventDefault method去阻擋掉default action的發生
但是IE並沒有實作這個method 不過IE的event object有returnValue這個property
將這個屬性設為false一樣可以阻擋掉default action的發生
因此可以用上面的寫法去支援IE與firefox

2009年6月30日 星期二

javascript RegExp object literal syntax

今天看到一段javascript code 長的像下面這樣
if (/pattern/i.test(str))
//do something

一開始我看不懂/pattern/i到底是什麼東西
查了以後才知道 原來這是正規表示式物件的實體語法(RegExp object literal syntax)
之前只知道javascript有陣列實體語法 例如
var a=[1, "kerker", 555];

還有物件實體語法例如
var o={
p1 : 1,
p2 : "kerker",
p3 : {pp1:1, pp2:2} //巢狀物件
};

這些語法已經很方便了 但是我沒有想到javascript還有RegExp物件的實體語法!!
我有一瞬間震驚了 想不到javascript這麼方便阿...
不過也許這事廣為人知的 只是我太孤陋寡聞/_\(JavaScript:The Definitive Guide不知道拿到多久了 完全沒有好好看過 冏)

恩..javascript 真的是一個很不錯的語言阿

script tag的defer屬性

當瀏覽器瀏覽網頁時 他會一邊parse HTML code並顯示出來 一邊parse script標籤中的script code並執行
然而 在使用script標籤時 若是加上defer屬性 像這樣 < script defer="defer" >
則瀏覽器會在整個頁面都load完成後才開始去parse此標籤內的script code並執行
如果在script tag中的code都是function之類的 不會改變頁面內容的code的話 則加上defer屬性可以加快頁面被顯示的速度
defer屬性是HTML4的標準 FX跟IE現在都支援此屬性

2009年6月27日 星期六

mysql subquery

mysql select語句中加上 limit x 就可以限制查詢最多回傳x筆資料
但是如果需要的情況是 只想查詢資料表中的第1~第50筆那要怎麼辦
這可以用mysql的子查詢語法來達成 例如

select * from (select * from table1 limit 50) as derived_table where id!='kerker';

括號中間的select語句會先做查詢 然後回傳第0~49筆資料 接著外面的select再從這50筆資料作查詢
需要注意的是必須要給一個alias name(也就是上面的devived_table)給derived table才是合法的查詢

2009年6月12日 星期五

variable-length array

本來的C語言(C99之前)是不能用變數來宣告陣列長度的 例如:
int i[length];

後來C99標準中允許了這樣的宣告方式 但是C++並沒有這樣的標準
C++的動態陣列還是使用vector比較好

http://www.clarkcox.com/blog/?p=74#footnote_0_74
這裡有一篇文章寫到VLA的壞處 當stack pointer指到不正確的地方時 程式會發生什麼事沒人知道
這的確是直得思考的地方

另外 要將多維陣列傳給函式當參數時 除了第一維的維度可以不給之外 其餘都要給
例如 int func(int array[][4]); 這樣的寫法

2009年6月9日 星期二

client端執行filesystemobject

很久之前試過在client端執行filesystemobject去做寫檔的動作
當時IE跳出提示訊息 而只要使用者同意 就可以執行
最近聽說為了安全性 現在IE已將adodb.stream或是shell.application這類activex物件禁止

於是我用以下code試著在client端做寫檔的動作
dim fso
set fso=createobject("Scripting.FileSystemObject")
set test=fso.createtextfile("C:\\test.txt", true)
test.writeline("kerker")
test.close

網頁沒有提示 什麼都沒有發生 看來是已經禁止了
後來找到原因 是IE把設定改掉了
只要到網際網路選項->安全性->自定等級->起始不標示為安全的activex控制項 改成提示
再次執行 IE就跟上次一樣 跳出提示訊息 同意後 這段code就成功執行了