Apache 不会使用 PHP 连接到 SQL Server
Posted
技术标签:
【中文标题】Apache 不会使用 PHP 连接到 SQL Server【英文标题】:Apache will not connect to SQL Server with PHP 【发布时间】:2013-01-24 20:35:49 【问题描述】:我正在尝试通过 php 从 apache linux 服务器打开与 Windows 计算机上的 SQL Server 2008 的连接。我已经在防火墙上打开了相应的端口,但我得到了最模糊的错误
警告:mssql_connect() [function.mssql-connect]:无法连接到服务器:xxx.xxx.xx.xxx,xxxx
与:
$myServer = "xxx.xxx.xx.xxx,1433"; //with port number; tried both backslash and colon
$myUser = "un";
$myPass = "pw";
$myDB = "db";
//connection to the database
$dbhandle = mssql_connect($myServer, $myUser, $myPass)
or die( mssql_get_last_message());
有什么方法可以得到更具体的错误信息吗?或者我可以通过某种方式测试两台计算机是否正在通信,以便我可以尝试开始定位问题?
【问题讨论】:
他们有防火墙吗?检查该服务器上的给定端口。 Telnet 到该端口以检查它是否接受连接。 另外,mssql 服务器是否设置为接受远程连接? blogs.msdn.com/b/walzenbach/archive/2010/04/14/… “sql”或“apache”标签都不适合该问题。 @Steve-o 我在 php.net 上读到过有人在 apache 和 MSSQL 之间连接时遇到问题。我认为标签有效。 您可以通过简单的方式检查网络连接。只做 telnet 主机端口 【参考方案1】:这是我用来将 PHP 连接到 MSSQL 从 Ubuntu 机器到 Windows SQL Server 的代码,我不知道它是否对你有帮助,但是这个代码现在已经成功运行,所以我知道它可以在我们的环境...
如您所见,我使用 PDO 而不是 mssql_* 函数。在 Ubuntu 上,我需要安装 php5-sybase 包来获取 dblib 驱动程序。
PHP:
<?php
try
$con = new PDO("dblib:dbname=$dbname;host=$servername", $username, $password);
catch(PDOException $e)
echo 'Failed to connect to database: ' . $e->getMessage() . "\n";
exit;
?>
/etc/odbc.ini
# Define a connection to the MSSQL server.
# The Description can be whatever we want it to be.
# The Driver value must match what we have defined in /etc/odbcinst.ini
# The Database name must be the name of the database this connection will connect to.
# The ServerName is the name we defined in /etc/freetds/freetds.conf
# The TDS_Version should match what we defined in /etc/freetds/freetds.conf
[mssqldb]
Description = MSSQL Server
Driver = freetds
Database = MyDB
ServerName = mssqldb
TDS_Version = 8.0
/etc/odbcinst.ini
# Define where to find the driver for the Free TDS connections.
[freetds]
Description = MS SQL database access with Free TDS
Driver = /usr/lib/i386-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/i386-linux-gnu/odbc/libtdsS.so
UsageCount = 1
/etc/freetds/freetds.conf
[global]
# If you get out-of-memory errors, it may mean that your client
# is trying to allocate a huge buffer for a TEXT field.
# Try setting 'text size' to a more reasonable limit
text size = 64512
# Define a connection to the MSSQL server.
[mssqldb]
host = mssqldb
port = 1433
tds version = 8.0
【讨论】:
谢谢。我希望我可以使用 Ubuntu。我已经尝试了很多次为 PHP 安装 ms sql PDO 并且无济于事。我知道你是个 unbuntu 人,但也许你知道哪里有可用的工作库.. @thomas - 你使用的是什么 Linux 发行版? 必须检查...抱歉花了一段时间:CentOS 6,以及它的 64 位 嗯...这家伙设法得到它(注意 - 他正在做 32 位,但我希望 64 位非常相似)。看起来您需要下载/编译/安装 FreeTDS,然后是适当的 php-mssql RPM。抱歉,我可以提供更多帮助...community.webfaction.com/questions/8777/… @thomas - 该链接对您有帮助吗?您是否能够安装和配置 FreeTDS 和 php-mssql RPM?【参考方案2】:我今天遇到了同样的问题。这对我有用:
不是这个
$myServer = "xxx.xxx.xx.xxx,1433"; //with port number; tried both backslash and colon
试试这个:
$myServer = "mssqldb"; //must correspond to [entry] in freetds.conf file
在您的情况下,为了清楚起见,我将重命名条目并将完全限定的主机名用于配置文件中的条目
# Define a connection to the MSSQL server.
[mssqldbAlias]
host = mssqldb.mydomain.com
port = 1433
tds version = 8.0
调用 mssql_connect() 的第一个参数必须对应于 freetds.conf 文件中的 [entry]。 所以你的电话变成了
$myServer = "mssqldbAlias";
//connection to the database
$dbhandle = mssql_connect($myServer, $myUser, $myPass)
or die( mssql_get_last_message());
【讨论】:
以上是关于Apache 不会使用 PHP 连接到 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章
在 vagrant 中将 Node.js 连接到 apache 服务器上的 postgres
在 AIX7.1 上通过 Apache 使用 PHP 连接到 DB2