thinkphp鏈接SQL數(shù)據(jù)庫

最近遇到一個項(xiàng)目蛮瞄,需要用thinkphp訪問sqlserver 2008數(shù)據(jù)庫棍郎,而且數(shù)據(jù)庫的表名和字段名都是中文钦讳,費(fèi)了九牛二虎之力終于可以讀取了,寫入還沒來得及測試掐暮,如果遇到問題后續(xù)補(bǔ)充吧蝎抽。

? ? ? ? 總體思路分為兩個步驟 1、尋找php連接sqlserver數(shù)據(jù)庫驅(qū)動路克,2樟结、解決中文表名和字段名問題

? ? ? ?1、php連接sqlserver數(shù)據(jù)庫驅(qū)動

? ? ? ? 我先按照網(wǎng)上的方法找了php_sqlsrv_54_ts.dll和php_pdo_sqlsrv_54_ts.dll 精算,此驅(qū)動可以連接成功瓢宦,但是只支持windows平臺。項(xiàng)目要求同時支持linux平臺灰羽,沒辦法刁笙,后來終于找到了php_dblib.dll。下載地址:http://download.csdn.net/detail/hanzengyi/9588630

? ? ? ?先將php_dblib.dll拷貝到php安裝目錄的ext文件夾下谦趣,修改php.ini,添加?extension = php_dblib.dll座每。然后修改thinkphp的配置文件:


2前鹅、解決中文表名和字段名問題

以下兩個方法將M()->select()得到的單行記錄和多行記錄轉(zhuǎn)換成utf8格式

//將一行記錄轉(zhuǎn)換成utf8格式,適用于M()->select()返回單行記錄時

publicfunctionrow2utf8($Result){

$Row =array();

$key1=array_keys($Result);

$key2 = array_keys($Result[$key1[0]]);

for($i=0;$i

$Row[ iconv('gb2312','utf-8',$key2[ $i ]) ] = iconv('gb2312','utf-8', $Result[0][ $key2[ $i ] ] );

}

return$Row;

}

//將記錄列表轉(zhuǎn)換成utf8格式峭梳,適用于M()->select()返回多行記錄列表時

publicfunctionlist2utf8($Result){

$Row =array();

$key1=array_keys($Result);

$key2 = array_keys($Result[$key1[0]]);

for($i=0;$i

for( $j=0; $j

$Row[ $key1[ $i ] ][ iconv('gb2312','utf-8',$key2[ $j ]) ] = iconv('gb2312','utf-8', $Result[ $key1[ $i ] ][ $key2[ $j ] ] );

}

}

return$Row;

}

最終舰绘,測試方法為:

publicfunctionindex(){

$table_name = iconv('UTF-8','GB2312','測試表');//utf8中文表名轉(zhuǎn)gb2312

$col_name = iconv('UTF-8','GB2312','測試');//utf8中文字段名轉(zhuǎn)gb2312

$result = M($table_name,null,C('DB_SQLSERVER'))->where(array($col_name=>'1'))->select();//從表“測試表”中查詢字段"測試"=1的記錄

$arr =$this->row2utf8($result);

dump($arr);

die(dump($arr['測試']));//打印“測試”字段

}

$arr和$arr['測試']均打印出來,測試通過~


3葱椭、linux版本編譯捂寿,以下內(nèi)容為轉(zhuǎn)發(fā)博主?21aspnet?的文章http://blog.csdn.net/21aspnet/article/details/47451253,內(nèi)容根據(jù)環(huán)境不同稍有改動

linux版本:64位Ubuntu14.04

Nginx版本:nginx1.10.3

php版本:php5.6.32 (php安裝方式為:apt-get install php5.6-fpm)

Sqlserver版本:2008

FreeTDS版本:0.95

不想編譯安裝的可直接下載編譯好的動態(tài)庫:http://download.csdn.net/download/hanzengyi/10112427

1.首先需要編譯安裝FreeTDS

說明:一定要從官網(wǎng)下載最新的版本FreeTDS-0.95ftp://ftp.freetds.org/pub/freetds/stable/freetds-patched.tar.gz

