通过PDO ODBC连接PHP到MSSQL

当我执行这个代码:

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

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

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

有关安装这些的帮助,请看这个问题不能通过Yum Package Manager安装FreeTDS

/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.conffind它)

 # 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更改上面的tds version = 7.1行。

完成这些更改后,您将不得不重新启动Apache。

在您的PHP代码中,您将创build您的PDO对象,如下所示:

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

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

另外,如果您在页面中执行phpinfo()并search“freetds”,它将显示一个mssql部分,freetds被列为“库版本”,您将会知道它的工作原理。

接受的答案是正确的,直到实际的PHP调用。 正如有人正确地评论它应该调用odbc驱动程序。 其次,它没有使用在odbc.ini中configuration的数据源名称(DSN),而是实际上创build了一个ad-hoc DSN。 代替:

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

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

您可以创build一个临时DSN,如下所示:

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

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

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