繁体   English   中英

mamp pro、php 7.3.8 和远程 mssql 服务器

[英]mamp pro, php 7.3.8 and remote mssql server

我在 mac (catalina) 上使用 mamp pro 并尝试连接到远程 mssql 服务器。

为了使用安装在相关 php mamp 文件夹上的 mssql:

brew install msodbcsql17 mssql-tools 
pecl install sqlsrv pdo_sqlsrv

比我更新了 php.ini 文件

extension=sqlsrv.so
extension=pdo_sqlsrv.so

当我尝试运行时(当然使用正确的凭据和服务器名称)

$db = new PDO("sqlsrv:Server=MY.SERVER;Database=MYDBNAME", "MYUSER", "MYPASS");

我收到此错误:

Fatal error: Uncaught PDOException: SQLSTATE[IMSSP]: This extension requires the Microsoft ODBC Driver for SQL Server to communicate with SQL Server. Access the following URL to download the ODBC Driver for SQL Server for x64: https://go.microsoft.com/fwlink/?LinkId=163712 

我错过了什么?

PHP-PDO 驱动想要通过 SQL-server 的 ODBC 驱动访问 MS-SQL-server。
您需要通过执行安装odbc 驱动程序

brew install msodbcsql17 mssql-tools 

Afterwards, you need to enable TCP connections on sql-server, add a login, add the login to the correct role, and then you need to open port 1433, so TCP connections to SQL-server can work (unless you have both PHP and the sql-server run on同一台机器)。

您可能必须安装 UnixODBC:

brew install unixodbc

此外,您可能必须将 php_odbc 添加到扩展

extension=php_odbc.dll

并且 php-fpm 使用另一个 ini 文件而不是 php-cli/php-cgi。

在 ubuntu 上,PHP-fpm ini 文件位于

/etc/php/7.2/fpm/php.ini

而另一个在

/etc/php/7.2/cli/php.ini

另一种选择,如果你不能让 ODBC 工作,是使用PDO_DBLIB ,它使用 FreeTDS 而不是 ODBC。 反正这样可能更好。

sudo pecl install pdo_dblib

但是,这将您限制在 php > 5.03 < 6.0.0。 也许你可以从源代码编译它。

我在 Linux 上工作,我所要做的就是:

sudo apt-get install php-fpm php-dev php-pear
sudo pecl install sqlsrv pdo_sqlsrv

(我已经安装了 msodbcsql17 和 mssql-tools)

添加行

extension=sqlsrv.so
extension=pdo_sqlsrv.so

进入两个ini文件,并完成。

然后我执行了连接测试样本

php ./test.php

(我有 2017 端口,在 docker 上),它工作:

<?php
$serverName = "localhost,2017";
$connectionOptions = array(
    "database" => "MY_DB_NAME",
    "uid" => "sa",
    "pwd" => "TOP_SECRET"
);

// Establishes the connection
$conn = sqlsrv_connect($serverName, $connectionOptions);
if ($conn === false) {
    die(formatErrors(sqlsrv_errors()));
}

// Select Query
$tsql = "SELECT @@Version AS SQL_VERSION";

// Executes the query
$stmt = sqlsrv_query($conn, $tsql);

// Error handling
if ($stmt === false) {
    die(formatErrors(sqlsrv_errors()));
}
?>

<h1> Results : </h1>

<?php
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    echo $row['SQL_VERSION'] . PHP_EOL;
}

sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);

function formatErrors($errors)
{
    // Display errors
    echo "Error information: <br/>";
    foreach ($errors as $error) {
        echo "SQLSTATE: ". $error['SQLSTATE'] . "<br/>";
        echo "Code: ". $error['code'] . "<br/>";
        echo "Message: ". $error['message'] . "<br/>";
    }
}
?>

<h1>结果:</h1>
微软 SQL 服务器 2017 (RTM-CU16) (KB4508218) - 14.0.3223.3 (X64)
2019 年 7 月 22 日 17:43:08 版权所有 (c) Microsoft Corporation
Linux(Ubuntu 16.04.6 LTS)上的开发人员版(64 位)

不过,我收到了一个有趣的警告

PHP 警告:PHP 启动:无法加载动态库 '/usr/lib64/php/modules/pdo_sqlsrv.so' - /usr/lib64/php/modules/pdo_sqlsrv.so: undefined symbol: undefined symbol on line_doregister in php_do

如果我删除

extension=pdo_sqlsrv.so

然后它可以工作,没有警告。

笔记:
刚刚修好了废话。
如果您运行php --ini ,它将列出 php 加载的所有 ini 文件。

放置这两行的正确位置(在 Linux 上)是

/etc/php/7.2/mods-available/pdo.ini

如果在extension=pdo_sqlsrv.so之前加载extension=pdo.so ,则会出现上述警告。 另外,那样的话,你只需要设置一次扩展名,php-cli 和 php-fpm 都可以。 mods-available 然后(已经)符号链接到 php-fpm 和 php-cli。

你可能在 Mac 上遇到同样的问题。

为确保没有权限问题,请创建一个测试用户 sysadmin:

-- The available default languages: 
-- SELECT * FROM sys.syslanguages AS sysl

CREATE LOGIN [WebServicesTest] WITH PASSWORD = 'TOP_SECRET' 
    ,CHECK_EXPIRATION = off
    ,CHECK_POLICY = off
    ,DEFAULT_LANGUAGE = us_english;


EXEC master..sp_addsrvrolemember [WebServicesTest], N'sysadmin';

要测试连接是否实际与用户一起使用,可以使用AzureDataStudio
谨防:
如果您的系统使用 OpenSSL 1.1(例如 Ubuntu 19.04),则需要下载 Insiders -build
基于 TDS 的提供程序 (freeTDS/ODBC) 需要打开 TCP,即使您在 localhost 上工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM