ThinkPHP2.0讀取MSSQL提示Incorrect syntax near the keyword 'AS'的解決方法
問題代碼如下:
<?php
class IndexAction extends Action{
public function index(){
/*
$Model = new Model();
$test = $Model->query('select top 10 * from f_city');
dump($test);
*/
$CityModel = M('city');
$CityModel->find();
dump($CityModel);
}
}
?>
出現(xiàn)的情況是使用 query 可以正確讀取到數(shù)據(jù),而使用M方法,則無法讀取,會報出 Incorrect syntax near the keyword 'AS'. 錯誤
原因是DbMssql.class.php驅(qū)動的查詢語句有問題。
由于TP2.0 的 MSSQL 驅(qū)動是對SQL 2005有效,但對2000版本則無效,原因是2000版本里沒有 ROW_NUMBER 功能,2005才有這個功能作用好像是對數(shù)據(jù)分頁提供便利和效能。
希望官方能夠給TP2.0加一個2000的驅(qū)動吧,目前采用的臨時處理方法是修改ThinkPHP\Lib\Think\Db\Driver\DbMssql.class.php ,將行 25 的 protected $selectSql 在前面加 '//'
并且第326行 的
public function parseLimit($limit) {
if(emptyempty($limit)) $limit=1;
$limit = explode(',',$limit);
if(count($limit)>1)
$limitStr = '(T1.ROW_NUMBER BETWEEN '.$limit[0].' + 1 AND '.$limit[0].' + '.$limit[1].')';
else
$limitStr = '(T1.ROW_NUMBER BETWEEN 1 AND '.$limit[0].")";
return $limitStr;
}
改為:
public function parseLimit($limit) {
return '';
}
這樣更改后,基本可以滿足一般的SQL需求,但不能使用LIMIT,因為 MSSQL 2000 的LIMIT方法是以 top N
這樣實現(xiàn)的;
如果覺得麻煩,那么就結(jié)合 Adodb 類庫吧,這個對MSSQL支持相對好很多。要結(jié)合 Adodb 類庫我的方法如下:
首先下載 Adodb 類庫并解壓到 ThinkPHP 的 Vendor 目錄中,并把 adodb.inc.php 改名為 adodb.php
然后在項目的 Lib 里建立一個 CommonAction.class.php 內(nèi)容為
<?php
class CommonAction extends Action {
public $dbsql;
function _initialize() {
Vendor('adodb5.adodb');
$adodb = ADONewConnection(C('DB_TYPE'));
$adodb->Connect(C('DB_HOST'), C('DB_USER'), C('DB_PWD'), C('DB_NAME'));
$adodb->SetFetchMode(ADODB_FETCH_ASSOC);
$this->dbsql = $adodb;
}
}
?>
在項目的其他文件中都要引用到這個 CommonAction.class.php 文才能使用 ADODB,例如:
<?php
class IndexAction extends CommonAction {
public function index() {
$query = $this->dbsql->Execute('select * from xxx');
while($rows = $query->FetchRow()) {
echo $rows['fields'];
}
}
}
?>
這樣既能使用 Thinkphp 的模塊進行簡單的數(shù)據(jù)查詢也能使用 Adodb 進行分頁數(shù)據(jù)的查詢,實在是沒辦法中的辦法了,這個是個笨辦法哦,還是希望 ThinkPHP 能夠出一個 MSSQL 2000 版本能用的完美驅(qū)動。
- Linux編譯mssql擴展使用php連接sqlserver2008的使用步驟
- Windows平臺實現(xiàn)PHP連接SQL Server2008的方法
- PHP 5.6.11 訪問SQL Server2008R2的幾種情況詳解
- Windows Server 2008 R2和2012中PHP連接MySQL過慢的解決方法
- PHP連接SQL Server的方法分析【基于thinkPHP5.1框架】
- thinkphp3查詢mssql數(shù)據(jù)庫亂碼解決方法分享
- php5.3中連接sqlserver2000的兩種方法(com與ODBC)
- 用php和MySql來與ODBC數(shù)據(jù)連接
- PHP7使用ODBC連接SQL Server2008 R2數(shù)據(jù)庫示例【基于thinkPHP5.1框架】
相關(guān)文章
Windows Apache2.2.11及Php5.2.9-1的安裝與配置方法
很早就想在自己的機子上搭建PHP的開發(fā)環(huán)境,今天難得有這個機會,在網(wǎng)上找了一些教程和程序,實踐了一把,過程是很艱辛的,因為遇到了很多的問題,在這里總結(jié)一下。2009-06-06
淺析ThinkPHP緩存之快速緩存(F方法)和動態(tài)緩存(S方法)(日常整理)
thinkPHP的F方法只能用于緩存簡單數(shù)據(jù)類型,不支持有效期和緩存對象。S()緩存方法支持有效期,又稱動態(tài)緩存方法。本文是小編日常整理有關(guān)thinkphp緩存方法,對thinkphp緩存方法感興趣的朋友一起學習吧2015-10-10

