我是否需要重新编译/安装php以添加mssql扩展?

我是否需要重新编译/安装php以添加mssql扩展?,php,sql-server,linux,odbc,freetds,Php,Sql Server,Linux,Odbc,Freetds,我有一个运行php的系统,最近我需要向MSSQL数据库添加连接。我已经正确地安装/配置了FreeTDS和UnixODBC,并且我可以用python以及通过tsql和isql等实用程序进行成功的查询。查看phpinfo()后,我发现我没有“sqlsrv”部分,并且在我的php扩展目录中没有mssql.so文件 我想将其添加到我的系统中,而不必重新编译/安装php。我是否能够找到并下载mssql.so文件,将其放入我的扩展目录中,将extension=/path/to/mssql.so添加到我的ph

我有一个运行php的系统,最近我需要向MSSQL数据库添加连接。我已经正确地安装/配置了FreeTDS和UnixODBC,并且我可以用python以及通过tsql和isql等实用程序进行成功的查询。查看
phpinfo()
后,我发现我没有“sqlsrv”部分,并且在我的php扩展目录中没有
mssql.so
文件

我想将其添加到我的系统中,而不必重新编译/安装php。我是否能够找到并下载
mssql.so
文件,将其放入我的扩展目录中,将
extension=/path/to/mssql.so
添加到我的
php.ini
文件中,并重新加载apache以使其正常工作?还是我还需要采取更多的措施

编辑:

系统使用PHP5.2运行SLES11

编辑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
中添加一行并注释掉一行,然后它才能真正正确编译(不是每个人都需要这样做):

这在/php|mssql/modules/(相对于我编译代码的位置)中创建了mssql.so文件,我可以将其移动到我的扩展目录(您可以通过
php-I | grep extensions
找到)。我在php.ini文件中添加了
extension=mssql.so
;但是,
phpinfo()
中仍然没有“sqlsrv”部分

某些连接方法似乎部分起作用:

从shell运行以下代码时,显示连接成功;但在浏览器中打开时,
mssql\u 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语句/DSN不正确):

使用PDO并安装此

我总是使用PDO,它可以轻松地与不同的db驱动程序和相同的php代码进行所有需要的数据库交互。除了查询语言,有时会有些不同


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

以下是我如何从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
您可能需要对操作系统进行一些调整。为了在Ubuntu上安装必要的软件,我做了如下操作:

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

在ODBC中,错误消息包含消息开头[]中的元素,最右边的元素是报告错误的链的一部分(请参见.So,“[unixODBC][Driver Manager]未找到数据源名称,并且未指定默认驱动程序”由unixODBC报告。unixODBC所说的是传递给ODBC API SQLConnect或SQLDriverConnection的字符串没有标识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/ODBC在

您的第二个错误“[unixODBC][FreeTDS][SQL Server]无法连接到数据源”是由SQL Server驱动程序从FreeTDS报告的,因此在本例中,您必须已向unixODBC传递足够的信息,以至少允许它识别驱动程序、加载驱动程序并在其中调用SQLConnect/SQLDriverConnection。您可以通过在unixODBC中启用跟踪来查看传递给unixODBC的SQLConnect/SQLDriverConnection的内容。启用unix的跟踪通过编辑odbcinst.ini文件(使用上面的odbcinst-j命令进行定位)并在其顶部添加以下内容来实现ODBC:

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

[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存在于my/etc/odbcinst.ini中

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


然而,在第二种情况下,当您检查跟踪时,您将看到unixODBC得到了一些有用的东西,足以识别驱动程序,加载它并调用freeTDS的ODBC驱动程序,以及错误“无法连接到数据源”来自freeTDS。因此,我建议您的DSN可能没有问题,而您的freeTDS.conf在某种程度上是不正确的。因为我自己不使用freeTDS,我不确定,但我听说您可以将ODBC与freeTDS一起使用,而不必参考freeTDS.conf文件,也可以根据您使用的是服务器还是服务器名进行切换。我确信在freeTDS网站。

什么操作系统?可能需要从软件包管理器安装。@Mike:SLES11;我只看到mysql、pgsql和sqlite的软件包。啊,你说得对。我现在注意到Ubuntu也没有mssql的软件包。@Mike我在这里找到了一个软件包:但我不能100%确定它是否会
# 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
$con = new PDO('dblib:host=mssql;dbname=MyDB', 'domain\username', 'password');
sudo apt-get install php5-odbc php5-sybase tdsodbc
$ 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
[ODBC]
Trace           = yes
TraceFile               = /tmp/unixodbc.log
[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.