使用PHP连接到MS SQL数据库:找不到数据源名称,并且未指定默认驱动程序

时间:2013-12-23 08:24:53

标签: php sql-server odbc freetds

我已经坚持了这个问题一段时间了,我只是无法进一步,我做了很多搜索但没有任何作用...我正在尝试使用odbc连接到带有php的Microsoft SQL数据库

所有内容都设置如下(文件中“”之间的值正确):

/etc/odbc.ini:

[CRMCONNECT]
Description = "CRMConnect"
Driver = FreeTDS
Trace = No
Servername = CRMSERVER
Database = "dbname"
UserName = "username"
Password = "password"

[Default]
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so

/etc/odbcinst.ini:

[FreeTDS]
Description = tdsodbc
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
CPTimeout       = 5
CPReuse         = 5
FileUsage       = 1

/etc/freetds/freetds.conf:

[CRMSERVER]
host = xxx.xxx.xxx.xxx 
port = 1433
tds version = 8.0

我多次重复检查主机,这是正确的。我也试过了版本7.0,但没有运气。

我可以使用isql成功连接到服务器:

root@crmart-web004:/# isql -v CRMCONNECT "user" "pass"
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>

但是使用php我无法让它工作,我收到以下错误:

[unixODBC][Driver Manager]Data source name not found, and no default driver specified 

我的关系字符串:

$connection = odbc_connect("Driver={CRMCONNECT};Server=xxx.xxx.xxx.xxx;Database=dbname;","username","password");

所有参数都经过双重检查并且是正确的。

为什么我可以成功连接isql但是在php中失败了?

我的php版本:

PHP Version 5.4.4-14+deb7u5

odbcinst配置:

unixODBC 2.2.14
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

我希望有人知道可能出现的问题。

提前致谢

此致

更新:

我将我的连接字符串更改为:

$connection = odbc_connect("CRMCONNECT;Database=dbname;","user","pass");

导致另一个错误:

[unixODBC][Driver Manager]Driver's SQLAllocHandle on SQL_HANDLE_HENV failed

我会调查那个,再次感谢vinodadhikary

问候。

更新2:

我的连接字符串错误,应该是:

$connection = odbc_connect("CRMCONNECT","user","pass");

感谢vinodadhikary!

问候和节日快乐。

3 个答案:

答案 0 :(得分:6)

由于您已经定义了CRMCONNECT DSN,因此您可以使用以下连接方法:

$connection = odbc_connect("CRMCONNECT","username","password");

同样在您的连接字符串中,您有Driver={CRMCONNECT};。您定义的CRMCONNECT不是驱动程序,它是数据源名称。您案例中的驱动程序为FreeTDS

答案 1 :(得分:1)

我在Debian 7.11上使用PHP 7.1.9在Laravel 5.5中遇到了同样的错误。通过从DSN中的驱动程序名称中删除花括号来修复它:

失败:"odbc:Driver={fail};Server=host;Database=db;"

工作:"odbc:Driver=success;Server=host;Database=db;"

另一个工作选项是将数据源配置从此字符串移动到odbc.ini然后引用它:"odbc:odbc_ini_data_source_name"

有趣的是,Driver={SQL Server}(带花括号)的相同数据源在Windows 10下正常工作。

答案 2 :(得分:0)

同样适用于PDO。 $conn = new PDO("odbc:CRMCONNECT");并确保在odbc.ini中设置默认驱动程序

在我们的案例中

[Default] Driver = IBM i Access ODBC Driver 64-bit