如果官網(wǎng)實(shí)在太慢建議從博主上傳的這里一樣很快下載:http://download.csdn.net/detail/21aspnet/9000357

# wget?ftp://ftp.freetds.org/pub/freetds/stable/freetds-patched.tar.gz

# tar -zxvf?freetds-patched.tar.gz

# cd freetds-0.95

需要注意的就是這里的--with-tdsver=7.3孵运,這個非常重要秦陋,你需要根據(jù)你的數(shù)據(jù)庫版本選擇正確的配置項(xiàng),由于現(xiàn)在大多是SQLserve2008所以需要選擇7.3.

關(guān)于這個問題網(wǎng)上有的說是7.1治笨,也有的說是7.2驳概,甚至有的說是8.0赤嚼,可以看文末參考帖子,不過那些說的都有問題顺又。

造成這個配置項(xiàng)混亂的根源是很多人用的是FreeTDS-0.91更卒,經(jīng)過我的測試FreeTDS-0.91只支持7.1,如果是7.2以上配置那么通通會變?yōu)?.0稚照。

其實(shí)參考官網(wǎng)的文檔就知道這個問題了蹂空,不過由于很多人下載了舊版FreeTDS-0.91,即使設(shè)置為--with-tdsver=7.2以上也沒有用果录。


總結(jié):FreeTDS-0.91只支持7.1上枕,其余都會默認(rèn)為5.0。只有最新的FreeTDS-0.95雕憔,也就是對Sqlserver2008的最佳配置姿骏。

# ./configure --prefix=/usr/local/freetds --with-tdsver=7.3 --enable-msdblib

# make && make install


安裝好會看到這樣的信息:



配置FreeTDS

#?cd ../

#?echo "/usr/local/freetds/lib/" > /etc/ld.so.conf.d/freetds.conf

#?ldconfig


驗(yàn)證FreeTDS版本

這一步非常重要,通過才可以繼續(xù)斤彼,不然后面的步驟都是無意義的分瘦。

首先看看版本信息

#?/usr/local/freetds/bin/tsql -C


測試數(shù)據(jù)庫是否聯(lián)通

#?/usr/local/freetds/bin/tsql -H 數(shù)據(jù)庫服務(wù)器IP? -p 端口號(1433) -U?用戶名 -P 密碼


關(guān)于freetds/etc/freetds.conf配置項(xiàng)

很多其他帖子寫了需要配置/usr/local/freetds/etc/freetds.conf,其實(shí)這個不需要配置琉苇。如果配置也可以嘲玫,配置了PHP就可以調(diào)用這個配置項(xiàng),否則需要PHP代碼里指定數(shù)據(jù)庫服務(wù)器信息即可。

另外需要注意的是/usr/local/freetds/etc/下的freetds.conf不同于前面/usr/local/freetds/lib/那個freetds.conf。

如果配置了這里院究,那么PHP頁面就可以使用這里的配置铭污,不然PHP頁面指定一樣可以。

默認(rèn)是這樣的:

[cpp]view plaincopy

#???$Id:?freetds.conf,v?1.12?2007-12-25?06:02:36?jklowden?Exp?$??

#??

#?This?file?is?installed?by?FreeTDS?if?no?file?by?the?same???

#?name?is?found?in?the?installation?directory.????

#??

#?For?information?about?the?layout?of?this?file?and?its?settings,???

#?see?the?freetds.conf?manpage?"man?freetds.conf".????


#?Global?settings?are?overridden?by?those?in?a?database??

#?server?specific?section??

[global]??

????????#?TDS?protocol?version??

;???tds?version?=?4.2??


????#?Whether?to?write?a?TDSDUMP?file?for?diagnostic?purposes??

????#?(setting?this?to?/tmp?is?insecure?on?a?multi-user?system)??

;???dump?file?=?/tmp/freetds.log??

;???debug?flags?=?0xffff??


????#?Command?and?connection?timeouts??

;???timeout?=?10??

;???connect?timeout?=?10??


????#?If?you?get?out-of-memory?errors,?it?may?mean?that?your?client??

????#?is?trying?to?allocate?a?huge?buffer?for?a?TEXT?field.????

