[英]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.