Ошибка. Не удается подключиться к базе данных: SQLSTATE [HYT00]

Я получаю следующую ошибку при попытке подключиться к моей базе данных Microsoft SQL Server с использованием номера порта по умолчанию:

Error. Cannot connect to database: SQLSTATE[HYT00]: [unixODBC][Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired

Это код PHP, который я использую для подключения к базе данных:

<?php

class DB_Connect {
    private $db;

    function construct() {
    }

    public function connect() {
        require_once 'String.php';

        try {
            $this->db = new PDO('sqlsrv:Server=$server,1433; Database=$db', $user, $pass);
        } catch (PDOException $e) {
            return "Error. Cannot connect to database: " . $e->getMessage();
        }
    }
}

?>

Я на 100% уверен, что учетные данные верны, поскольку они работают, когда я запускаю сценарий на localhost с помощью xampp.

Что я делал до сих пор:

  • Установил драйверы pdo на машину linux
  • Установил драйверы obdc на машину linux
  • Установлены драйверы sqlsrv на Linux-машину

введите здесь описание изображения

Это конфигурация, которую я использую на сервере:

PHP версии 7.0.30 подключается к SQL Server 2017, размещенному на Gearhost.

Кто-нибудь может пролить свет на то, что может быть не так?


person Michele La Ferla    schedule 26.05.2018    source источник
comment
Я думаю, просто нужно заменить одинарную кавычку на двойную. $ This- ›db = new PDO (sqlsrv: Server = $ server, 1433; Database = $ db, $ user, $ pass);   -  person Nishit Manjarawala    schedule 26.05.2018
comment
все еще та же ошибка   -  person Michele La Ferla    schedule 26.05.2018
comment
Можно ли подключиться к SQL Server 2017, размещенному на Gearhost, с помощью SQL Server Management Studio с тем же именем сервера и учетными данными?   -  person Zhorov    schedule 28.05.2018
comment
Да, конечно, могу. Работает с SQL-сервера   -  person Michele La Ferla    schedule 28.05.2018
comment
Я думаю, что проблема может быть связана с настройкой динамических портов TCP / IP SQL Server. Извините, но я не могу воспроизвести ваш сценарий (у меня нет компьютера с LINUX). Думаю, эта ссылка полезна: stackoverflow.com/questions/48651225/.   -  person Zhorov    schedule 28.05.2018


Ответы (2)


В основном проблемы были 2:

  1. Во-первых, неправильно установились драйверы. Мне нужно было установить драйвера через PECL. Вот как я установил их на Redhat Cent OS 7:

Установите PHP:

sudo su
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm
rpm -Uvh remi-release-7.rpm epel-release-latest-7.noarch.rpm
subscription-manager repos --enable=rhel-7-server-optional-rpms
yum-config-manager --enable remi-php72
yum update
yum install php php-pdo php-xml php-pear php-devel re2c gcc-c++ gcc

Установить необходимые компоненты

sudo yum-config-manager --enable rhel-server-rhscl-7-rpms
sudo yum install devtoolset-7
scl enable devtoolset-7 bash

Установите драйверы PHP для SQL Server

pecl download sqlsrv
tar xvzf sqlsrv-5.2.0.tgz
cd sqlsrv-5.2.0/
phpize
./configure --with-php-config=/usr/bin/php-config
make
sudo make install

Установите Apache и перезапустите службу

sudo yum install httpd
sudo apachectl restart

--EDIT--

Вы также можете загрузить предварительно созданные двоичные файлы со страницы проекта Github или установить из репозитория Remi:

sudo yum install php-sqlsrv php-pdo_sqlsrv
  1. В моем случае мне также пришлось открыть соединение брандмауэра с сервера базы данных. Вы проверяете, нужно ли это, запускаете sqlcmd из Терминала для подключения к базе данных. Если вы получаете сетевую ошибку с правильными учетными данными, значит, у вас проблема с брандмауэром.

Надеюсь, это поможет любому, кто изо всех сил пытается подключиться к серверу Linux с SQL Server.

person Michele La Ferla    schedule 29.05.2018
comment
Нет необходимости устанавливать из pecl, если вы используете репозиторий remi, пакет php-sqlsrv предоставляет необходимый двоичный файл. - person Remi Collet; 29.05.2018
comment
Я добавлю это как правку в свой ответ. Кстати молодцы для вашей библиотеки! ???? Вы проделали отличную работу! - person Michele La Ferla; 29.05.2018

Вы можете использовать это здесь?

try{
    $db = new PDO("sqlsrv:Server,1433=$server;dbname=$db;charset=utf8","$user","$pass");
    $query=$db->prepare("Some SQL String Here");
    $query->execute();
}catch(PDOException  $e ){
    echo "Error: ".$e;
}
person Frederik L. Frandsen    schedule 26.05.2018