【发布时间】:2013-07-24 12:00:42
【问题描述】:
我有一个运行 php 的系统,我最近需要添加与 MSSQL 数据库的连接。我已经正确安装/配置了 FreeTDS 和 UnixODBC,我可以在 python 中以及通过 tsql 和 isql 等实用程序进行成功的查询。查看phpinfo() 后,我发现我没有'sqlsrv' 部分,并且我的php 扩展目录中没有mssql.so 文件。
我想将它添加到我的系统中,而无需重新编译/安装 php。我能否找到并下载mssql.so 文件,将其放入我的扩展目录,将extension=/path/to/mssql.so 添加到我的php.ini 文件中,然后重新加载apache 以使其正常工作?还是我需要采取更多步骤?
编辑:
系统运行 SLES11 和 PHP 5.2
编辑 2:
我已经成功安装了 php5-mssql 扩展。我抓取了源代码,提取了它,然后复制了这些文件:
ext/mssql/config.m4
ext/mssql/php_mssql.c
ext/mssql/php_mssql.h
然后,在我将文件复制到的目录中,我运行phpize(您需要安装php5-devel 才能获得此工具),然后编译扩展程序如下:
./configure --with-mssql=/usr/local/freetds
make
我还必须在 php_mssql.c 中添加一行并注释掉一行,然后它才能真正正确编译(不是每个人都需要这样做):
{NULL,NULL,NULL}
/*PHP_FE_END*/
这在 /php_mssql/modules/ 中创建了 mssql.so 文件(相对于我编译代码的位置),我可以将其移动到我的扩展目录(您可以通过 php -i | grep extensions 找到它)。我在我的 php.ini 文件中添加了extension=mssql.so;但是,phpinfo() 中仍然没有 'sqlsrv 部分。
一些连接方法似乎部分有效:
从 shell 运行以下代码时,会显示 <h1>Connection Success</h1>;但是在浏览器中打开时,mssql_connect 行之后没有显示:
<?php
//*************************************************************************
//Open Database Connection
//*************************************************************************
//phpinfo();
$dbserver="MyServer";
$dbusername="user";
$dbpassword="pass";
$defaultdb="DBName";
$cn = mssql_connect($dbserver,$dbusername,$dbpassword) or die("Connection Error");
$db = mssql_select_db($defaultdb,$cn) or die("Database Error");
echo "<h1>Connection Success</h1>";
?>
所以看起来我以这种方式获得了部分连接?当我尝试使用 PDO 对象时,我收到另一个错误:
代码:
<?php
$con = new PDO('odbc:host=MyServer;dbname=DBName','user','pass');
?>
错误:
PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[IM002] SQLDriverConnect: 0 [unixODBC][Driver Manager]Data source name not found, and no default driver specified' in /path/to/php/file/test3.php:3
Stack trace:
#0 /path/to/php/file/test3.php(3): PDO->__construct('odbc:host=MySer...', 'user', 'pass')
#1 {main}
thrown in /path/to/php/file/test3.php on line 3
我也尝试了以下方法(假设之前代码中的 PDO 语句/DSN 不正确):
<?php
try {
$db = new PDO("odbc:Driver=FreeTDS; Server=MyServer; Port=1433; Database=DBName; UID=user; PWD=pass;");
} catch (PDOException $exception) {
die("$exception");
}
echo "<h1>Success!</h1>";
?>
这从 shell 显示 <h1>Success!</h1>,但在我的网络浏览器中显示以下错误:
exception 'PDOException' with message 'SQLSTATE[08001] SQLDriverConnect: 0 [unixODBC][FreeTDS][SQL Server]Unable to connect to data source' in /path/to/php/file/test4.php:3 Stack trace: #0 /path/to/php/file/test4.php(3): PDO->__construct('odbc:Driver=Fre...') #1 {main}
【问题讨论】:
-
什么操作系统?您可能需要从包管理器中安装它。
-
@Mike: SLES11;我只看到 mysql、pgsql 和 sqlite 的包。
-
啊,你是对的。我现在注意到 Ubuntu 也没有用于 mssql 的包。
-
@Mike 我确实在这里找到了一个包:software.opensuse.org/package/php5-mssql?search_term=php5-mssql 但我不能 100% 确定它是否能正常工作。
-
如果它是通过命令行而不是通过 Web 服务器工作的,它必须是 CLI 和 Web 服务器的 php.ini 文件中的差异。我不确定 SuSE 是如何做到的,但是对于基于 Debian 的服务器,它们分别是
/etc/php5/apache2/php.ini和/etc/php5/cli/php.ini。你还可以看到phpinfo()中加载了哪个ini文件。另外,请确保检查错误日志,以查看在浏览器访问时是否在其中放入任何内容,因为它根本不输出任何内容。
标签: php sql-server linux odbc freetds