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方法,則無法讀取,會(huì)報(bào)出 Incorrect syntax near the keyword 'AS'. 錯(cuò)誤
原因是DbMssql.class.php驅(qū)動(dòng)的查詢語句有問題。
由于TP2.0 的 MSSQL 驅(qū)動(dòng)是對(duì)SQL 2005有效,但對(duì)2000版本則無效,原因是2000版本里沒有 ROW_NUMBER 功能,2005才有這個(gè)功能作用好像是對(duì)數(shù)據(jù)分頁提供便利和效能。
希望官方能夠給TP2.0加一個(gè)2000的驅(qū)動(dòng)吧,目前采用的臨時(shí)處理方法是修改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,因?yàn)?MSSQL 2000 的LIMIT方法是以 top N
這樣實(shí)現(xiàn)的;
如果覺得麻煩,那么就結(jié)合 Adodb 類庫吧,這個(gè)對(duì)MSSQL支持相對(duì)好很多。要結(jié)合 Adodb 類庫我的方法如下:
首先下載 Adodb 類庫并解壓到 ThinkPHP 的 Vendor 目錄中,并把 adodb.inc.php 改名為 adodb.php
然后在項(xiàng)目的 Lib 里建立一個(gè) 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;
}
}
?>
在項(xiàng)目的其他文件中都要引用到這個(gè) 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 的模塊進(jìn)行簡(jiǎn)單的數(shù)據(jù)查詢也能使用 Adodb 進(jìn)行分頁數(shù)據(jù)的查詢,實(shí)在是沒辦法中的辦法了,這個(gè)是個(gè)笨辦法哦,還是希望 ThinkPHP 能夠出一個(gè) MSSQL 2000 版本能用的完美驅(qū)動(dòng)。
- Linux編譯mssql擴(kuò)展使用php連接sqlserver2008的使用步驟
- Windows平臺(tái)實(shí)現(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的安裝與配置方法
很早就想在自己的機(jī)子上搭建PHP的開發(fā)環(huán)境,今天難得有這個(gè)機(jī)會(huì),在網(wǎng)上找了一些教程和程序,實(shí)踐了一把,過程是很艱辛的,因?yàn)橛龅搅撕芏嗟膯栴},在這里總結(jié)一下。2009-06-06
淺析ThinkPHP緩存之快速緩存(F方法)和動(dòng)態(tài)緩存(S方法)(日常整理)
thinkPHP的F方法只能用于緩存簡(jiǎn)單數(shù)據(jù)類型,不支持有效期和緩存對(duì)象。S()緩存方法支持有效期,又稱動(dòng)態(tài)緩存方法。本文是小編日常整理有關(guān)thinkphp緩存方法,對(duì)thinkphp緩存方法感興趣的朋友一起學(xué)習(xí)吧2015-10-10
thinkPHP實(shí)現(xiàn)多字段模糊匹配查詢的方法
這篇文章主要介紹了thinkPHP實(shí)現(xiàn)多字段模糊匹配查詢的方法,結(jié)合實(shí)例形式分析了thinkPHP進(jìn)行模糊匹配查詢的相關(guān)模型操作與sql語句,需要的朋友可以參考下2016-12-12
laravel 錯(cuò)誤處理,接口錯(cuò)誤返回json代碼
今天小編就為大家分享一篇laravel 錯(cuò)誤處理,接口錯(cuò)誤返回json代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-10-10
淺析php設(shè)計(jì)模式之?dāng)?shù)據(jù)對(duì)象映射模式
php中的設(shè)計(jì)模式中有很多的各種模式了,在這里我們來為各位介紹一個(gè)不常用的數(shù)據(jù)映射模式吧,感興趣的朋友一起看下吧2016-03-03

