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

Posted

技术标签:

【中文标题】PHP PDO_mssql SQLSTATE[01002] Adaptive Server 连接失败(严重性 9)【英文标题】:PHP PDO_mssql SQLSTATE[01002] Adaptive Server connection failed (severity 9) 【发布时间】:2014-09-13 18:13:13 【问题描述】:

我正在连接到外部 MSSQL 数据库以从 php55/osx 导出,但我遇到了奇怪的问题。

代码:

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

抛出:

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

但来自 CLI 的连接工作正常

tsql -S 主机名 -U 用户 -P 通行证 -L 数据库名:

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

有什么想法吗?我几乎尝试过任何东西,连接到主机名、ip、有和没有端口、连接到实例名称、另一个用户、TDS 版本 7.0、7.1、7.2、8.0,重新安装 php 和 freetds

【问题讨论】:

您是否尝试过在连接中不包括dbname,然后使用mssql_select_db 你能试试像 ODBC 这样的驱动吗?我已经用 dblib 显示了奇怪的结果。 如上所说,也可能和你的dbname属性有关。 我尝试过 ODBC,但我根本无法连接。可能我设置错了。我真的更喜欢 dblib,因为我的抽象(Laravel Eloquent ORM)支持它。即使没有 dbname 我也试过了,但没有帮助 我也有同样的问题。并尝试了一切,但没有成功。唯一的区别是当我执行tsql -C 时,我得到TDS version: 5.0 【参考方案1】:

检查这些:

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

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

    tds 版本 = 8.0

    文字大小 = 20971520

    客户端字符集 = UTF-8

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

【讨论】:

【参考方案2】:

我的解决方案:

获取 FreeTds

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

编译并安装 dblib 扩展

为您安装的任何 php 版本下载 php 源代码 导航到源的ext/pdo_dblib 子文件夹 运行phpize,确保它是适合您安装的正确二进制文件 运行配置命令,例如参数: ./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安装目录,替换旧版本

【讨论】:

以上是关于PHP PDO_mssql SQLSTATE[01002] Adaptive Server 连接失败(严重性 9)的主要内容,如果未能解决你的问题,请参考以下文章

SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: nodename or servname provided,

Zend Framework和SQL Server

致命错误:未捕获的异常“PDOException”,带有消息“SQLSTATE [42000]:语法错误或访问冲突 PHP 和 PDO

SQLSTATE [42000]:语法错误或访问冲突:1064 PHP/MySQL [关闭]

PHP:SQLSTATE [42000]:语法错误或访问冲突:1064

PHP + MYSQL + Laravel - “SQLSTATE [HY000] [2002] 连接被拒绝” [重复]