问题 PHP PDO_mssql SQLSTATE [01002] Adaptive Server连接失败(严重级9)


我正在连接外部MSSQL数据库以从PHP55 / osx导出,我有一个奇怪的问题。

码:

new \PDO("dblib:host={$hostname};dbname={$dbname}", $user, $pass);

抛出: 

SQLSTATE[01002] Adaptive Server connection failed (severity 9)

但CLI的连接工作正常

tsql -S hostname -U user -P pass -L dbname:

locale is "cs_CZ.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1> 

freetds.conf:

[hostname]
    host = ipaddress
    port = 1433
    tds version = 8.0

tsql -C:

                        Version: freetds v0.91
         freetds.conf directory: /usr/local/Cellar/freetds/0.91/etc
 MS db-lib source compatibility: no
    Sybase binary compatibility: no
                  Thread safety: yes
                  iconv library: yes
                    TDS version: 7.1
                          iODBC: no
                       unixodbc: no
          SSPI "trusted" logins: no
                       Kerberos: no

有任何想法吗?我已尝试alomost任何东西,连接到主机名,IP,有和没有端口,实例名称,另一个用户,TDS版本7.0,7.1,7.2,8.0,重新安装PHP和freetds


3587
2017-07-22 19:01


起源

你有没有试过不包括 dbname 在连接和后来使用 mssql_select_db? - simeg
你能尝试像ODBC这样的其他驱动吗?我已经用dblib显示了奇怪的结果。 - Kevin Labécot
如上所述,它也可能与您的dbname属性有关。 - Kevin Labécot
我尝试过ODBC,但根本无法连接它。可能我说错了。我真的更喜欢dblib,因为它受我的抽象支持(Laravel Eloquent ORM)。即使没有dbname,我也尝试了它,但它没有帮助 - Jakub Riedl
我也有完全一样的问题。并尝试了一切,没有成功。唯一的区别是,当我这样做 tsql -C 我明白了 TDS version: 5.0。 - jplozano


答案:


检查这些:

  1. 在磁盘上找到freetds.conf。它可能存在于几个地方,而tsql使用一个,而PHP使用另一个。最好是将它们符号链接到一个公共文件中并对其进行测试。请注意,该文件的常见位置是/ etc /或/ usr / local / etc /旁边的〜/ .freetds.conf

  2. 你的freetds.conf文件中应该有一个[global]部分。放在这些线:

    tds版本= 8.0

    文字大小= 20971520

    客户端charset = UTF-8

当然,我希望您已经使用phpinfo()检查了PHP加载了哪个驱动程序:mssql,sqlsrv或dblib


6
2018-02-15 11:59



非常感谢,这对我有用 - Angel M.


这是一般失败消息。无论出于何种原因,您无法连接到数据库。鉴于您使用OSX和brew很可能问题在于链接/加载共享库。 FreeTDS基于Sybase 8(与MS SQL Server一样)。编译时有点神秘。

您的PHP是否与brew安装的libsybdb.dylib相关联? 您应该能够找到使用phpinfo(),如果它包含在您的服务器中:

配置命令'--with-pdo-dblib = shared,/ usr / local / Cellar / freetds / 0.91 / lib'

要使其工作,您需要使用dblib选项编译/构建PHP。


4
2017-08-01 15:24



这不能解决问题。要对作者进行批评或要求澄清,请在帖子下方留言。 - Yas T.
它确定了问题Yas。 - bbaassssiiee
PHP与默认的dblib链接为brew安装。但是当我尝试使用您的命令配置它时,该错误没有任何变化。 - Jakub Riedl


我的解决方案

获取FreeTds

  • brew install freetds
  • 将freetds安装的lib /文件夹中的所有内容复制到PHP安装目录的lib /文件夹中,替换旧版本的: libct.4.dyliblibct.alibct.dyliblibsybdb.5.dyliblibsybdb.alibsybdb.dylib

编译并安装dblib扩展

  • 下载已安装的任何php版本的php源代码
  • 导航到 ext/pdo_dblib 源文件夹的子文件夹
  • phpize,确保它是您安装的正确二进制文件
  • 使用例如运行configure命令参数: ./configure --with-php-config=/usr/local/php5/bin/php-config --with-pdo-dblib=/usr/local/Cellar/freetds/0.95.19/
  • make
  • 复制 modules/pdo_dblib.so 进入PHP安装目录,替换旧版本

1
2017-09-18 15:30