幫你擄獲視覺焦點,專業廣告招牌設計製作
讓公司門面更加亮眼,為你創造商機!
系統家具維修各廠牌冷氣:窗型、分離式、水冷式箱型等保養
冷媒、漏水、壓縮機維修保固。

首頁  •  j2h 論壇 • 程式設計討論     • 

解決許蓋功問題

房東:貓貓
發表時間: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的問題。



  • 贊助網站       

    廣利不動產-板橋在地生根最實在--新板特區指名度最高、值得您信賴的好房仲
    完整房訊,房屋、店面熱門精選物件,廣利不動產 優質仲介,房屋租賃、買賣資訊透明,交易真安心!
    廣利不動產-新板特區指名度最高、值得您信賴的好房仲
    您的托付,廣利用心為您服務



  •  共 0 人回應

    姓名:
    佈告內容:
    其他選項: