


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 版本能用的完美驱动。

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Sambungan MySQL mungkin disebabkan oleh sebab -sebab berikut: Perkhidmatan MySQL tidak dimulakan, firewall memintas sambungan, nombor port tidak betul, nama pengguna atau kata laluan tidak betul, alamat pendengaran di my.cnf dikonfigurasi dengan tidak wajar, dan lain -lain. Langkah -langkah penyelesaian masalah termasuk: 1. 2. Laraskan tetapan firewall untuk membolehkan MySQL mendengar port 3306; 3. Sahkan bahawa nombor port adalah konsisten dengan nombor port sebenar; 4. Periksa sama ada nama pengguna dan kata laluan betul; 5. Pastikan tetapan alamat mengikat di my.cnf betul.

Terdapat banyak sebab mengapa permulaan MySQL gagal, dan ia boleh didiagnosis dengan memeriksa log ralat. Penyebab umum termasuk konflik pelabuhan (periksa penghunian pelabuhan dan ubah suai konfigurasi), isu kebenaran (periksa keizinan pengguna yang menjalankan perkhidmatan), ralat fail konfigurasi (periksa tetapan parameter), rasuah direktori data (memulihkan data atau membina semula ruang meja), isu ruang jadual InnoDB (semak fail ibdata1) Apabila menyelesaikan masalah, anda harus menganalisisnya berdasarkan log ralat, cari punca utama masalah, dan mengembangkan tabiat sandaran data secara teratur untuk mencegah dan menyelesaikan masalah.

Sebab utama mengapa anda tidak boleh log masuk ke MySQL sebagai akar adalah masalah kebenaran, ralat fail konfigurasi, kata laluan tidak konsisten, masalah fail soket, atau pemintasan firewall. Penyelesaiannya termasuk: periksa sama ada parameter pengikat di dalam fail konfigurasi dikonfigurasi dengan betul. Semak sama ada kebenaran pengguna root telah diubahsuai atau dipadam dan ditetapkan semula. Sahkan bahawa kata laluan adalah tepat, termasuk kes dan aksara khas. Semak tetapan dan laluan kebenaran fail soket. Semak bahawa firewall menyekat sambungan ke pelayan MySQL.

Penyelesaian kepada ralat pemasangan MySQL adalah: 1. Berhati -hati memeriksa persekitaran sistem untuk memastikan keperluan perpustakaan ketergantungan MySQL dipenuhi. Sistem operasi dan keperluan versi yang berbeza adalah berbeza; 2. Berhati -hati membaca mesej ralat dan mengambil langkah -langkah yang sepadan mengikut arahan (seperti fail perpustakaan yang hilang atau kebenaran yang tidak mencukupi), seperti memasang kebergantungan atau menggunakan arahan sudo; 3 Jika perlu, cuba pasang kod sumber dan periksa dengan teliti log kompilasi, tetapi ini memerlukan pengetahuan dan pengalaman Linux tertentu. Kunci untuk menyelesaikan masalah akhirnya adalah dengan teliti memeriksa persekitaran sistem dan maklumat ralat, dan merujuk kepada dokumen rasmi.

Langkah -langkah berikut boleh digunakan untuk menyelesaikan masalah yang tidak dapat disambungkan oleh Navicat ke pangkalan data: periksa sambungan pelayan, pastikan pelayan berjalan, alamat dan port dengan betul, dan firewall membolehkan sambungan. Sahkan maklumat log masuk dan sahkan bahawa nama pengguna, kata laluan dan kebenaran adalah betul. Semak sambungan rangkaian dan menyelesaikan masalah rangkaian seperti kegagalan penghala atau firewall. Lumpuhkan sambungan SSL, yang mungkin tidak disokong oleh beberapa pelayan. Semak versi pangkalan data untuk memastikan versi Navicat serasi dengan pangkalan data sasaran. Laraskan tamat masa sambungan, dan untuk sambungan jauh atau lebih perlahan, tingkatkan waktu tamat masa sambungan. Penyelesaian lain, jika langkah -langkah di atas tidak berfungsi, anda boleh cuba memulakan semula perisian, menggunakan pemacu sambungan yang berbeza, atau merujuk kepada pentadbir pangkalan data atau sokongan navicat rasmi.

MySQL tidak menyokong jenis array pada dasarnya, tetapi dapat menyelamatkan negara melalui kaedah berikut: JSON Array (kecekapan prestasi yang dikekang); pelbagai bidang (skalabilitas yang lemah); Jadual bersekutu (yang paling fleksibel dan sesuai dengan idea reka bentuk pangkalan data relasi).

Tidak mustahil untuk melihat kata laluan PostgreSQL terus dari Navicat, kerana Navicat menyimpan kata laluan yang disulitkan atas alasan keselamatan. Untuk mengesahkan kata laluan, cuba sambungkan ke pangkalan data; Untuk mengubah suai kata laluan, sila gunakan antara muka grafik PSQL atau Navicat; Untuk tujuan lain, anda perlu mengkonfigurasi parameter sambungan dalam kod untuk mengelakkan kata laluan berkod keras. Untuk meningkatkan keselamatan, disyorkan untuk menggunakan kata laluan yang kuat, pengubahsuaian berkala dan membolehkan pengesahan multi-faktor.

Muat turun mysql meminta ralat menulis cakera. Penyelesaiannya adalah seperti berikut: 1. Periksa sama ada ruang cakera tidak mencukupi, membersihkan ruang atau menggantikan cakera yang lebih besar; 2. Gunakan alat pengesanan cakera (seperti CHKDSK atau FSCK) untuk memeriksa dan memperbaiki kesilapan cakera, dan menggantikan cakera keras jika perlu; 3. Semak keizinan direktori sasaran untuk memastikan bahawa akaun pengguna mempunyai kebenaran menulis; 4. Tukar alat muat turun atau persekitaran rangkaian, dan gunakan pengurus muat turun untuk memulihkan muat turun yang terganggu; 5. Tutup sementara perisian anti-virus atau firewall, dan dapatkan semula selepas muat turun selesai. Dengan menyelesaikan masalah secara sistematik, masalah ini dapat diselesaikan.
