【问题标题】:Connecting to MS SQL database with PHP: Data source name not found, and no default driver specified使用 PHP 连接到 MS SQL 数据库:未找到数据源名称,并且未指定默认驱动程序
【发布时间】:2013-12-23 08:24:52
【问题描述】:

我被这个问题困扰了一段时间,我无法再进一步了,我做了很多搜索,但没有任何效果...我正在尝试使用 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

我多次检查主机,它是正确的。我也尝试了 tds 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!

问候和节日快乐。

【问题讨论】:

    标签: php sql-server odbc freetds


    【解决方案1】:

    由于您已经定义了CRMCONNECTDSN,您可以使用以下连接方法:

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

    您的连接字符串中还有Driver={CRMCONNECT};CRMCONNECT 正如您所定义的,它不是驱动程序,而是数据源名称。您的驱动程序是FreeTDS

    【讨论】:

    • 感谢您的回答,可惜我没有意识到我定义的是数据源而不是驱动程序。我更改了连接字符串并得到了一个新错误。至少我很高兴我现在看到另一个错误 :-) 我会调查的。
    • 尝试从您的连接字符串中删除;Database=dbname;,并保持与我在回答中的方式完全相同。您不需要传入数据库名称,因为 ODBC 已经定义了 Database 选项。
    【解决方案2】:

    我在 Laravel 5.5 和 Debian 7.11 上的 PHP 7.1.9 中遇到了同样的错误。通过从 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 下可以正常工作。

    【讨论】:

    • 谢谢。但是,在一个系统上,带有{} 的字符串有效,而在另一个系统上,没有大括号的字符串有效。
    • @i_v_harish 你能分辨出这些系统之间的区别吗?
    【解决方案3】:

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

    [Default] Driver = IBM i Access ODBC Driver 64-bit 在我们的例子中

    【讨论】:

      猜你喜欢
      • 2012-03-20
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 2018-07-10
      • 2012-05-10
      相关资源
      最近更新 更多