通过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可能是正确的)。
你需要安装unixodbc
和freetds
(不知道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
(这应该是一个评论,但我没有代表点)。