如何在PHP 7上使用ODBC Driver 17连接到命名实例?

时间:2019-01-03 21:25:06

标签: sql-server odbc php-7.1

我试图从运行PHP 7.1的linux框中连接到MS SQL数据库,该数据库是命名实例。我正在使用用于SQL Server的ODBC驱动程序17。

我已经从Microsoft成功安装了ODBC驱动程序,并已成功连接到未命名实例的数据库。对于命名实例,我尝试了我能想到的每种组合(带/不带端口,引号,括号等)

//$host = 'mySVR-SQL'; // THIS WORKS
//$host = '10.10.10.12345'; // THIS ALSO WORKS
$host = "SERV\INSTANCE_NAME"; // THIS DOES NOT WORK
$host = "SERV\INSTANCE_NAME,1433"; // THIS DOES NOT WORK
$host = "[SERV\INSTANCE_NAME]"; // THIS DOES NOT WORK
$host = '123.12.34.56\INSTANCE_NAME'; // THIS DOES NOT WORK
$user = 'my_username';
$pass = 'my_password';
$db = 'my_database';

$conn = "odbc:DRIVER={ODBC Driver 17 for SQL Server};SERVER=$host;DATABASE=$db";

$db_c = new PDO($conn, $user, $pass);

//connection string without variables for troubleshooting
$db_c = new PDO("odbc:Driver={ODBC Driver 17 for SQL Server};Server=123.12.34.56\INSTANCE_NAME;Database=MyDatabase", "my_username", "my_password");

这是我收到的错误消息:

SQLSTATE[HYT00] SQLDriverConnect: 0 [unixODBC][Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired

我该怎么做才能进一步解决此问题?请注意,在php 5.6上使用pdo_dblib驱动程序之前,我能够正常连接。但是,由于我们要升级到PHP 7,所以我认为我们应该使用Microsoft驱动程序(除了命名实例外,它都可以正常工作)。

这确实有效(使用dblib):

$db_c = new PDO("dblib:host=123.12.34.56\INSTANCE_NAME;dbname=MyDatabase;charset=utf8", "my_username", "my_password");

1 个答案:

答案 0 :(得分:0)

对于具有命名实例和自定义端口的MS SQL数据库,它将起作用:

new \PDO("sqlsrv:Server=IP_ADDRESS\\INSTANCE_NAME,CUSTOM_PORT;Database=DATABASE_NAME", "my_username", "my_password");

您需要使用2个反斜杠来转义反斜杠。而且,如果有自定义端口,则需要将其包含在连接字符串中。