1. 程式人生 > >關於TP3.2框架讀取Sql server中文欄位資料以及處理亂碼的一些小心得

關於TP3.2框架讀取Sql server中文欄位資料以及處理亂碼的一些小心得

最近要做一個專案,需要使用TP3.2框架,之前什麼也不會,就硬著頭皮上了,結果真的鬧了挺多emmmmmm挺低階的錯誤,就像SQL Server中文欄位的讀取,一開始我是照著讀取英文欄位的格式來寫的,在Model層裡

 public function getAdminByUsername($username='') {
        $res = $this->_db->where('username="'.$username.'"')->select();
        return $res;
    }

然後我試著傳了一箇中文值 '歡送' 進去,但是這樣做的結果

提示列名‘歡送’無效,我照著提示的錯誤去搜索,但是搜尋到的結果跟我想要的並不一樣,我覺得我的格式沒問題啊,輸入的字串,所以在where裡面也是做了對應的處理的

我找了一天多也沒找到解決方法,就很難過。

最後發現錯誤的原因比較偶然,我在四處搜尋時候看到了這個,忘了是哪裡看到的了

$map['acct']=acct;
$res=$this_db->where($map)->select(); 

然後模仿它的格式,把自己的程式碼改成這樣

 public function getAdminByUsername($username='') {
        
$map['J名']=$username; $res = $this->_db->where($map)->select(); return $res; }

就是把中文欄位存入到陣列的值裡面去,然後放入where中,這樣就可以讀出資料來了。但是讀出來的資料,用var_dump輸出,一般的話要麼欄位亂碼資料不亂碼,要麼資料亂碼欄位不亂碼。這個時候需要用兩重foreach進行轉碼,把對應亂碼的資料轉碼就正常了

foreach ($result as $key => $value) {
            foreach
($value as $k1 => $v1) { $k1=iconv("GBK","UTF-8",$k1); $arr[$key][$k1]=$v1; } }

函式主體是這樣,在讀完資料以後呼叫一次函式,就可以解決亂碼了

 


 

這兩個問題困擾了我一個星期,現在想想,還是自己真的對TP3.2框架一點都不瞭解才會這樣,很基礎的錯誤,在這裡寫出來希望以後看到自己的文章還會想起這段無頭蒼蠅亂飛的日子

2018-11-22