????#?Try?setting?'text?size'?to?a?more?reasonable?limit???

????text?size?=?64512??


#?A?typical?Sybase?server??

[egServer50]??

????host?=?symachine.domain.com??

????port?=?5000??

????tds?version?=?5.0??


#?A?typical?Microsoft?server??

[egServer70]??

????host?=?ntmachine.domain.com??

????port?=?1433??

????tds?version?=?7.0??


如果你想使用配置項(xiàng)肯腕,只要修改[egServer70]即可:

[cpp]view plaincopy

[egServer70]??

????host?=?192.168.1.235?這個是數(shù)據(jù)庫服務(wù)器IP??

????port?=?1433??

????tds?version?=?7.1??

其他都不用動,關(guān)于[egServer70]的名字也是隨意的,這個就是給PHP調(diào)用的鬼雀,和PHP代碼里一致即可。


3.添加PHP擴(kuò)展mssql和pdo的pdo_dblib

說明:這2種擴(kuò)展都可以達(dá)到相同的目的蛙吏,選其一即可鸦做。

首先下載php5.6.32源碼,下載地址:http://php.net/downloads.php,我下載的是php-5.6.32.tar.gz夷陋,解壓tar xvfphp-5.6.32.tar.gz

(1).增加PHP擴(kuò)展mssql

#?cd /usr/php-5.6.32/ext/mssql/

linux下用phpize給PHP動態(tài)添加擴(kuò)展

#?phpize ?如果沒有phpize藐窄,請先安裝?apt-get install php5.6-dev 詳見http://blog.csdn.net/hanzengyi/article/details/78495405

#?./configure --with-php-config=/usr/local/php/bin/php-config --with-mssql=/usr/local/freetds/原博主版本

#?./configure --with-php-config=/usr/bin/php-config --with-mssql=/usr/local/freetds/ 我的版本

#?make && make install


(2).增加PHP擴(kuò)展pdo的pdo_dblib

#?cd /usr/php-5.6.32/ext/pdo_dblib/

linux下用phpize給PHP動態(tài)添加擴(kuò)展

#?phpize

#?./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-dblib=/usr/local/freetds/原博主版本

#?./configure --with-php-config=/usr/bin/php-config --with-pdo-dblib=/usr/local/freetds/ 我的版本

#?make && make install


(3).在php.ini配置文件中增加.so

#?vi?/etc/php/5.6/fpm/php.ini

增加:

[cpp]view plaincopy

extension=/usr/lib/php/20131226/mssql.so??

extension=/usr/lib/php/20131226/pdo_dblib.so

php.in將mssql.secure_connection = Off改為on,否則會報(bào)“Couldn't connect to SQL Server on ...”

mssql.charset 為 mssql.charset = "UTF-8",否則查詢結(jié)果會出現(xiàn)中文亂碼,想???? 這種

如果你只需要上述2種擴(kuò)展之一碌冶,自然只要新增其中一個的.so擴(kuò)展到php.ini即可嫩挤。

(4).重啟PHP FastCGI

# killall php-fpm

# /etc/init.d/php-fpm


如果沒有正確生成擴(kuò)展是不能重啟php-fpm的约啊。

這時候在phpinfo里就可以看到擴(kuò)展添加成功的信息了邑遏。



4.使用PHP調(diào)用SQLserver

(1).mssql_connect配置版

[php]view plaincopy


header("Content-type:?text/html;?charset=utf-8");??

$msdb=mssql_connect("egServer70","blog.csdn.net.unix21","password");??

if?(!$msdb)?{??

echo?"connect?sqlserver?error";??

exit;??

????}??

mssql_select_db("數(shù)據(jù)庫名",$msdb);??

$result?=?mssql_query("SELECT?top?5?*?FROM?tablename",?$msdb);??

while($row?=?mssql_fetch_array($result))?{??

print_r($row);??

}??

mssql_free_result($result);??

?>??

注意:上面的egServer70就是前面freetds/etc/freetds.conf配置的。


(2).mssql_connect非配置版

[php]view plaincopy


header("Content-type:?text/html;?charset=utf-8");??

//$msdb=mssql_connect("數(shù)據(jù)庫IP","blog.csdn.net.unix21","password");??

//$msdb=mssql_connect("數(shù)據(jù)庫IP:1433","blog.csdn.net.unix21","password");??

$msdb=mssql_connect("數(shù)據(jù)庫IP:49151","blog.csdn.net.unix21","password");??

if?(!$msdb)?{??

echo?"connect?sqlserver?error";??

exit;??

????}??

mssql_select_db("數(shù)據(jù)庫名",$msdb);??

$result?=?mssql_query("SELECT?top?5?*?FROM?tablename",?$msdb);??

while($row?=?mssql_fetch_array($result))?{??

print_r($row);??

}??

mssql_free_result($result);??

?>??

(3).PDO版本

[php]view plaincopy


header("Content-type:?text/html;?charset=utf-8");??

??try?{??

$hostname?=?"數(shù)據(jù)庫IP";??

$port?=?1433;??

$dbname?=?"數(shù)據(jù)庫名";??

$username?=?"blog.csdn.net.unix21";??

$pw?=?"password";??

$dbh?=?new?PDO?("dblib:host=$hostname:$port;dbname=$dbname","$username","$pw");??

}?catch?(PDOException$e)?{??

echo?"Failed?to?get?DB?handle:?"?.?$e->getMessage()?.?"\n";??

exit;??

??}??


$stmt?=?$dbh->prepare("SELECT?top?5?*?FROM?tablename");??

$stmt->execute();??

while?($row?=?$stmt->fetch())?{??

print_r($row);??

??}??

unset($dbh);?unset($stmt);??


?>??


顯示數(shù)據(jù):


以上本人都是驗(yàn)證過的恰矩。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末记盒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子外傅,更是在濱河造成了極大的恐慌纪吮,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萎胰,死亡現(xiàn)場離奇詭異碾盟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)技竟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門冰肴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人榔组,你說我怎么就攤上這事熙尉。” “怎么了瓷患?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵骡尽,是天一觀的道長。 經(jīng)常有香客問我擅编,道長攀细,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任爱态,我火速辦了婚禮谭贪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锦担。我一直安慰自己俭识,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布洞渔。 她就那樣靜靜地躺著套媚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪磁椒。 梳的紋絲不亂的頭發(fā)上堤瘤,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音浆熔,去河邊找鬼本辐。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的慎皱。 我是一名探鬼主播老虫,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼茫多!你這毒婦竟也來了祈匙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤地梨,失蹤者是張志新(化名)和其女友劉穎菊卷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宝剖,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洁闰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了万细。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扑眉。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赖钞,靈堂內(nèi)的尸體忽然破棺而出腰素,到底是詐尸還是另有隱情,我是刑警寧澤雪营,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布弓千,位于F島的核電站,受9級特大地震影響献起,放射性物質(zhì)發(fā)生泄漏洋访。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一谴餐、第九天 我趴在偏房一處隱蔽的房頂上張望姻政。 院中可真熱鬧,春花似錦岂嗓、人聲如沸汁展。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽食绿。三九已至,卻和暖如春公罕,著一層夾襖步出監(jiān)牢的瞬間器紧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工熏兄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓摩桶,卻偏偏與公主長得像桥状,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子硝清,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,456評論 0 13
  • 更改ip和dnsVi /etc/sysconfig/network-scripts/ifcfg-eth0vi /...
    Xwei_閱讀 1,822評論 0 3
  • 一辅斟、MemCache簡介 session MemCache是一個自由、源碼開放芦拿、高性能士飒、分布式的分布式內(nèi)存對象緩存...
    李偉銘MIng閱讀 3,816評論 2 13
  • Getting Started Use the Current Stable Version (7.1) Buil...
    Leonzai閱讀 1,947評論 0 3
  • 最近都沒和孩子一起閱讀了,突然覺得好可惜罢崞椤酵幕!倒是孩子見我不陪他,自己就會坐地上缓苛、趴沙發(fā)上翻書看芳撒,叫他都不應(yīng)聲,看著...
    6911481b8e15閱讀 172評論 0 0