Драйвер 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.