2010年8月20日 星期五
PHP基本知識
1. 符號
//單行註解
/*...*/多行
':單引號,不對其中字串進行處理
":雙引號,對字串進行動態處理
ex:
$a=1;
echo '$a \\'; ==>列印 $a \\
echo "$a \\"; ==>列印 1 \
. :連結符號
$ :變數符號
& :變數指標(加在變數前)(傳址)
@ :不顯示錯誤訊息(加在函數前
->:物件的屬性或方法
=>:陣列的元素值
?: :三元運算子
escape:
\" = 雙引號
\\ = 反斜線
\n = 換行
\r =送出
\t = 跳位TAB
2. 流程
if:
if($a>$b){
echo '1';
} elseif {
echo '2';
} else {
echo '3'; }
while1:
while ($a<$b){
echo '1'; }
while2: (應該會被廢
while($i <10):
echo '2';
endwhile;
do..while:
do {
...
if (..){
break;
}
} while (....);
for: for也可以像while使用冒號(用endfor結束)
for1:
for ($i=1,$i<=10, $i++){
...
if (..) {break;} //可用break跳出for循環
}
for2: //
for ($i = 1; $i <= 10; print $i, $i++);
資料庫連線方式說明
http://dyna.hcc.edu.tw/php/class4_4.htm
重點:
example_table(sn, name)
$link=mysql_connect($server,$userName,$userPassword);
mysql_select_db($dbNAME)or die("無法選擇std資料庫");
$sqlResult=mysql_fetch_array(mysql_query($sqlQuery))or die("錯誤查詢 Query ERROR"); //result type有三種,mysql_assoc:index使用text;mysql_num: index使用num;mysql_both(預設);
while($sqlResult){
echo $sqlResult["sn"],$sqlResult["name"];
}
//insert
$insertQuery = "insert example_table (sn, name) values("1","piceman");
mysql_query($insertQuery) or die("新增錯誤");
//update
$updateQuery = "update example_table set sn="2", name="Piceman" where sn='1'";
mysql_query($updateQuery) or die("更新錯誤");
//delete
$deleteQuery = "delete from example_table where id='1'";
mysql_query($deleteQuery) or die ("無法刪除");
mysql_close($link);
其他函數
mysql_num_rows, mysql_fetch_row (不建議使用), mysql_data_seek , mysql_insert_id ,mysql_free_result ,mysql_error
PHP字串處理技巧
如果要替換的字串是英文,可以使用stripos判斷欲替換字串是否在開頭,是的話就用ucfirst給予大寫
搜尋字串時,比較好的作法是用正規表示式,關鍵字preg,P是PCRE的意思
其實mysql也有類似函式,不過兩者所用的delimiter不太一樣,這點要注意
簡略的PHP字串處理函式,引自http://mail.ttes.tcc.edu.tw/~shiuann/myblog/read.php?20
[code]trim();:去頭尾空白。
ltrim();:去頭部空白。
chop();:去尾部空白。
nl2br();將”\n”換行改成
。
print();同作用同echo,但print是函式,傳回布林值。
printf();格式化字串,傳回整數。
sprintf();格式化字串。 [separator]
轉換規格%[顯示寬度][-][][.小數位數]型別:有-代表向左靠齊,沒-代表向右。
%b:將變數解釋為整數,並以二進位顯示。
%c:將變數解釋為整數,並以字元顯示。
%d:將變數解釋為整數,並以十進位顯示。
%f:將變數解釋為浮點數,並以浮點數顯示。
%o:將變數解釋為整數,並以八進位顯示。
%s:將變數解釋為字串,並以字串顯示。
%x:將變數解釋為整數,並以十六進位顯示,用a-f。
%X:將變數解釋為整數,並以十六進位顯示,用A-F。
AddSlashes();若有反斜時,加上Slash,讓輸入字串若含特殊字元時,加上逸出字元\,以免存入資料庫時衝碼。Q3上引數為變數時,做完此運算立刻存回此變數,導致變數值改變;較新的版本,引數為變數時,做完此運算不會導致變數值改變。
StripSlashes();若有反斜時,去掉Slash,使資料庫取出資料還原。Q3上引數為變數時,做完此運算立刻存回此變數,導致變數值改變;較新的版本,引數為變數時,做完此運算不會導致變數值改變。
strtoupper();轉大寫。
strtolower();轉小寫。
ucfirst();字串首轉大寫。
ucwords();字串中每個Word的字首轉大寫。
strtok(字串,”分隔字元”);:擷取字串的前面到分字元為止。
substr(字串,開始字元,長度);:擷取子字串,第一字元算0;開始字元為負,為字串尾減該數,即字尾算1倒數該數之字元。長度省略則取到字尾;長度為負則取到字尾倒數該數之字元。
strcmp(字串一,字串二);:比較兩字串,相等為0,正為字串一ASC碼大,負數為字串二ASC碼大。
strcasecmp(字串一,字串二);:同上,但不分大小寫。
strlen();:字串長度。
strstr(字串,欲找之子字串);:找到傳回子字串「第一次」出現以後之剩餘字串,找不到傳回「假」。
strchr(字串,欲找之子字串);:同上。
stristr(字串,欲找之子字串);:同上,但不分大小寫。
strrchr(字串,欲找之子字串);:找到傳回子字串「最後一次」出現以後之剩餘字串,找不到傳回「假」。
strpos(字串,欲找之子字串,指定蒐尋之起始位置);:找到傳回子字串「第一次」出現的位置,找不到傳回「假」。字串首位置算0,省略蒐尋起點時,從字串首開始找。但是「假」傳回值是0,字首位置傳回值也是0,會混淆。可以用if(傳回值===fasle)測,如果成立傳回值代表「假」,如果不成立傳回值代表位置0。
strrpos(字串,欲找之子字串,指定蒐尋之起始位置);:找到傳回「子字串字首字元」「最後一次」出現的位置,找不到傳回「假」。字串首位置算0,省略蒐尋起點時,從字串首開始找。
str_replace(蒐尋字串,代換字串,字串堆);:在字串堆中找到「蒐尋字串」並用「代換字串」換掉它們。
substr_replace(字串堆,代換字串,起點,長度);:在字串堆指定的起點及長度,用代換字串換掉它們。起點為0或正,由字串堆頭起算;起點為負,由字串堆尾起算。長度未指定,則換到字串堆尾;長度為0,則插入原字串;長度為正,則取代幾個字串數;長度為負,則自尾端開如取代,停於長度。 [/code]
首字大寫作法
PHP:
//每行的首字大寫
使用ucfirst(str);
//每個字首大寫
ucwords(str);
javascript: 沒有簡單的函式可運用,要搭配regular expression才行
//每行首字大寫
str.substring(0,1).strToUpper.toUpperCase + str.substring(1)
//每個字首大寫
var str="xi nan shi you xue yuan china people"
alert(str.replace(/\s[a-z]/g,function($1){return $1.toLocaleUpperCase()}).replace(/^[a-z]/,function($1){return $1.toLocaleUpperCase()}))
CSS:
這招最酷,也是我寫這篇的主因 XD
透過CSS的 selector first-letter和大小寫樣式就可以用
先說selector
Selector : first-letter { sRules }
如
p a:first-letter { color: green }
div:first-letter { color:red;font-size:16px;float:left; }
大小寫樣式: TEXT-TRANSFORM (引自http://chinese-school.netfirms.com/csst7.htm)
功能 : 設定文字改變 ( 可設無、第一個字母大寫、大寫、小寫 )
語法 : { TEXT-TRANSFORM : NONE︱CAPITALIZE︱UPPERCASE︱LOWERCASE }
範例 : {TEXT-TRANSFORM:CAPITALIZE}
設定英文字母大小寫顯示法。可用值有none(不自動轉換)、capitalize(第一個字母自動轉為大寫)、uppercase(全部自動轉換為大寫)、lowercase(全部自動轉換為小寫)。如text-transform:lowercase,則全部英文字都會自動轉為小寫。
搭配: #id (text-transform:capitalize;}
crystal report 載入報表錯誤
可是程式裡面的try catch竟然沒有撈到exception!?
查了一下,最常見的兩個答案是Server.MapPath和PrintJobLimit
由於我這邊的程式是winform,所以排除第一個答案
第二個答案和registry中的HKEY_LOCAL_MACHINE->SOFTWARE->Crystal Decisions->10.2->Report ApplicationServer->Server>PrintJobLimit設定有關
預設75,測試時可以設為2才方便測試
如果測試後真的是這問題
解決法是在有引用crystal report元件的程式關閉時
確實的將該元件close及dispose
大致如下
class printReport {
private reportWithCrystal _report;
public printReport (){
略
private void printReport _FormClosing(object sender, FormClosingEventArgs e)
{
_report.Close();
_report.Dispose();
}
}
2010年1月25日 星期一
2010年1月20日 星期三
oracle explain plan使用法
接下來,步驟如下
一、建立資料表
CREATE TABLE plan_table
(
statement_id VARCHAR2(30),
timestamp DATE,
remarks VARCHAR2(80),
operation VARCHAR2(30),
options VARCHAR2(30),
object_node VARCHAR2(128),
object_owner VARCHAR2(30),
object_name VARCHAR2(30),
object_instance NUMBER,
object_type VARCHAR2(30),
optimizer VARCHAR2(255),
search_columns NUMBER,
id NUMBER,
parent_id NUMBER,
position NUMBER,
other LONG
)
二、引用以下SQL
set echo on
delete from plan_table
where statement_id = 'MINE';
commit;
COL operation FORMAT A30
COL options FORMAT A15
COL object_name FORMAT A20
EXPLAIN PLAN set statement_id = 'MINE' for
/* ------ Your SQL here ------*/
/*----------------------------*/
/
set echo off
select operation, options, object_name
from plan_table
where statement_id = 'MINE'
start with id = 0
connect by prior id=parent_id and prior statement_id = statement_id;
set echo on
Oracl-12154 無法解析指定的連線 ID
安裝新版oracle client後,發現toad可以連線,但ASP.NET網站無法連線資料庫
ORA-12154: TNS: 無法解析指定的連線 ID
查詢之後,發現幾個線索
1. 環境變數
http://blog.miniasp.com/post/2007/10/Oracle-10g-Client-Installation-Note.aspx
2. oracle的dll改變版本序號寫法
http://blog.miniasp.com/post/2009/08/Solve-ASPNET-cannot-connect-Oracle-DB-using-Development-Server.aspx
3. 同樣是系統變數問題,不過使用registry方法修改
4. VS安裝路徑問題
http://blog.miniasp.com/post/2009/08/Solve-ASPNET-cannot-connect-Oracle-DB-using-Development-Server.aspx
4的情況可以排除,雖然我的環境相同,不過之前可以正常運作
2的情況有點詭異,所以選擇先設定系統變數
由於registry中並沒有3所提及的預設路徑,因此使用了1的解法
參照情況加入了TNS_ADMIN變數後,VS2005就可以正常運作了
2009年11月20日 星期五
iPhone 備份時間過久問題
itunes在備份iPhone時,有時候會碰到備份很久的問題
以下是網路上找到的幾個解法
一、取消錯誤回傳
The Idiots Guide to Making your Iphone Backup fast
根據這篇的說法,iPhone備份通常只需要一分鐘。
但是當備份動作有問題時,iPhone會上傳報告到apple,但由於apple伺服器太慢/檔案太大,因此耗費了許多時間,造成了備份很久的假象。
要取消這動作的話,請按照以下步驟進行
1.把iPhone連線電腦,然後在中間上方會出現同步動作,按[x]取消
2.到左邊的裝置->摘要,把選項中的"當此iPhone連接時自動同步"取消
3.把iPhone拔掉重插一次
4.這次插入後,到裝置->iPhone上按右鍵選擇重置警告訊息
5.按下下面的"同步"按鈕,第一次會出現一段警告訊息如下,其中的別再詢問預設是勾選的,不過我已經取消了。由於這設定預設是傳送且別再詢問,因此iPhone每次會傳送報告。你可能也是第一次看到吧?
![]()
6. 接著可能有點匪夷所思,請取消別再詢問,根據網站所說,如果不出現這個視窗,iTunes在每次備份出問題時都會傳送報告。
也就是說,勾選別再詢問=以後都要傳送給Apple..Apple的語法怪怪的。
根據我的測試,也確實是如此。如果有人有不同的發現歡迎跟我說。
7.接著就簡單了,請選擇不要傳送,然後就可以很快的備份完成,同步的話就要看你更新的資料量了。8.以後要同步時,記得以下步驟,a. 自己點選同步 b.取消別再詢問 c. 選擇不要傳送,這邊要說明一下,b/c只有在同步出現問題時才會出現,所以你可以檢查一下你的同步有哪邊有問題。以我為例的話,我的機器有兩個問題,a. PodCast中的某些檔案無法在iPhone播放, b. 電腦上的某些檔案無法在iPhone播放。
最後提醒一點,iTunes會先備份愛封上的檔案,然後才更新愛鳳
這表示,如果你用iTunes下載APP,iTunes會先備份愛鳳,然後把APP裝上去。下一次連結時才會把這個APP放到備份檔案中,這時候可能會比較久一點,不過還是比動輒耗時數十分鐘的備份/傳送好太多了。
二、備份檔毀損
根據iPhone backup takes too long – Solution
根據該文,有時候愛鳳的備份檔案會有問題,因此要刪除重建
基本上,iTunes中提供刪除備份檔案的方法。
如果無效的話,你可以到/MobileSync/Backup/中找出備份檔刪除
windows 7 中應該會在C:\Users\xxx\AppData\Roaming\Apple Computer\MobileSync\Backup\xxxxxx\下
愛鳳中的每個APP都會產生兩個檔案,.mdinfo和.mddata,因此一次要砍兩個
不過由於某些APP會有不只一組檔案(因為有cache memory files),所以最好還是先備份一下比較好。
把該目錄下的檔案刪除後,就可以重新備份了。
我沒有用到這招,這應該是最後手段了..
三、我自己的狀況:
我的情況可能比較特殊,不過也可能蠻常見..
由於我沒有辦法從iTunes購買歌曲,所以我的歌都是從電腦拉的
在同一資料夾中,我把MV也一起放進去了
結果在備份的最後會碰到.mpg影像檔案無法同步的問題
因此我把那些檔案從iTunes列表中移除,然後備份就很順了(因為不用傳送錯誤報告)
如果你有相同問題,可以考慮參考看看
2009年11月10日 星期二
NHibernate 常見錯誤
關聯table的xxx.hbm.XML檔沒有設定為內嵌資源
"NHibernate.InvalidProxyTypeException : The following types may not be used as proxies"
把xxx.hbm.xml檔中加入lazy="false"
"NHibernate.MappingException : persistent class ClassName not found" or "NHibernate.MappingException : associated class not found: ClassName"
NH找不到對應的類別,通常是設定問題。
一個簡單的做法是去assembly中設定
2009年11月3日 星期二
NHibernate
受益於JAVA要處理的環境太複雜,因此有人研究了Hibernate
在實作上,NH受到了JAVA的影響,需要處理的設定檔很多
使用時,可以明顯感受到NH所使用的語句簡單,可惜背後邏輯複雜
(這也是NH的學習曲線長的原因之一)
如果是複雜的系統應用,使用NHibernate應該可以有效增加PG的產能
不過NHibernate的效能問題是個隱憂
現在回想起來,NHi似乎只是為了讓Java人員快速上手的工具而已
2009年5月2日 星期六
日常生活中,電腦能做到甚麼?
資訊輸入->處理(分類、計算、轉換、歸類等)->輸出
以上有三個重點,一、要有資訊的輸入。二、所輸入的資訊要有處理規則。三、能夠有明確的輸出格式。
資訊輸入:資訊是啥?一個比較簡單的說法就是能被記錄下來的訊息。
以上的說法有一點小問題,因為資訊其實可以分為內隱和外顯
內隱資訊是難以被記錄的,例如氣味、氣質等較虛幻的
外顯則是相對容易被記錄的,例如身高、體重
另一個問題是數位/類比格式的問題,如果有規則的話,這部分可以透過轉換器來達成,例如modem就是一例。
大部分情況下,電腦/資訊系統的處理目標是外顯資訊。主要問題倒不是無法處理內隱資訊,而是內隱資訊難比被記錄/編碼。因為沒有資訊的輸入,自然就沒有資訊的產出(電腦無法無中生有)。
而處理內隱資訊的難易度則是另一個問題,由於內隱資訊通常較隱晦,比較像是個人價值觀的體現,因此在不同的情況下會產生不同的效果,難以套用單一處理規則。
在處理內隱資訊時,比較常見的應用是統計這種機率性問題。
輸出這部分通常沒有問題,不過由於電腦是數位系統,所以產生了一個先天限制:電腦的輸出只能是數位格式。如果是類比裝置,就需要進行數位類比的轉換。最常見的是modem和音效裝置。
從資訊系統延伸出來的是自動控制系統,在原先的系統上延伸出了對系統的控制
資訊輸入->處理(分類、計算、轉換、歸類等)->輸出到裝置
裝置產生回饋資訊->處理(調整輸出等)->再次輸出->再次產生回饋資訊
這邊會產生兩個限制
第一是裝置上面必須要有接受系統輸出的輸入裝置
另一個限制是該裝置上要有另一個能產生回饋資訊的(輸入)裝置,不過這一部分倒不是必要的(有些時候是射後不理的)
了解以上資訊後,我們可以開始思考問題了
日常生活中,電腦能做到甚麼?->擴展->有哪些事情是我們想要電腦幫忙且電腦可以幫忙的?->有哪些事情是我們不想要/沒想過讓電腦幫忙,但是電腦可以幫忙的?
這部分可以拆成兩個方向思考,一、有哪些事情需要決定?二、電腦能做到哪些事情
一個簡單的方法是從ask.com之類的問問題網站取得第一題的答案再思考能不能使用電腦處理(以及成本)
再次細分後,問題可以決定成以下兩個
一、日常生活中,有哪些資訊是我們想要處理的
二、有哪些裝置是我們可以應用的?包括做為輸入/輸出/資訊
