提供裝潢工程相關案件,線上超過上百筆精選裝潢案件 都能在這找到屬於自己的合適案件,找裝潢工程機會 | 想要搬家,讓專業的來,細心運送大小家具 免費估價專業包裝,輕鬆遷移免煩惱 |
解決許蓋功問題 |
房東:貓貓 發表時間:2007-02-25 |
這就是目前筆者使用於OSC處理中文字串的函數集,有興趣的讀者不妨自行參考big5_func.inc一檔。事實上如果要處理許蓋功等"5C"的問題,在big5_func裡只用到兩個函數,也就是big5_addslashes和big5_stripslashes,而這兩個函數的功能除了擁有原來addslashes跟stripslashes的功能之外,最重要的就是可以分辨出哪些是中文字,哪些才是真正的跳脫字元。舉例來說: 使用php時的程式碼: echo addslashes('許蓋功'); echo stripslashes('許蓋功'); ?> 結果是: 許\蓋\功\ 頂? 使用big5_func字串函數集的程式碼: echo big5_addslashes('許蓋功'); echo big5_stripslashes('許蓋功'); ?> 結果是: 許蓋功 許蓋功 這樣的確可以解決php處理蓋功等相關中文字的問題,但是,同樣的當你寫入mysql資料庫時仍然無法解決跳脫字元的問題而出現稍早提過的錯誤,因為" 許蓋功"內還是含有"5C"的字元。因此,當你決定使用big5_func來處理時,就必須將mysql的charset也一並改為BIG5且不可讓許蓋功等字放在要插入資料字串的最後面。請參考上述php的跳脫字元一節。此時,還有一個比較嚴重的問題是,變更charset是必須重新編譯mysql的,也就是說如果你是已經運作正常的主機,必須重新安裝mysql server並加入charset=big5的參數,若如果你是租用的網頁主機,那問題就會變得更為複雜,因為主機供應商通常不會特別因為你要使用big5_func的函數而重新編譯他的mysql server。 因此,筆者於光碟附的繁體中文OSC版本,僅針對mysql server的charset為latin1做修正,所以,如果你的mysql server的charset設定為big5,則參考本章所提的觀念,應該可以很輕鬆修正許蓋功的問題了。 筆者於目前OSC版本的修改方式為(mysql server charset=latin1) 1.開啟 [webroot]/catalog/includes/functions/database.php 找到 function tep_db_input($string) { return addslashes($string); } function tep_db_prepare_input($string) { if (is_string($string)) { return trim(tep_sanitize_string(stripslashes($string))); 改為 function tep_db_input($string) { return addslashes(big5_stripslashes(($string))); } function tep_db_prepare_input($string) { if (is_string($string)) { return trim(tep_sanitize_string(big5_stripslashes(big5_addslashes($string)))); 2.開啟[webroot]/catalog/admin/includes/functions/database.php 找到 function tep_db_input($string) { return addslashes($string); } function tep_db_prepare_input($string) { if (is_string($string)) { return trim(stripslashes($string)); 改成 function tep_db_input($string) { return addslashes($string); } function tep_db_prepare_input($string) { if (is_string($string)) { return trim(big5_stripslashes($string)); 這樣就可以解決大部分因許蓋功造成的問題。 OSC前台無法搜尋許蓋功等產品問題 這個問題還是跳脫字元"5C"搞的鬼,當我們在前台想要搜尋跟"許蓋功"有關的商品時,所產生的sql語法會像: select * from tablename where products_name like '%許蓋功%' 這樣的sql語法放到mysql裡面,因為功的第二個byte就是"5C"跳脫字元,實際卻被誤判成: select * from tablename where products_name like '%許蓋?\%' 因此,就造成了,明明資料庫裡有許蓋功相關的商品,就是怎樣也搜尋不到相關的產品資料。 那麼,要如何才可以修正這個錯誤呢?答案就是想辦法讓你的sql語法變成這樣: select * from tablename where products_name like '%許蓋功\\\%' 所以你會看到筆者的做法: 開啟[webroot]/catalog/advanced_search_result.php 約在256行: 找到 default: $keyword = tep_db_prepare_input($search_keywords[$i]); $where_str .= "(pd.products_name like '%" . tep_db_input($keyword) . "%' or p.products_model like '%" . tep_db_input($keyword) . "%' or m.manufacturers_name like '%" . tep_db_input($keyword) . "%'"; if (isset($HTTP_GET_VARS['search_in_deion']) && ($HTTP_GET_VARS['search_in_deion'] == '1')) $where_str .= " or pd.products_deion like '%" . tep_db_input($keyword) . "%'"; $where_str .= ')'; break; 改成 default: $keyword = big5_addslashes(stripslashes(big5_addslashes(tep_db_prepare_input($search_keywords[$i])))); $keyword1 = big5_addslashes($search_keywords[$i]); //output -> 功\\ $keyword = str_replace( chr(92).chr(92) ,chr(92).chr(92).chr(92),$keyword1); // 將 功\\ 換成 功\\\ $where_str .= "(pd.products_name like '%" . $keyword . "%' or p.products_model like '%" . $keyword . "%' or m.manufacturers_name like '%" . $keyword . "%'"; if (isset($HTTP_GET_VARS['search_in_deion']) && ($HTTP_GET_VARS['search_in_deion'] == '1')) $where_str .= " or pd.products_deion like '%" . $keyword . "%'"; $where_str .= ')'; break; 後記 由於BIG5所造成的問題幾乎無所不在,筆者認為除非BIG5有一個完整的補救計劃,否則許蓋功將會一直困擾著所有架站人。在此,筆者也試圖透過這樣的說明,讓每一位想架站卻又遭受此一問題困擾的人自己找到解決的辦法。最後在此也特別聲明,BIG5的問題可能不只這些,也可能相當棘手,甚至超出筆者所能解決的範圍,但,如果你有任何問題,也歡迎你到 網路甘仔店 社群提出,相信我們有許多熱心的人可以一同來解決BIG5的問題。 |
|
廣利不動產-新板特區指名度最高、值得您信賴的好房仲 您的托付,廣利用心為您服務 廣利不動產-板橋在地生根最實在--新板特區指名度最高、值得您信賴的好房仲 完整房訊,房屋、店面熱門精選物件,廣利不動產 優質仲介,房屋租賃、買賣資訊透明,交易真安心! |
姓名: | |||
佈告內容: | |||
其他選項: | |||
|