Подтвердить что ты не робот

Подключить PHP к MSSQL через PDO ODBC

Когда я выполняю этот код:

print_r(PDO::getAvailableDrivers()); 

В нем говорится, что у меня есть драйвер odbc.

Array ( [0] => mysql [1] => odbc [2] => sqlite )

Однако, когда я пытаюсь использовать его так:

$handle = new PDO("odbc:Server=dbServerIpAddress,myportnumber;Database=mydatabase", "myusername", 'mypassword');

Он ничего не делает - никаких ошибок и не работает вообще. Он даже не выполнит эту строку!

Как я могу подключить PHP к этой базе данных MSSQL через PDO и ODBC?

4b9b3361

Ответ 1

Существует несколько конфигурационных файлов, которые необходимо настроить. /etc/odbc.ini, /etc/odbcinst.ini и /etc/freetds/freetds.conf (эти местоположения действительны для Ubuntu 12.04 и, вероятно, исправлены для большинства * nixes).

Вам нужно установить unixodbc и freetds (не уверен, что имена пакетов находятся в CentOS). В Ubuntu это будет apt-get install unixodbc tdsodbc.

Для помощи в установке этих вопросов, посмотрите на этот вопрос Невозможно установить FreeTDS через диспетчер пакетов Yum

/etc/odbc.ini(этот файл может быть пустым)

# Define a connection to a Microsoft SQL server
# The Description can be whatever we want it to be.
# The Driver value must match what we have defined in /etc/odbcinst.ini
# The Database name must be the name of the database this connection will connect to.
# The ServerName is the name we defined in /etc/freetds/freetds.conf
# The TDS_Version should match what we defined in /etc/freetds/freetds.conf
[mssql]
Description             = MSSQL Server
Driver                  = freetds
Database                = XXXXXX
ServerName              = MSSQL
TDS_Version             = 7.1

/etc/odbcinst.ini

# Define where to find the driver for the Free TDS connections.
# Make sure you use the right driver (32-bit or 64-bit).
[freetds]
Description = MS SQL database access with Free TDS
Driver      = /usr/lib/i386-linux-gnu/odbc/libtdsodbc.so
#Driver      = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup       = /usr/lib/i386-linux-gnu/odbc/libtdsS.so
UsageCount  = 1

/etc/freetds/freetds.conf(или вы можете найти его на /etc/freetds.conf)

# The basics for defining a DSN (Data Source Name)
# [data_source_name]
#       host = <hostname or IP address>
#       port = <port number to connect to - probably 1433>
#       tds version = <TDS version to use - probably 8.0>

# Define a connection to the Microsoft SQL Server
[mssql]
    host = XXXXXX
    port = 1433
    tds version = 7.1

Возможно, вам придется изменить строку tds version = 7.1 выше в зависимости от вашей версии MSSQL.

Вам придется перезапустить apache после внесения этих изменений.

В вашем PHP-коде вы создадите свой объект PDO следующим образом:

$pdo = new PDO("dblib:host=mssql;dbname=$dbname", "$dbuser","$dbpwd");

Обратите внимание, что ваше имя пользователя может быть в формате: domain\username.

Кроме того, вы будете знать, что это сработало, если вы выполняете phpinfo() на своей странице и выполняете поиск "freetds", в котором будет показан раздел mssql с freetds, перечисленными как версия библиотеки.

Ответ 2

Принятый ответ корректен до фактического вызова PHP. Как кто-то правильно прокомментировал это, нужно вызвать драйвер odbc. Во-вторых, он не использует имя источника данных (DSN), которое было настроено в odbc.ini, но фактически создает специальный DSN. Вместо этого:

$pdo = new PDO("odbc:mssql", "$dbuser","$dbpwd");

где mssql относится к объекту DSN в файле odbc.ini

Вы можете создать ad-hoc DSN следующим образом:

$pd = new PDO('odbc:DRIVER=FreeTDS;SERVERNAME=mssql;DATABASE=' . $dbName,
              $dbuser, $dbpass);

где mssql теперь ссылается на объект сервера в freetds.conf и FreeTDS объект драйвера в odbcinst.ini

(это действительно должен быть комментарий, но у меня нет точек rep).