通过 PDO ODBC 将 PHP 连接到 MSSQL

Posted

技术标签:

【中文标题】通过 PDO ODBC 将 PHP 连接到 MSSQL【英文标题】:Connect PHP to MSSQL via PDO ODBC 【发布时间】:2013-12-08 10:47:45 【问题描述】:

当我执行这段代码时:

print_r(PDO::getAvailableDrivers()); 

它说我有可用的odbc 驱动程序。

Array ( [0] => mysql [1] => odbc [2] => sqlite )

但是,当我尝试这样使用它时:

$handle = new PDO("odbc:Server=dbServerIpAddress,myportnumber;Database=mydatabase", "myusername", 'mypassword');

它什么也不做——没有错误,它根本不起作用。它甚至不会超过那条线!

如何通过 PDO 和 ODBC 将 php 连接到这个 MSSQL 数据库?

【问题讨论】:

您使用的是什么操作系统(和版本)? 我的 PHP 在 CentOS linux (mediatemple) 上,但 MSSQL 数据库来自 Microsoft Dynamics (Great Plains)。我不知道它是什么版本。我需要找出来吗?他们告诉我,我的数据库用户只有读取权限。 感谢您在 *** 中提问。我真的很难使用 sql 2000 维护旧的遗留代码。我刚出生 1996 年,现在的数据库更简单,这种方式真的很烦人,但至少有人已经面对它。谢谢 【参考方案1】:

如果您想使用 FreeTDS 驱动程序直接设置 pdo odbc 连接到 MS SQL 服务器,而不在配置文件 freetds.conf 中指定它。

$connection_string = "odbc:DRIVER=FreeTDS;SERVER=$serverName;PORT=$portNo;DATABASE=$dbName"; 
$conn = new PDO($connection_string, $dbUser, $dbPass);

如果您有一个具有命名实例的 MSSQL 服务器,您可以删除端口号,然后以 server_ip\instance_name 格式修改 $serverName 例如:“192.168.1.1\sqlexpress”,其中 sqlexpress 是实例名称。

$connection_string = "odbc:DRIVER=FreeTDS;SERVER=$serverName;DATABASE=$dbName"; 
$conn = new PDO($connection_string, $dbUser, $dbPass);

请注意在odbcinst.ini中配置驱动位置

[FreeTDS]
Description = TDS driver (Sybase/MS SQL)
Driver      = libtdsodbc.so
Setup       = libtdsS.so

【讨论】:

【参考方案2】:

您需要设置几个配置文件。 /etc/odbc.ini/etc/odbcinst.ini/etc/freetds/freetds.conf(这些位置对 Ubuntu 12.04 有效,并且可能对大多数 *nixes 是正确的)。

您需要安装 unixodbcfreetds(不确定 CentOS 上的软件包名称是什么)。在 Ubuntu 中,这将是 apt-get install unixodbc tdsodbc

有关安装这些的帮助,请查看此问题Can't Install FreeTDS via Yum Package Manager

/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             = 7.1

/etc/odbcinst.ini

# Define where to find the driver for the Free TDS connections.
# Make sure you use the right driver (32-bit or 64-bit).
[freetds]
Description = MS SQL database access with Free TDS
Driver      = /usr/lib/i386-linux-gnu/odbc/libtdsodbc.so
#Driver      = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup       = /usr/lib/i386-linux-gnu/odbc/libtdsS.so
UsageCount  = 1

/etc/freetds/freetds.conf(或者您可以在 /etc/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 = 7.1

您可能需要根据您的 MSSQL 版本更改上面的 tds version = 7.1 行。

进行这些更改后,您必须重新启动 apache。

在您的 PHP 代码中,您将像这样创建 PDO 对象:

$pdo = new PDO("dblib:host=mssql;dbname=$dbname", "$dbuser","$dbpwd");

请注意,您的用户名可能需要采用以下格式:domain\username

此外,如果您在页面中执行 phpinfo() 并搜索“freetds”,您就会知道它有效,这将显示一个 mssql 部分,其中 freetds 列为库版本。

【讨论】:

谢谢,但我不知道如何安装它。我已经提取了hosting.com/support/linux/installing-freetds-for-linux 之类的文件,但我是一个 IIS 人!我对此不太满意......有没有更全面的方法?我在 Plesk 上,我相信它是 CentOS(来自 mediatemple)。 好吧,就像你的链接说你需要安装必要的驱动程序。通过 SSH 连接到您的服务器(您可以使用 PuTTY)并(以 root 身份)输入 yum install freetds 来安装 FreeTDS。如果您对此感到不舒服,请找一个熟悉 Linux 的人来帮助您。 我希望我认识一个使用 Linux 的人!我只认识微软的人......我会试一试,看看会发生什么。谢谢。 @user1477388 - 哇哦!很高兴你让它工作:-) 嗨,我无法让它与“dblib:...”DSN 字符串一起使用,但我能够使用 odbc 字符串:“odbc:mssql”(完全跳过freetds.conf 服务器定义)。任何人都知道这样做会有什么不同吗?我能够成功查询(我只尝试了 SELECT 语句,因为这是我的目标)。【参考方案3】:

接受的答案在实际 PHP 调用中是正确的。正如有人正确评论的那样,它应该调用 odbc 驱动程序。其次,它没有使用在 odbc.ini 中配置的数据源名称 (DSN),但实际上是在创建一个 ad-hoc DSN。而是:

$pdo = new PDO("odbc:mssql", "$dbuser","$dbpwd");

其中mssql指的是odbc.ini中的DSN对象

您可以按如下方式创建临时 DSN:

$pd = new PDO('odbc:DRIVER=FreeTDS;SERVERNAME=mssql;DATABASE=' . $dbName,
              $dbuser, $dbpass);

其中 mssql 现在指的是 freetds.conf 中的服务器对象,而 FreeTDS 指的是 odbcinst.ini 中的驱动程序对象em>

(这确实应该是评论,但我没有代表点)。

【讨论】:

这是一个很好的答案,在阅读完您的答案后,您的答案就完美了。 ***.com/questions/13066716/… 这对我有用:$pd = new PDO("odbc:DRIVER=FreeTDS;SERVER=ipaddress\SQLEXPRESS;DATABASE=$dbname", $username, $password);

以上是关于通过 PDO ODBC 将 PHP 连接到 MSSQL的主要内容,如果未能解决你的问题,请参考以下文章

PDO 找不到 ODBC 驱动程序

PHP PDO ODBC 连接

在 PHP 中通过 ODBC(使用 PDO)查询雪花返回不正确的数据

通过 php 中的 PDO 将 xampp 连接到在线 MSSQL 数据库

使用 SQL Server Driver 通过 PDO 连接到 SQL Server

如何在 php docker 容器上安装/启用 pdo-odbc 驱动程序?