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` =
php5.4使用dblib扩展,连接sqlserver中文乱码问题