專業的油漆工程幫您油漆粉刷,油漆價格合理
我們包辦您整個油漆工程
隔熱工程免費到府勘漏,20年經驗,精準抓漏
根治壁癌,專業施工,誠信保固

首頁  •  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 人回應

    姓名:
    佈告內容: