最近遇到一個項(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)證過的恰矩。