Подключение к MSSQL серверу с помощью PHP: различия между версиями
Misha (обсуждение | вклад) Нет описания правки |
Misha (обсуждение | вклад) Нет описания правки |
||
| Строка 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);