2010年8月24日 星期二

convert.ToInt32, (int), int.Parse的差別

忽然想知道這三者是否等價,結果查了一下發現有一些細微差別
這篇文章主要從這邊看來
Convert.ToInt32、(int)和int.Parse三者的区别2008-06-26 07:01 P.M.Convert.ToInt32、(int)和int.Parse三者的区别:

結論:
1. convert.toxxx針對物件,碰到null回傳0所以不會失敗,
轉換規則是四捨五入
2. int.parse只能處理字串,碰到null會失敗,要有檢查機制(==null? tyr/catch),
轉換規則:無,所以只能用於整數字串
3. (int)負責轉型,只能針對簡單資料
規則是無條件捨去


Convert.ToInt32、(int)和int.Parse三者的區別:
前者適合將object類類型轉換成int類型,如Convert.ToInt32(session["shuzi"]);
(int)適合簡單資料類型之間的轉換;
int.Parse適合將string類類型轉換成int類型,如int.Parse(session["shuzi"].ToString())。


(1)這兩個方法的最大不同是它們對null值的處理方法:
Convert.ToInt32(null)會返回0而不會產生任何異常,但int.Parse(null)則會產生異常。
沒搞清楚Convert.ToInt32和int.Parse()的細細微區別時千萬別亂用,否則可能會產生無法預料的結果,舉例來說:假如從url中取一個參數page的值,我們知道這個值是一個int,所以即可以用Convert.ToInt32(Request.QueryString["page"]),也可以用,int.Parse(Request.QueryString["page"]),但是如果page這個參數在url中不存在,那麼前者將返回0,0可能是一個有效的值,所以你不知道url中原來根本就沒有這個參數而繼續進行下一下的處理,這就可能產生意想不到的效果,而用後一種辦法的話沒有page這個參數會拋出異常,我們可以捕獲異常然後再做相應的處理,比如提示用戶缺少參數,而不是把參數值當做0來處理。
(2)還有一點區別就是
a. Convert.ToInt32(double value)
如果 value 為兩個整數中間的數位,則返回二者中的偶數;即 3.5轉換為4,4.5 轉換為 4,而 5.5 轉換為 6。 不過4.6可以轉換為5,4.4轉換為4
b. int.Parse("4.5")
直接報錯:"輸入字串的格式不正確".
c. int(4.6) = 4
Int轉化其他數值類型為Int時沒有四捨五入,強制轉換

int.Parse是轉換String為int
Convert.ToInt32是轉換繼承自Object的物件為int的.
你得到一個object物件,你想把它轉換為int,用int.Parse就不可以,要用Convert.ToInt32.

個人總結:
(1)Convert.ToInt32的參數比較多,Int.Parse只能轉換string類型的.
(2)Parse就是把String轉換成int,char,double....等,也就是*.Parse(string) 括弧中的一定要是string.
(3)Convert可以提供多種類型的轉換,也就是Convert.*()括弧中可以為很多種類型(包括string).
(4)至於效率上的區別可以看看這遍文章:《細說Convert和Parse到底那個效率高》

SQL語法探討:關於left/right join和inner join

其實以前一直無法理解left/right join的存在理由

以資料準確性和資源利用率來說,inner join或者說 select * from table where id=‘id’比起left好多了

不過這幾天經過學長的開導,發現了left join之類的存在理由

簡單來說,資料完整性

如果我們有一個訂單table_order,裡面有連結到客戶資料表table_cus的id_cust

使用inner join時,當id_cust在table_cust中不存在時,該資料就無法被選擇到

如 select a.order, b.name_cust from table order a , table_cust b where a.id_cust=b.id_cust where a.date between ‘2010/1/1’ and ‘2010/2/1’

這會造成資料的缺失,

簡單來說就是本來有100筆資料

但是其中10筆的id_cust在table_cust中不存在時

select結果就只有90筆

這種結果的問題非常大

如果放在別的情境中,當客戶發現這些資料不全時就會質問開發者

開發者需要從頭追蹤才能取得完整資訊

學長的說法是與其這樣,不如使用left join取得全部資料

之後再來處理對應的資料缺失問題

例如顯示客戶資料不存在並提示新增客戶資料之類

這個理由非常的能夠說服人

難怪有人說剛從學校畢業都用inner join

不過業界兩三年後就都用left join了 XD

2010年8月20日 星期五

datagridview行頭加上編號或自訂

設定datagridview的行頭內容指令為
dataGridView2.Rows[i].HeaderCell.Value="字串"

因此寫一個方法設定,並在databind後呼叫即可
大致如下

