首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我需要重新编译/安装php来添加mssql扩展吗?

我需要重新编译/安装php来添加mssql扩展吗?
EN

Stack Overflow用户
提问于 2013-07-24 19:57:06
回答 3查看 3.4K关注 0票数 0

我有一个运行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扩展。我抓取了源代码,提取了它,并复制了这些文件:

代码语言:javascript
运行
复制
ext/mssql/config.m4
ext/mssql/php_mssql.c
ext/mssql/php_mssql.h

然后,在我将文件复制到的目录中,运行phpize (需要安装php5-devel才能获得该工具),并编译扩展名如下:

代码语言:javascript
运行
复制
./configure --with-mssql=/usr/local/freetds
make

我还必须在php_mssql.c中添加一行并注释掉一行,然后才能真正正确编译(并不是每个人都需要这样做):

代码语言:javascript
运行
复制
{NULL,NULL,NULL}
/*PHP_FE_END*/

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

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

在从shell运行以下代码时,会显示<h1>Connection Success</h1>;但在浏览器中打开时,在mssql_connect行之后则不会显示任何内容:

代码语言:javascript
运行
复制
<?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对象时,会得到另一个错误:

代码:

代码语言:javascript
运行
复制
<?php
$con = new PDO('odbc:host=MyServer;dbname=DBName','user','pass');
?>

错误:

代码语言:javascript
运行
复制
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不符合):

代码语言:javascript
运行
复制
<?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>,但在我的web浏览器中显示了以下错误:

代码语言:javascript
运行
复制
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}
EN

回答 3

Stack Overflow用户

发布于 2013-07-25 08:22:59

在ODBC中,错误消息包含在消息开头的[]中的元素,最右边的元素是报告错误的链的一部分(参见ODBC诊断与错误状态码 )。因此,unixODBC报告了“未找到unixODBCData源名称,也未指定默认驱动程序”。unixODBC的意思是传递给ODBC的字符串SQLConnect或SQLDriverConnect不标识DSN (数据源名称)或ODBC驱动程序,也没有定义默认的DSN。通过运行odbcinst -j,您可以找到数据源的定义位置,例如,

代码语言:javascript
运行
复制
$ 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中定义。由于您可能正在运行PHP,可能在web服务器下运行,如果我是您,我会坚持使用系统数据源。您可以使用odbcinst -q -l -s列出系统数据源。您可以在Linux/UNIX上找到一个关于Linux/ODBC的非常好的解释。

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

代码语言:javascript
运行
复制
[ODBC]
Trace           = yes
TraceFile               = /tmp/unixodbc.log

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

代码语言:javascript
运行
复制
[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在my /etc/odbcinst.ini中以DSN的形式存在。

isql可以与某些启用ODBC的应用程序不同,因为isql调用ODBC,而现在大多数ODBC应用程序都知道ODBC3并使用SQLDriverConnect。主要的区别是,SQLConnect只提供了3个参数,一个DSN名称,一个用户名和一个密码,其中SQLDriverConnect被赋予了一个定义连接的属性/值对字符串。我只告诉您这一点,所以您知道isql是如何工作的,而其他一些事情是不可能的。

但是,在第二个例子中,当您检查跟踪时,您将看到unixODBC获得了一些足够有用的信息,可以识别驱动程序,加载它并调用freeTDS的ODBC驱动程序,而“无法连接到数据源”的错误来自freeTDS。因此,我建议您的DSN可能是好的,您的freetds.conf在某些方面是不正确的。由于我自己也不使用freeTDS,所以我不确定,但我听说您可以在freeTDS中使用ODBC,而无需任何参考freetds.conf文件和基于使用服务器或ServerName的开关。我相信freeTDS网站上有很多例子。

票数 1
EN

Stack Overflow用户

发布于 2013-07-24 21:03:56

下面是如何从LAMP (Ubuntu)堆栈连接到MS服务器的方法:

/etc/odbc.ini

代码语言:javascript
运行
复制
# 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

代码语言:javascript
运行
复制
# 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

代码语言:javascript
运行
复制
# 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代码:

代码语言:javascript
运行
复制
$con = new PDO('dblib:host=mssql;dbname=MyDB', 'domain\username', 'password');

您可能需要为您的操作系统调整一些东西。为了在Ubuntu上安装必要的软件,我做了如下工作:

代码语言:javascript
运行
复制
sudo apt-get install php5-odbc php5-sybase tdsodbc
票数 0
EN

Stack Overflow用户

发布于 2013-07-24 20:22:55

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

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

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17843693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档