我有一个运行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
中添加一行并注释掉一行,然后才能真正正确编译(并不是每个人都需要这样做):
{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
行之后则不会显示任何内容:
<?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>
,但在我的web浏览器中显示了以下错误:
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}
发布于 2013-07-25 08:22:59
在ODBC中,错误消息包含在消息开头的[]中的元素,最右边的元素是报告错误的链的一部分(参见ODBC诊断与错误状态码 )。因此,unixODBC报告了“未找到unixODBCData源名称,也未指定默认驱动程序”。unixODBC的意思是传递给ODBC的字符串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中定义。由于您可能正在运行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的跟踪:
[ODBC]
Trace = yes
TraceFile = /tmp/unixodbc.log
现在,当您运行php示例时,它将记录到/tmp/unixodbc.log所有ODBC调用,您要寻找的调用是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在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网站上有很多例子。
发布于 2013-07-24 21:03:56
下面是如何从LAMP (Ubuntu)堆栈连接到MS服务器的方法:
/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-24 20:22:55
使用PDO并安装此http://www.php.net/manual/en/ref.pdo-sqlsrv.php
我总是使用PDO,它可以轻松地完成您需要的所有数据库交互,使用不同的db驱动程序和相同的php代码。除了有时有点不同的查询语言。
对于MSSQL,只需添加驱动程序,只需粘贴..dll,将条目添加到conf.ini并重新启动apache即可。
https://stackoverflow.com/questions/17843693
复制相似问题