mamp pro, php 7.3.8 и удаленный mssql-сервер - PullRequest
0 голосов
/ 16 октября 2019

я использую mamp pro на mac (catalina) и пытаюсь подключиться к удаленному серверу mssql.

для работы с mssql я установил в соответствующую папку php mamp:

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 

что мне не хватает?

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

если кому-то нужен ответ получился, нужно установить еще одну вещь: brew install msodbcsql@13.1.9.2 mssql-tools@14.0.6.0

0 голосов
/ 16 октября 2019

Драйвер PHP-PDO хочет получить доступ к MS-SQL-серверу через ODBC-драйвер SQL-сервера. Вам нужно установить odbc драйвер , выполнив

brew install msodbcsql17 mssql-tools 

После этого вам нужно включить TCP-соединения на sql-сервере, добавить имя входа, добавить имя входа в правильную роль изатем вам нужно открыть порт 1433, чтобы TCP-соединения с SQL-сервером могли работать (если только вы не используете PHP и sql-сервер на одном компьютере).

И вам может потребоваться установить UnixODBC:

brew install unixodbc

Также вам может понадобиться добавить php_odbc к расширениям

extension=php_odbc.dll

, а php-fpm использует другой ini-файлчем php-cli / php-cgi.

В Ubuntu INI-файл PHP-fpm находится в

/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. Может быть, вы можете скомпилировать его из источника. </p>

Мой работает на 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, на докере), и это сработало:

<?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/>";
    }
}
?>

Результаты:

Microsoft SQL Server 2017 (RTM-CU16) (KB4508218) - 14.0.3223.3 (X64)22 июля 2019 17:43:08 Copyright (c) Microsoft CorporationDeveloper Edition (64-разрядная версия) в Linux (Ubuntu 16.04.6 LTS)

Я получаю смешное предупреждение, хотя:

Предупреждение PHP: Запуск PHP: невозможно загрузить динамическую библиотеку '/usr/lib64/php/modules/pdo_sqlsrv.so' - /usr/lib64/php/modules/pdo_sqlsrv.so: неопределенный символ: php_pdo_register_driver в поле Неизвестно в строке 0

Если я удаляю

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. Доступные моды затем (уже) объединяются в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...