Подключение к MSSQL серверу с помощью PHP: различия между версиями

Материал из Wiki МИАЦ ВО
Перейти к навигации Перейти к поиску
Нет описания правки
Нет описания правки
Строка 1: Строка 1:
И так задача -  подключиться к MSSQL серверу посредством php скрипта.
И так задача -  подключиться к MSSQL серверу посредством php скрипта.
 
==Через freeTDS==
1. Устанавливаем пакеты  
1. Устанавливаем пакеты  
<pre>sudo apt-get install php5-sybase php5-odbc freetds-common</pre>
<pre>sudo apt-get install php5-sybase php5-odbc freetds-common</pre>
Строка 32: Строка 32:
}</pre>
}</pre>
Вот и все.
Вот и все.
==Через ODBC драйвер==
===Устанавливаем пакеты
<pre>
sudo apt update
sudo apt install -y php8.3 php8.3-cli php8.3-dev php8.3-odbc \
                  unixodbc unixodbc-dev freetds-bin freetds-dev \
                  build-essential
</pre>
Проверка
<pre>php -m | grep odbc
odbc
</pre>
==Настройка FreeTDS==
Открой /etc/freetds/freetds.conf:
<pre>[global]
    tds version = 7.4
    client charset = UTF-8
    text size = 2147483647
[MSSQL_TEST]
  host = 172.16.130.20
  port = 1433
  tds version = 8.0
  #client charset = WINDOWS-1251
  client charset = UTF8
  text size = 20971520
</pre>
Проверка
<pre>tsql -S my_mssql -U username -P password</pre>
Если подключается — переходим дальше.
===Настрой unixODBC===
/etc/odbcinst.ini
<pre>
[FreeTDS]
Description=TDS driver (Sybase/MS SQL)
Driver=libtdsodbc.so
Setup=libtdsS.so
CPTimeout=
CPReuse=
UsageCount=1
</pre>
/etc/odbc.ini
<pre>
[MSSQL_TEST]
Description = My MS SQL Server via FreeTDS
Driver      = FreeTDS
Servername  = MSSQL_TEST
Database    = www_new
Port        = 1433
TDS_Version = 8.0
TextSize    = 2147483647
</pre>
Проверка:
<pre>isql -v my_mssql username password</pre>
Должно выдать:
<pre>Connected!
SQL></pre>
==Подготовка==
Перезагрузи FPM
<pre>sudo systemctl restart php8.2-fpm</php>
==Проверка PHP-подключения==
Создай test_mssql.php:
<pre><?php
try {
    $pdo = new PDO("odbc:my_mssql", "username", "password");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "✅ Подключено!\n";
    $stmt = $pdo->query("SELECT TOP 5 name FROM sys.databases");
    foreach ($stmt as $row) {
        echo $row['name'], PHP_EOL;
    }
} catch (PDOException $e) {
    echo "❌ Ошибка: " . $e->getMessage();
}</pre>
Запусти:
<pre>php test_mssql.php</pre>
Если всё в порядке — увидишь список баз данных.
==Замечания и интересные моменты
1. Все текстовые поля не дб nvarchar - Такие поля будут обрезаться драйвером. Нужно обязательно varchar.<br>
2. При работе через этот драйвер не работает- определение последней вставленной строки
<pre>SELECT SCOPE_IDENTITY();</pre>
Вместо этого нужно использовать
<pre>INSERT INTO my_table (name, value)
OUTPUT INSERTED.id
VALUES ('Test', 123);</pre>
3. При очень больших числах (Больше 10 знаков), драйвер из-за русской кодовой страницы выведет
3,234235346346 10х, что будет являться строкой для PHP<br>
Код для исправления
<pre>
$val10 = (float)str_replace(',', '.', $val10);
</pre>

Версия от 14:21, 17 октября 2025

И так задача - подключиться к MSSQL серверу посредством php скрипта.

Через freeTDS

1. Устанавливаем пакеты

sudo apt-get install php5-sybase php5-odbc freetds-common

2. Редактируем файл /etc/freetds/freetds.conf

# A typical Sybase server
[172.16.130.103]
	host = 172.16.130.103  (ip of the MSSQL server)
	port = 1433
	tds version = 8.0
	#client charset = WINDOWS-1251
	client charset = UTF8
	text size = 20971520

# A typical Sybase server
[172.16.130.20]
	host = 172.16.130.20  (ip of the MSSQL server)
	port = 1433
	tds version = 8.0
	#client charset = WINDOWS-1251
	client charset = UTF8
	text size = 20971520

3. А дальше, как обычно

  // подключение к СУБД и открытие базы данных
function db_connect_ms($host, $user, $passwd, $dbname)
{
     setlocale (LC_ALL, 'ru_RU.UTF-8');  
    //print "$host, $user,$passwd, $dbname";
    $link = mssql_connect($host, $user, $passwd) or die('Не могу подключиться к серверу баз данных');
    mssql_select_db($dbname) or die('Не могу открыть базу данных «'.$dbname.'»');
    return $link;
}

Вот и все.

Через ODBC драйвер

===Устанавливаем пакеты

sudo apt update
sudo apt install -y php8.3 php8.3-cli php8.3-dev php8.3-odbc \
                   unixodbc unixodbc-dev freetds-bin freetds-dev \
                   build-essential

Проверка

php -m | grep odbc
odbc

Настройка FreeTDS

Открой /etc/freetds/freetds.conf:

[global]
    tds version = 7.4
    client charset = UTF-8
    text size = 2147483647

[MSSQL_TEST]
  host = 172.16.130.20
  port = 1433
  tds version = 8.0
  #client charset = WINDOWS-1251
  client charset = UTF8
  text size = 20971520

Проверка

tsql -S my_mssql -U username -P password

Если подключается — переходим дальше.

Настрой unixODBC

/etc/odbcinst.ini

[FreeTDS]
Description=TDS driver (Sybase/MS SQL)
Driver=libtdsodbc.so
Setup=libtdsS.so
CPTimeout=
CPReuse=
UsageCount=1

/etc/odbc.ini

[MSSQL_TEST]
Description = My MS SQL Server via FreeTDS
Driver      = FreeTDS
Servername  = MSSQL_TEST
Database    = www_new
Port        = 1433
TDS_Version = 8.0
TextSize    = 2147483647

Проверка:

isql -v my_mssql username password

Должно выдать:

Connected!
SQL>

Подготовка

Перезагрузи FPM

sudo systemctl restart php8.2-fpm</php>
==Проверка PHP-подключения==
Создай test_mssql.php:
<pre><?php
try {
    $pdo = new PDO("odbc:my_mssql", "username", "password");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    echo "✅ Подключено!\n";
    $stmt = $pdo->query("SELECT TOP 5 name FROM sys.databases");

    foreach ($stmt as $row) {
        echo $row['name'], PHP_EOL;
    }
} catch (PDOException $e) {
    echo "❌ Ошибка: " . $e->getMessage();
}

Запусти:

php test_mssql.php

Если всё в порядке — увидишь список баз данных. ==Замечания и интересные моменты 1. Все текстовые поля не дб nvarchar - Такие поля будут обрезаться драйвером. Нужно обязательно varchar.
2. При работе через этот драйвер не работает- определение последней вставленной строки

SELECT SCOPE_IDENTITY();

Вместо этого нужно использовать

INSERT INTO my_table (name, value)
OUTPUT INSERTED.id
VALUES ('Test', 123);

3. При очень больших числах (Больше 10 знаков), драйвер из-за русской кодовой страницы выведет 3,234235346346 10х, что будет являться строкой для PHP
Код для исправления

$val10 = (float)str_replace(',', '.', $val10);