/// 
/// 在headcell加入編號
/// 
private void mtdSetHeadcell()
{
  if (dataGridView1.Rows.Count>0)
  {
    for (int count = 0; count < dataGridView1.Rows.Count; count++)
    {
      dataGridView1.Rows[count].HeaderCell.Value = Convert.ToString(count + 1);
    }
  }
}



如果datagridview有排序功能,要註冊DataBindingComplete事件並呼叫
private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
mtdSetHeadcell();
}

PHP mysql UTF8 全解法

先說一下基本概念
mysql:
在資料儲存時,要確認所使用的編碼
建立連結時,有預設編碼
解析資料時,有預設編碼
PHP:
由於建立資料連結和解析資料時,要確認編碼

因此,整個連結流程中,要確認以上過程中的編碼


最正統解法:
建立DB連結後,執行mysql_query設定,讓PHP以utf8編碼方式存取mySql

$conn = mysql_pconnect($hostname_alcd, $username_alcd, $password_alcd) or trigger_error(mysql_error(),E_USER_ERROR);
mysql_query("SET NAMES utf8",$conn);
mysql_query("SET CHARACTER_SET_CLIENT=utf8",$conn);
mysql_query("SET CHARACTER_SET_RESULTS=utf8",$conn);


另一作法,直接設定APACHE、PHP、MYSQL的header
以下來源:yes298,
1. 用 vi /etc/httpd/conf/httpd.conf 設定Apache中的語系為:( (記得restart)
AddDefaultCharset UTF-8

2. 用 vi /etc/php.ini 設定php中的語系為:( (記得restart)
default_charset = "utf-8"

3. 用 vi /etc/my.cnf 設定MySQL中的語系為:( (記得restart)
[mysqld]
init_connect='SET NAMES utf8'
default-character-set=utf8
[client]
default-character-set = utf8

4. 建立資料庫時選擇語系: (記得清除DB Cache)
DROP DATABASE IF EXISTS `aa`;
CREATE DATABASE `aa` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
USE `aa`;

CREATE TABLE IF NOT EXISTS `aat` (
`id` char(1) NOT NULL default '1',
`myStr` varchar(200) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

5. 用UltraEdit(v11.20a版) 轉換所有ANSI格式的php檔案轉化為UTF-8格式:
File --> Conversions --> ASCII to UTF-8 (Unicoding Editing)
( 在UltraEdit中按Advanced --> configuration --> File Handling
--> Unicode/UTF-8 Detection --> 剔選Auto detect utf-8 files )
如有需要時,可執行Remove BOM.php. 當用WinXP的Notepad將php檔由ANSI轉為UTF-8時,
因檔頭有BOM,會引起排版問題,故必須移除,執行Remove BOM.php即可自動移除.
Remove BOM.php可由以下網址下載:
http://www.hoyo.idv.tw/hoyoweb/document/view.php?sid=13&author=hoyo&status=view

6. 在php檔中必須加入:
<html>\ <head>
<meta equiv="Content-Type" content="text/html; charset=UTF-8">
</head>\<body>

7. 在連接DB的檔中必須加入3行mysql_query才ok:
$host="localhost"; $DBname="aa";
$user= "root"; $passwd = "";
$link = mysql_connect($host,$user,$passwd) or die ("Fail");
$db = mysql_select_db($DBname, $link) or die ("Fail");
// 要在真正query DB取出資料前,加入以下3行
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER_SET_CLIENT=utf8");
mysql_query("SET CHARACTER_SET_RESULTS=utf8");
$sql = "select * from aat where crid='1'";
$rows = mysql_query($sql);

8. 在php檔中, 如有需要須注意: [Optional]
運用htmlentities和htmlspecialchars時,要似如下:
$chars = htmlentities($chars,ENT_QUOTES,"UTF-8");
$chars = htmlspecialchars($chars,ENT_QUOTES,"UTF-8");
並且在顯示前要用
$chars = html_entity_decode($chars,ENT_QUOTES,"UTF8");
如有用過addslashes()或mysql_real_escape_string()記得用以下:
$chars = stripslashes($chars);
如有需要可以用以下function將不同編碼轉換:
$chars = iconv('Big5','UTF-8',$chars); //由Big5轉為UTF-8

Microsoft Access Database Engine 2010

由於公司有一個使用64位元環境的需求,因此需要弄一套可以在64位元環境上讀取excle檔案的環境
眾所皆知的Jet OleDB 4.0是不能在64位元上面跑的
不過MS剛好在前陣子放了Microsoft Access Database Engine 2010可轉散發套件
因此今天下午被安排進行這東西的測試

以MS的傳統,我已經預期好會有許多奇妙的問題,也買好了泡麵stand by...
不過今天解決的過程異常順利,該說MS真的越來越強了嗎?

閒話不多說
其實這次只改了一個connection string就可以用了,只是內容有點奇怪
Microsoft Access Database Engine 2010安裝完後,網頁上的說明是:

1. 如果您是應用程式的使用者,請參閱應用程式文件,以取得如何使用適當驅動程式的詳細資訊。
2. 如果您是使用 OLEDB 的應用程式開發人員,請將 ConnectionString 屬性的 Provider 引數設定為 “Microsoft.ACE.OLEDB.14.0”
◦如果您連線至 Microsoft Office Excel 資料,請將 "Excel 14.0" 新增至 OLEDB 連接字串的擴充屬性。
3. 如果您是使用 ODBC 連線至 Microsoft Office Access 資料的應用程式開發人員,請將連接字串設定為 “Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=path to mdb/accdb file”
4. 如果您是使用 ODBC 連線至 Microsoft Office Excel 資料的應用程式開發人員,請將連接字串設定為“Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=path to xls/xlsx/xlsm/xlsb file”
移除此下載:

不過,14.0是錯誤的!!
正確的是12.0
我原本的conntion string:
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + p_sExcelPath + ";" +
"Extended Properties=\"Excel 8.0;IMEX=1\"";
修改成如下就可以用了,oledbadapter的銜接還沒測試,不過看起來似乎沒有太大問題
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" +
"Data Source=" + p_sExcelPath + ";" +
"Extended Properties=\"Excel 12.0;IMEX=1\"";

下班收工,泡麵下次再來吃吧

Jquery + Autocomplete plugin 使用說明

這是JQ的Autocomplete plugin的介紹文
JQ基本觀念..就不多說了
如果要學JQ的話,可以考慮這本益大資訊~精通JavaScript+jQuery
這本的plugin介紹不多
不過目前沒有看到對plugin介紹很深入的書,因此不如把JS、JQ整個學好一點比較有用
進階點的JQ書也不少,如果已經對JS有觀念的話,直接找JQ書籍也不錯
以上是我的觀點啦

JQ的AUtocomplete有很多套件
這篇所用的是http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/
官方說明:http://docs.jquery.com/Plugins/Autocomplete#Setup
寫的時候版本是JQ 1.3.2, autocomplete 1.0.2
基本重點:
1.Jquery沒有預設指定編碼,最好先進行UTF8設定
找到contentType:application/x-www-form-urlencoded
改成contentType:application/x-www-form-urlencoded; charset=UTF-8
如果資料或頁面是big5時,也要記得先進行轉換

2.可處理的資料格式,一行一筆記錄,各欄位間用 | 分隔
而換行符號要用/n而不是
(HTML寫太順手的話,容易犯這錯誤)
JSON的話,聽說要是這種格式: ["test","test","test 123","test 456"]

3.autocomplete的預設參數是q, 資料來源為web service時要記得

基本方法
1.最基本的寫法
$("ID").autocomplete(資料來源, options);
ex: $("ID").autocomplete("data.php",
{
max:10, scroll:false, width:162,
});
2.result方法在每筆列表資料產生時候都會被呼叫,並擁有三個參數(evt, data, formatted)
$("#mytextbox").autocomplete("clients.php")
.result(function (evt, data, formatted) {
$("#hiddenIDbox").val(data[1]);
});
以上例子能將mytextbox的輸入傳送到clients.php
並在取得回傳值後,將每筆記錄的第二欄位值設定為ID:hiddenIDbox的值



相關方法:
autocomplete(url or data, options)
讓指定的input或text執行,範例:$("#test").autocomplete(data)

result( handler )
得到搜索结果的句柄

search( )
触发一个search事件

flushCache( ) Returns: jQuery
清空缓存


相關參數:
setOptions( options )
參數說明
minChars,Default: 1
觸發執行autocomplete的最小字元數

delay,預設400毫秒
顯示自動自動完成選擇框的延遲時間

cacheLength,預設10
緩存長度。後端儲存的cache次數(?)。最小值1時,只會儲存目前的結果(等於沒有cache)。

matchSubset Boolean
Default: true
匹配子集,預設開啟。要有效的話,cache length要大於1。
不過還不確定運作方式..
Whether or not the autocompleter can use a cache for more specific queries. This means that all matches of "foot" are a subset of all matches for "foo". Usually this is true, and using this options decreases server load and increases performance. Only useful with cacheLength settings bigger than one, like 10.

matchCase, 預設false
大小寫選項。

matchContains,預設false
在字句內尋找。
開啟後,輸入"ba"時會搜尋到"foo bar"。
不該與autofill一起使用(混淆)。

mustMatch,預設false
必須完全匹配。設成true時,
看不懂..
If set to true, the autocompleter will only allow results that are presented by the backend. Note that illegal values result in an empty input box.

selectFirst Boolean
Default: true
如果設置為true則第一個值會被自動選中。
If this is set to true, the first autocomplete value will be automatically selected on tab/return, even if it has not been handpicked by keyboard or mouse action. If there is a handpicked (highlighted) result, that result will take precedence.
extraParams Object

以下是額外的參數,
Extra parameters for the backend. If you were to specify { bar:4 }, the autocompleter would call my_autocomplete_backend.php?q=foo&bar=4 (assuming the input box contains "foo"). The param can be a function that is called to calculate the param before each request.


formatItem Function
Default: Assumes that a single row contains a single value.
對結果進行進階的格式處理,預設的資料型態是一行中一個值,要讓一行有多值,就需要用到formatItem。
autocomplete中的每筆資料產生時,就會觸發這函數。
回傳值的基本型態是
  • xxxx


  • autoComplete會傳遞四個參數,
    1.結果列
    2.索引位置(從1開始)
    3.總資料筆數
    4.搜尋字串
    Provides advanced markup for an item. For each row of results, this function will be called. The returned value will be displayed inside an LI element in the results list. Autocompleter will provide 4 parameters: the results row, the position of the row in the list of results (starting at 1), the number of items in the list of results and the search term.

    formatMatch Function
    Default: formatItem is used
    格式化匹配項
    Use this option if you want to limit the data that autocomplete searches for matches. For example, there may be items you want displayed to the user, but don't want included in the data that's searched. Gets called with the same arguments as formatItem.

    formatResult Function
    Default: Assumes either plain data to use as result or uses the same value as provided by formatItem.
    格式化結果,注意有三個參數(資料項, 資料位置(從1開始),資料筆數)
    Similar to formatItem, but provides the formatting for the value to be put into the input field. Again three arguments: Data, position (starting with one) and total number of data.

    multiple,Default: false
    是否能放多於一個的數值
    Whether to allow more than one autocompleted-value to enter.

    multipleSeparator,Default: ", "
    Seperator to put between values when using multiple option.
    同一行中的分割符號,預設為逗號 ","
    同時也是多重選項中的分割符號


    width
    選擇框的寬度

    autoFill,Default: false
    當選中自動提示框裡面的選項時INPUT框內是否自動補全

    max Number
    Default: 10
    自動完成提示的顯示數量

    highlight Boolean ,Function
    Default: Wraps the search term in a < strong > Element
    高亮顯示當匹配到選擇框的元素。
    Whether and how to highlight matches in the select box. Set to false to disable. Set to a function to customize. The function gets the value as the first argument and the search term as the second and must return the formatted value.

    scroll,Default: true
    當結果集result set大於預設高度時是否使用卷軸顯示

    scrollHeight,高度180
    自動完成提示的卷軸高度用圖元大小表示


    根據其他選項的輸入產生資料
    $("#states").autocomplete(url, {
    extraParams: {
    country: function() { return $("#country").val(); }
    }
    });

    進階參數
    autoFill:(預設值為false):自動填充
    inputclass (預設值: “ ac_input ” )
    這個階層將被添加到輸入框。
    resultsclass (預設值: “ ac_results ” )
    階級為UL認證將包含結果專案(專案的結果是李元素) 。
    loadingclass = (預設值: “ ac_loading ” )

    lineseparator = (預設值: “ \ n ” )
    字元分隔線,結果從後端。
    cellseparator (預設值: “ | ” )
    字元分隔細胞的結果,從後端。
    minchars (預設值: 1 )
    最低的字元數使用者輸入之前, autocompleter啟動。
    拖延(預設值: 400 )
    延遲在毫秒該autocompleter等待後,一按鍵來啟動本身。如果您使用的資料財產設立一個本地陣列,您可能希望增加延遲,以在較短的時限內(如40ms ) 。
    cachelength (預設值: 1 )
    人數後端的查詢結果,存儲在緩存中。如果設置為1 (目前的結果) ,不緩存會發生。不設低於1 。
    matchsubset (預設值: 1 )
    是否或不是autocompleter可以使用一個緩存為更具體的疑問。這意味著所有匹配的“腳”是的一個子集所有匹配的“富” 。通常這是事實,和使用這個選項跌幅伺服器負載,並提高性能。記得設置cachelength ,以更大的數目,如10 。
    matchcase (預設值: 0 )
    是否或不比較是區分大小寫的。唯一重要的唯一如果您使用的緩存。
    matchcontains = options.matchcontains | | 0 ;
    是否或不是比較看來,內(即是否“廣管局”匹配“富網吧” )的搜索結果。唯一重要如果您使用的緩存。
    maxitemstoshow (預設值: -1 )
    限制的結果數量將顯示在下拉。這是非常有用的如果您有大量的資料和不想為使用者提供一份清單,列出可能包含數以百計的項目。要禁用此功能,將該值設置為-1 。
    mustmatch (預設值: 0 )
    如果設置為1 ( True ) , autocompleter將只允許結果是由後端。請注意,非法價值觀的結果,在一個空的輸入框。在為例,在本月初的檔,打字“頁腳” ,會導致一個空的輸入框。
    extraparams (預設值: ( ) )
    額外的參數為後端。如果你要指定(酒吧: 4 ) , autocompleter將要求my_autocomplete_backend.php問=富酒吧= 4 (假設輸入框包含“富” ) 。
    寬度(預設值: 0 )
    寬度設為下拉層。如果一個非正整數是指定的,那麼寬度的方塊,將取決於寬度的投入要素。一般來說,您會想要離開這個價值。然而,在某些情況下,您可能有一個小的投入要素如下拉層的需要,顯示了很多的選擇。在這種情況下,您可以指定一個較大的規模。
    selectfirst (預設值:虛假)
    如果是這樣的設置為True ,第一次自動完成的價值將被自動選定的標籤/回報率,即使沒有親自通過鍵盤或滑鼠的行動。如果有一個親自(突出) ,結果,這一結果將優先考慮。
    selectonly (預設值:虛假)
    如果是這樣的設置為TRUE ,和只存在一個自動當用戶點擊標籤/返回,這將是選定的,即使它並未親自通過鍵盤或滑鼠的行動。這是壓倒selectfirst 。
    formatitem (預設值:無)
    一個JavaScript函數,可以提供先進的標記為一個專案。每一行的結果,此功能將被稱為。返回的值將被車廂內所展示的李元素在結果清單中。 autocompleter將提供3個參數:結果連續的立場,列在名單的結果,以及有多少個項目,在結果列表。見的原始程式碼http://www.dyve.net/jquery?autocomplete一個例子。
    onselectitem (預設值:無)
    JavaScript函數將被稱為當一個項目被選中。該autocompleter將指定一個單一的說法,作為李元素被選中。李元素,這將有屬性的“額外”包含一個陣列的所有細胞,後端指定。見的原始程式碼http://www.dyve.net/jquery?autocomplete一個例子。
    onfindvalue (預設值:無)
    JavaScript函數將被稱為當findvalue ( )方法是所謂的。該函數會予以通過,專責李元素-就像o nselectitem功能。
    如果您想要做更多與您的autocompleter ,你可以改變一些方案對飛。
    該autocompleter訪問作為一個屬性,輸入框。
    例如:
    / /設置autocompleter
    無功交流= $ ( “ # input_box ” ) 。自動( “ my_autocomplete_backend.php ” ) ;
    / /會看的價值,自動框的基礎上,在文字輸入的元素
    交流[ 0 ] 。 autocompleter.findvalue ( ) ;
    有下列功能,可被稱為影響的行為,在執行時間:
    findvalue ( )
    這將研究的價值,目前在投入要素並期待它的價值,看看是否能找到一個匹配的價值。這個功能可以潛在的執行AJAX操作,因此, findvalue ( )函數沒有返回值。相反,你需要具體的一onfindvalue回呼函數將運行。這種方法是有價值的,如果您需要設置自動投入要素的價值通過JavaScript和“價值”的文本欄位映射到擴展屬性存儲在李元素的“額外”的財產。
    flushcache ( )
    這刷新緩存。
    setextraparams (目標)
    這集的額外參數的autocompleter ,以目標(即應該是一個JavaScript物件,見上文) 。
    它的往往是明智的刷新緩存後,要求setextraparameters

    正規表示式說明和工具紀錄

    程式Expresso是各不錯的asp.net正規表示式檢驗工具
    正規表示式在ASP.NET上和其他的語言中用法很類似
    不過所用的符號上有些是不同的
    如果要套用到其他語言的話,要特別注意這點


    另外,還有一個說明正規表示式很清楚的中文網站
    http://blog.xuite.net/trully.hsiang/man/25582717

    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]

    首字大寫作法

    PS:如果是大寫字,以下招數很可能無效,記得先轉小寫再來處理
    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年5月15日 星期六

    美食軟體

    和美食雜誌合作,根據地點提供餐廳評論?

    現在為何沒有這?

            如何更好?