0

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

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

编辑:

系统使用 PHP 5.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然后它才能真正正确编译(不是每个人都需要这样做):

{NULL,NULL,NULL}
/*PHP_FE_END*/

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

一些连接方法似乎部分有效:

从 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>";
?>

<h1>Success!</h1>从 shell 显示,但在我的网络浏览器中显示以下错误:

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}
4

3 回答 3

1

在 ODBC 中,错误消息在消息的开头包含 [] 中的元素,最右边的元素是报告错误的链的一部分(请参阅ODBC 诊断和错误状态代码。因此,“[unixODBC][驱动程序管理器]数据源未找到名称,并且未指定默认驱动程序”由 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 网站上有很多示例。

于 2013-07-25T08:22:59.087 回答
0

以下是我从 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
于 2013-07-24T21:03:56.513 回答
-1

Use PDO and instal this http://www.php.net/manual/en/ref.pdo-sqlsrv.php

I always use PDO it can easy do all the database interaction you need with different db drivers and the same php code. Except the query languages which is sometimes a little different.

For MSSQL you only need to add the drivers just paste the .dll's, add the entry to the conf.ini and restart apache.

于 2013-07-24T20:22:55.940 回答