php dblib,错误:SQLSTATE[HY000] 未知主机名(严重性 2)

Posted

技术标签:

【中文标题】php dblib,错误:SQLSTATE[HY000] 未知主机名(严重性 2)【英文标题】:php dblib, Error: SQLSTATE[HY000] Unknown host machine name (severity 2) 【发布时间】:2015-06-16 16:36:46 【问题描述】:

我使用的是 Mac 电脑 OSX 10.9。 Freetds 和 unixODBC 已经安装在我的计算机上,并作为扩展添加到 php ,尝试连接到远程 MSSQL 服务器。以下是我的连接测试:

<?php 
$dbh = new PDO('dblib:host=Hostname ;dbname=Dbname', 'user', 'pw'); 
if (!$dbh) 
    die('Something went wrong while connecting to MSSQL');

?>

错误日志文件显示:

[error] [client 127.0.0.1] PHP Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] Unknown host machine name (severity 2)

可能是什么问题?如果我使用终端连接到以下相同的数据库,我的 freetds 和 unixODBC 似乎工作正常:

$ isql Hostname user pw 
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> 

$ tsql -S Hostname  -U user
Password: 
locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1> 

这是我的 freetds.conf

[global]
    # TDS protocol version
    tds version = 8.0 
[Hostname]
host = IP
port = 1433
tds version = 8.0
client charset = UTF-8 ##needed on MAC OS X
dump file = /tmp/freetds.log

还有我的 odbc.ini

[Hostname]
#Driver=/usr/local/lib/libtdsodbc.so
Driver = /usr/local/Cellar/freetds/0.91_2/lib/libtdsodbc.so
Trace=No
Server=IP
Port=1433
TDS_Version=8.0
client charset = UTF-8  

我的 phpinfo() 显示已添加扩展,PDO 部分有 dblib,pdo_dblib 部分已启用驱动程序 Flavor 的 freetds。

那么问题是什么?知道我应该做什么吗? 任何帮助将不胜感激。

这是我的 odbcinst.ini:

[freetdS]
Description = v0.63 with protocol v8.0 
Driver = /usr/local/Cellar/freetds/0.91_2/lib/libtdsodbc.so

【问题讨论】:

您在更改这些配置文件后是否重新启动了 Apache(或您正在使用的任何 Web 服务器)? 另外,我注意到在您的 odbc.ini 中 Hostname 拼写错误(至少您在此处显示的代码) - 您将其显示为 Hostnmae My answer 类似的问题可能会有所帮助。查看odbcinst.ini 配置,在我的odbc.ini 文件中,我有一个ServerName 参数,但没有Server 参数。 是的,我尝试重新启动 apache 并没有任何变化,Hostnmae 只是我的输入错误,它们在我的文件中是相同的。我添加了我的 odbcinst.ini 如果我将 Server 更改为 ServerName ,tsql amd isql 将无法工作 【参考方案1】:

我实际上通过删除 php 扩展文件夹中的 mssql.so 和 pdo_dblib.so 解决了这个问题,重新下载 php5.4 ,phpize 并再次构建两个 .so 文件并将其放回去。然后它工作。

我创建的 olde pdo_dblib.so 文件似乎指向了其他地方的不同 freetds.conf。

【讨论】:

locate freetds.conf 会给你一个线索,如果有多个 conf 文件挂在周围(尽管你可能必须首先在 OSX 上设置数据库)。【参考方案2】:

由于在没有真实文件信息的情况下无法通过代理进行调试,因此您选择使用虚拟文本保护 IP 地址和主机名。我将使用 PHP 代码。主机名应该是 FQDN 或 IP 地址。不是 ini 文件中的占位符文本。

<?php 
    $dbh = new PDO('dblib:host=[ ip address || example.com || localhost] ;dbname=Dbname', 'user', 'pw'); 
    if (!$dbh)
    
        die('Something went wrong while connecting to MSSQL');
    
?>  

【讨论】:

以上是关于php dblib,错误:SQLSTATE[HY000] 未知主机名(严重性 2)的主要内容,如果未能解决你的问题,请参考以下文章

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

laravel SQLSTATE[HY000] [2002] 没有这样的文件或目录 (SQL: select * from `sessions` where `id` =

如何通过 PHP 连接到 Sybase

php5.4使用dblib扩展,连接sqlserver中文乱码问题

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

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