ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ

Для установки соСдинСний ΡΠΎΠ·Π΄Π°ΡŽΡ‚ экзСмпляры Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса β€” PDO. НСваТно, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°ΠΊΠΎΠΉ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ взаимодСйствуСт с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…; ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ класса PDO, нСзависимо ΠΎΡ‚ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ класса ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ опрСдСлят источник Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… (Π°Π½Π³Π». Data Source Name, DSN) ΠΈ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ, Ссли ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Π‘Π” MySQL

<?php

$dbh
= new PDO('mysql:host=localhost;dbname=test', $user, $pass);

?>

ΠœΠΎΠ΄ΡƒΠ»ΡŒ выбросит ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ PDOException, Ссли ΠΏΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ ошибки. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚, ΠΈΠ»ΠΈ ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ установили Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ set_exception_handler().

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #2 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

<?php

try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
} catch (
PDOException $e) {
// НапримСр, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ врСмя ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ соСдинСния
}

?>
Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅

Как ΠΈ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ PDOException ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ явно β€” Ρ‡Π΅Ρ€Π΅Π· Π±Π»ΠΎΠΊ catch ΠΈΠ»ΠΈ нСявно β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ set_exception_handler(). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ΠΏΠΎΠΉΠΌΠ°Π½Π½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ прСобразуСтся Π² Ρ„Π°Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ уровня E_FATAL_ERROR. Π€Π°Ρ‚Π°Π»ΡŒΠ½Π°Ρ ошибка Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΠΈΠ·-Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ появляСтся риск ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ соСдинСнии. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π° сСрвСрС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² производствСнной срСдС, Π² Ρ„Π°ΠΉΠ»Π΅ php.ini для ΠΎΠΏΡ†ΠΈΠΈ display_errors ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0.

ПослС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… экзСмпляр класса PDO возвращаСтся Π² скрипт. Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ остаётся Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΆΠΈΠ·Π½ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° PDO. ΠŸΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ΡΡ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ соСдинСниС. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°ΡŽΡ‚ ΠΏΡƒΡ‚Ρ‘ΠΌ удалСния ссылок Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‡Π΅Ρ€Π΅Π· присваиваниС значСния null ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. PHP автоматичСски Π·Π°ΠΊΡ€ΠΎΠ΅Ρ‚ соСдинСниС ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ скрипта, Ссли Π½Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ этого явно.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π”Ρ€ΡƒΠ³ΠΈΠ΅ ссылки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° экзСмпляр PDO, Ρ‚Π°ΠΊΠΆΠ΅ потрСбуСтся ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ. Π’Π°ΠΊΠΈΠ΅ ссылки ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π² экзСмплярС PDOStatement ΠΈΠ»ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° Ρ‚ΠΎΡ‚ ΠΆΠ΅ экзСмпляр PDO. Бсылки ΡƒΠ΄Π°Π»ΡΡŽΡ‚ ΠΏΡƒΡ‚Ρ‘ΠΌ присваивания значСния null ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, которая ссылаСтся Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ PDOStatement.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #3 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ закрытия соСдинСния

<?php

$dbh
= new PDO('mysql:host=localhost;dbname=test', $user, $pass);

// Π‘ этого мСста ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ соСдинСниСм...
$sth = $dbh->query('SELECT * FROM foo');

// ...Π° здСсь соСдинСниС большС Π½Π΅ трСбуСтся; Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π΅Π³ΠΎ
$sth = null;
$dbh = null;

?>

Установка постоянных соСдинСний с сСрвСрами Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… часто приносит ΠΏΠΎΠ»ΡŒΠ·Ρƒ прилоТСниям. ΠŸΠΎΡΡ‚ΠΎΡΠ½Π½Ρ‹Π΅ соСдинСния Π½Π΅ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ скрипта, ΠΊΠ΅ΡˆΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ скрипт Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ соСдинСниС с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Π‘ постоянными соСдинСниями Π½Π΅ трСбуСтся ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±ΠΌΠ΅Π½Π΅ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ с Π±Π°Π·ΠΎΠΉ, Ρ‡Ρ‚ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #4 ΠŸΠΎΡΡ‚ΠΎΡΠ½Π½Ρ‹Π΅ соСдинСния

<?php

$dbh
= new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));

?>

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° PDO::ATTR_PERSISTENT прСобразовываСтся Π² логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (bool): Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ постоянныС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ это Π½Π΅ числовая строка (string), которая Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΠΏΡƒΠ»ΠΎΠ² постоянных ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Π­Ρ‚ΠΎ приносит ΠΏΠΎΠ»ΡŒΠ·Ρƒ, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·Π½Ρ‹Π΅ соСдинСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ нСсовмСстимыС настройки, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ€Π°Π·Π½Ρ‹Π΅ значСния Ρ€Π΅ΠΆΠΈΠΌΠ° Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ PDO::MYSQL_ATTR_USE_BUFFERED_QUERY.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:

ΠŸΠΎΡΡ‚ΠΎΡΠ½Π½Ρ‹Π΅ соСдинСния Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ ΠΏΡƒΡ‚Ρ‘ΠΌ добавлСния константы PDO::ATTR_PERSISTENT Π² массив ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ конструктору класса PDO. Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ постоянныС соСдинСния, Ссли ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ этот Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ PDO::setAttribute() послС создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅

ΠœΠΎΠ΄ΡƒΠ»ΡŒ PDO Π½Π΅ выполняСт очистку постоянных ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Π’Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ измСнСния состояния ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ использования ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, вызывая Π½Π΅ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния смотритС Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠŸΠΎΡΡ‚ΠΎΡΠ½Π½Ρ‹Π΅ соСдинСния с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:

ΠŸΡ€ΠΈ взаимодСйствии с ODBC-Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠΌ модуля PDO ΠΈ Ссли ODBC-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ объСдинСниС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² ΠΏΡƒΠ» ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ ODBC, ΠΊΠ°ΠΊ это Π΄Π΅Π»Π°ΡŽΡ‚ unixODBC ΠΈ Windows, ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ систСмы, Ρ‚ΠΎ вмСсто постоянных PDO-соСдинСний Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽΡ‚ ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ соСдинСний Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ODBC-ΠΏΡƒΠ»Π°. ΠŸΡƒΠ» соСдинСний Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° ODBC раздСляСт соСдинСния с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ модулями Π² процСссС; Ссли PDO-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ попросят ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ соСдинСниС, Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ соСдинСниС Π½Π΅ вСрнётся Π² ΠΏΡƒΠ» соСдинСний Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° ODBC, ΠΈΠ·-Π·Π° Ρ‡Π΅Π³ΠΎ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ создаст Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ для обслуТивания Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.

οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π΅Ρ‰Ρ‘ Π½Π΅ добавляли примСчания для страницы