当我执行此代码时:
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数据库?
您需要设置几个配置文件。/etc/odbc.ini
、/etc/odbcinst.ini
和/etc/freetds/freetds.conf
(这些位置对Ubuntu 12.04有效,对大多数*nixes可能正确)。
您需要安装unixodbc
和freetds
(不确定在CentOS上的软件包名称)。在Ubuntu中,这将是apt-get install unixodbc tdsodbc
。
有关安装这些软件的帮助,请参阅以下问题Can';t通过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.cconf中找到它)
# 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列为库版本。
接受的答案直到实际的PHP调用都是正确的。正如有人正确地评论的那样,它应该调用odbc驱动程序。其次,它没有使用在odbc.ini中配置的数据源名称(DSN),而是在创建一个特殊的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中的驱动程序对象
(这真的应该是一个评论,但我没有代表点)。
如果您想使用FreeTDS驱动程序直接设置到MS SQL server的pdo-odbc连接,而无需在配置文件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