【问题标题】:Will I need to recompile/install php to add the mssql extension?我需要重新编译/安装 php 来添加 mssql 扩展吗?
【发布时间】: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 显示 &lt;h1&gt;Success!&lt;/h1&gt;,但在我的网络浏览器中显示以下错误:

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


【解决方案1】:

在 ODBC 中,错误消息在消息的开头包含 [] 中的元素,最右边的元素是报告错误的链的一部分(请参阅ODBC Diagnostics & Error Status Codes。所以,“[unixODBC][Driver Manager]Data source未找到名称,并且未指定默认驱动程序”由 unixODBC 报告。unixODBC 所说的是传递给 ODBC API SQLConnect 或 SQLDriverConnect 的字符串不识别 DSN(数据源名称)或 ODBC 驱动程序,并且没有默认 DSN已定义。您可以通过运行 odbcinst -j 找到定义数据源的位置,例如,

$ odbcinst -j
unixODBC 2.2.14
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /home/martin/.odbc.ini
SQLULEN Size.......: 4
SQLLEN Size........: 4
SQLSETPOSIROW Size.: 2

这里,驱动程序定义在 /etc/odbcinst.ini 中,系统数据源定义在 /etc/odbc.ini 中,用户数据源定义在 /home/martin/.odbc.ini 中。因为您可能会在 Web 服务器下运行 PHP,所以如果我是您,我会坚持使用系统数据源。您可以使用 odbcinst -q -l -s 列出系统数据源。您可以在 Linux/UNIX ODBC 找到关于 Linux/ODBC 的非常好的解释。

您的第二个错误“[unixODBC][FreeTDS][SQL Server]Unable to connect to data source”是由 FreeTDS 的 SQL Server 驱动程序报告的,因此在这种情况下,您必须向 unixODBC 传递足够的信息以至少允许它识别驱动程序,加载它并在其中调用 SQLConnect/SQLDriverConnect。您可以通过在 unixODBC 中启用跟踪来查看传递给 unixODBC 的 SQLConnect/SQLDriverConnect 的内容。您可以通过编辑 odbcinst.ini 文件(使用上面的 odbcinst -j 命令定位)并将以下内容添加到文件顶部来启用 unixODBC 跟踪:

[ODBC]
Trace           = yes
TraceFile               = /tmp/unixodbc.log

现在,当您运行 php 示例时,它会将所有 ODBC API 调用记录到 /tmp/unixodbc.log,而您要查找的是 SQLConnect 或 SQLDriverConnect。例如,当我使用 XXX 和 YYY 的用户名和密码连接到名为 mydsn 的 DSN 时,我看到:

[ODBC][31521][1374740062.012973][SQLDriverConnect.c][687]
                Entry:            
                        Connection = 0x9d7d430            
                        Window Hdl = (nil)            
                        Str In = [DSN=mydsn;UID=XXX;PWD=********][length = 29]            
                        Str Out = 0xbfdeb83c            
                        Str Out Max = 512            
                        Str Out Ptr = 0xbfdeb638            
                        Completion = 0
                UNICODE Using encoding ASCII 'ISO8859-1' and UNICODE 'UCS-2LE'

                DIAG [01000] [Easysoft][SQL Server Driver][SQL Server]Changed database context to 'master'.

                DIAG [01000] [Easysoft][SQL Server Driver][SQL Server]Changed language setting to us_english.

请注意,此连接是成功的,它清楚地显示连接字符串的一部分是 DSN=mydsn 并且 mydsn 作为 DSN 存在于我的 /etc/odbcinst.ini 中。

isql 与某些启用 ODBC 的应用程序的工作方式不同,因为 isql 调用 ODBC API SQLConnect,而如今大多数 ODBC 应用程序都支持 ODBC 3 并使用 SQLDriverConnect。主要区别是 SQLConnect 只给出了 3 个参数,一个 DSN 名称、一个用户名和一个密码,其中 SQLDriverConnect 给出了一个定义连接的属性/值对字符串。我只是告诉你这一点,以便你知道 isql 是如何工作的,而其他东西却不能。

但是,在第二种情况下,当您检查跟踪时,您会看到 unixODBC 获得了足够有用的东西来识别驱动程序、加载它并调用 freeTDS 的 ODBC 驱动程序,并且错误“无法连接到数据源”来自 freeTDS .所以,我建议您的 DSN 可能没问题,而您的 freetds.conf 在某些方面不正确。由于我自己不使用freeTDS,所以我不确定,但我听说您可以将ODBC 与freeTDS 一起使用,而无需参考freetds.conf 文件并根据您使用Server 还是ServerName 进行切换。我确信 freeTDS 网站上有很多示例。

【讨论】:

  • 我有一个几乎类似的条目;除了,我在UNICODE 行之后得到以下行:DIAG [01000] [FreeTDS][SQL Server]Unexpected EOF from the server DIAG [01000] [FreeTDS][SQL Server]Adaptive Server connection failed DIAG [08001] [FreeTDS][SQL Server]Unable to connect to data source
  • 您可能使用了错误的 TDS 版本(只是猜测)。尝试启用 freeTDS 日志记录并查看内容。您总是可以在 freetds 邮件列表上获得更多帮助 - 我在 SO 上看不到这些人。
【解决方案2】:

这是我从 LAMP (Ubuntu) 堆栈连接到 MS SQL 服务器的方法:

/etc/odbc.ini

# Define a connection to a Microsoft SQL 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
[mssql]
Description             = MSSQL Server
Driver                  = freetds
Database                = XXXXXX
ServerName              = MSSQL
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

# The basics for defining a DSN (Data Source Name)
# [data_source_name]
#       host = <hostname or IP address>
#       port = <port number to connect to - probably 1433>
#       tds version = <TDS version to use - probably 8.0>

# Define a connection to the Microsoft SQL Server
[mssql]
        host = XXXXXX
        port = 1433
        tds version = 8.0

这是 PHP 代码:

$con = new PDO('dblib:host=mssql;dbname=MyDB', 'domain\username', 'password');

您可能需要针对您的操作系统进行一些调整。为了在 Ubuntu 上安装必要的软件,我做了这样的事情:

sudo apt-get install php5-odbc php5-sybase tdsodbc

【讨论】:

  • 我已经完成了所有这些设置,并且可以与 isql、tsql 和 osql 建立连接;但是在使用 PDO 对象时出现错误(请参阅上面的编辑 2)。看起来它找不到 DSN 或其他东西。你知道会发生什么吗?
【解决方案3】:

使用 PDO 并安装此 http://www.php.net/manual/en/ref.pdo-sqlsrv.php

我一直使用 PDO,它可以使用不同的数据库驱动程序和相同的 php 代码轻松完成您需要的所有数据库交互。除了查询语言有时会有所不同。

对于 MSSQL,您只需添加驱动程序,只需粘贴 .dll 文件,将条目添加到 conf.ini 并重新启动 apache。

【讨论】:

  • 看来只能在 Windows 系统上使用。我以为人们理解我使用的是 Linux(因为我说我使用的是 UnixODBC),但我意识到我应该将其包含在帖子中(请参阅我的编辑)。
  • 哦,对不起,祝你好运,顺便说一句,你为什么还要在 linux 机器上使用微软的 sql 服务器,这不是自找麻烦。只需将 Windows 主机用于 microsoft sql 服务器。边补充边说:为什么不用mysql这样更适合linux的sql server呢?
  • mssql 系统已经到位,并被我组织中的许多不同的人使用。我正在尝试创建另一个站点,该站点从数据库中提取一些数据用于其他目的。我正在制作一个小型网站,并且不想使用 Windows 系统(尽管事实证明这有点挑战性)。
猜你喜欢
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 2014-09-20
  • 2013-09-18
  • 1970-01-01
  • 2017-05-22
  • 2014-06-03
  • 1970-01-01
相关资源
最近更新 更多