通过PDO ODBC将PHP连接到MSSQL

时间:2013-11-23 14:50:54

标签: php sql-server pdo odbc

执行此代码时:

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数据库?

3 个答案:

答案 0 :(得分:36)

接受的答案是正确的,直到实际的PHP调用。正如有人正确地评论说它应该调用odbc驱动程序。其次,它不使用已在 odbc.ini 中配置的数据源名称(DSN),但实际上是在创建ad-hoc DSN。代替:

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

其中 mssql 是指 odbc.ini

中的DSN对象

您可以按如下方式创建ad-hoc DSN:

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

其中 mssql 现在引用 freetds.conf 中的服务器对象, FreeTDS odbcinst.ini中的驱动程序对象

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

答案 1 :(得分:33)

您需要设置几个配置文件。 /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

您可能需要更改上面的tds version = 7.1行,具体取决于您的MSSQL版本。

完成这些更改后,您必须重新启动apache。

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

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

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

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

答案 2 :(得分:2)

如果要使用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例如:&#34; 192.168.1.1 \ sqlexpress&#34;其中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