ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword '_PHP
ThinkPHP
问题代码如下:
<?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); } } ?>
出现的情况是使用 query 可以正确读取到数据,而使用M方法,则无法读取,会报出 Incorrect syntax near the keyword 'AS'. 错误
原因是DbMssql.class.php驱动的查询语句有问题。
由于TP2.0 的 MSSQL 驱动是对SQL 2005有效,但对2000版本则无效,原因是2000版本里没有 ROW_NUMBER 功能,2005才有这个功能作用好像是对数据分页提供便利和效能。
希望官方能够给TP2.0加一个2000的驱动吧,目前采用的临时处理方法是修改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
这样实现的;
如果觉得麻烦,那么就结合 Adodb 类库吧,这个对MSSQL支持相对好很多。要结合 Adodb 类库我的方法如下:
首先下载 Adodb 类库并解压到 ThinkPHP 的 Vendor 目录中,并把 adodb.inc.php 改名为 adodb.php
然后在项目的 Lib 里建立一个 CommonAction.class.php 内容为
<?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 的模块进行简单的数据查询也能使用 Adodb 进行分页数据的查询,实在是没办法中的办法了,这个是个笨办法哦,还是希望 ThinkPHP 能够出一个 MSSQL 2000 版本能用的完美驱动。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

無法連接 MySQL 可能是由於以下原因:MySQL 服務未啟動、防火牆攔截連接、端口號錯誤、用戶名或密碼錯誤、my.cnf 中的監聽地址配置不當等。排查步驟包括:1. 檢查 MySQL 服務是否正在運行;2. 調整防火牆設置以允許 MySQL 監聽 3306 端口;3. 確認端口號與實際端口號一致;4. 檢查用戶名和密碼是否正確;5. 確保 my.cnf 中的 bind-address 設置正確。

MySQL啟動失敗的原因有多種,可以通過檢查錯誤日誌進行診斷。常見原因包括端口衝突(檢查端口占用情況並修改配置)、權限問題(檢查服務運行用戶權限)、配置文件錯誤(檢查參數設置)、數據目錄損壞(恢復數據或重建表空間)、InnoDB表空間問題(檢查ibdata1文件)、插件加載失敗(檢查錯誤日誌)。解決問題時應根據錯誤日誌進行分析,找到問題的根源,並養成定期備份數據的習慣,以預防和解決問題。

無法以 root 身份登錄 MySQL 的原因主要在於權限問題、配置文件錯誤、密碼不符、socket 文件問題或防火牆攔截。解決方法包括:檢查配置文件中 bind-address 參數是否正確配置。查看 root 用戶權限是否被修改或刪除,並進行重置。驗證密碼是否準確無誤,包括大小寫和特殊字符。檢查 socket 文件權限設置和路徑。檢查防火牆是否阻止了 MySQL 服務器的連接。

MySQL安裝報錯的解決方法是:1.仔細檢查系統環境,確保滿足MySQL的依賴庫要求,不同操作系統和版本需求不同;2.認真閱讀報錯信息,根據提示(例如缺少庫文件或權限不足)採取對應措施,例如安裝依賴或使用sudo命令;3.必要時,可嘗試源碼安裝並仔細檢查編譯日誌,但這需要一定的Linux知識和經驗。最終解決問題的關鍵在於仔細檢查系統環境和報錯信息,並參考官方文檔。

可以通過以下步驟解決 Navicat 無法連接數據庫的問題:檢查服務器連接,確保服務器運行、地址和端口正確,防火牆允許連接。驗證登錄信息,確認用戶名、密碼和權限正確。檢查網絡連接,排除網絡問題,例如路由器或防火牆故障。禁用 SSL 連接,某些服務器可能不支持。檢查數據庫版本,確保 Navicat 版本與目標數據庫兼容。調整連接超時,對於遠程或較慢的連接,增加連接超時時間。其他解決方法,如果上述步驟無效,可以嘗試重新啟動軟件,使用不同的連接驅動程序,或諮詢數據庫管理員或 Navicat 官方支持。

MySQL 本質上不支持數組類型,但可以通過以下方法曲線救國:JSON 數組(性能效率受限);多個字段(擴展性差);關聯表(最靈活,符合關係型數據庫設計思想)。

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

CentOS下Hadoop分佈式文件系統(HDFS)配置常見問題及解決方案在CentOS系統上搭建HadoopHDFS集群時,一些常見的錯誤配置可能導致性能下降、數據丟失甚至集群無法啟動。本文總結了這些常見問題及其解決方法,幫助您避免這些陷阱,確保HDFS集群的穩定性和高效運行。機架感知配置錯誤:問題:未正確配置機架感知信息,導致數據塊副本分佈不均,增加網絡負載。解決方案:仔細檢查hdfs-site.xml文件中的機架感知配置,並使用hdfsdfsadmin-printTopo
