Информационные технологииStfw.Ru 🔍

MySQL - Взаимодействие с БД MySQL

Взаимодействие с базами данных
🕛 01.11.2006, 13:55
Эти функции позволяют работать с серверами БД MySQL.

См. также документацию но адресу: http://www.mysql.com/documentation/.

mysql_connect

Подключение к серверу MySQL

int mysql_connect ([string hostname[:port][:/path/to/socket] [, string username [, string password]]])

Возвращает дескриптор подключения к БД или FALSE - при ошибке. Обычно следующим шагом янляется выбор БД на сервере функцией mysql_selectjJb().

Для неуказанных аргументов используются следующие умолчания: host:port = 'localhost:3306', username = имя пользователя запустившего текущий процесс сервера password = ""; либо значения из файла конфигурации.

Строка hostname может также включать номер порта (в виде "hostname: port") или путь к соксту для локальной машины в системах Unix":/path/to/socket".

При ошибке также выдается предупреждение. Выдачу предуиреждения можно блокировать, указав перед именем функции оператор «@».

Если функция повторно вызывается с теми же аргументами, новое подключение не создается, а возвращается идентификатор имеющегося.

В конце сценария принято закрывать подключение функцией mysql_ close(), но это можно не делать, поскольку РHР автоматически закрывает все (неустойчивые) подключения при завершении сценария.

<?php
Slink = @mysql_connect ("serve"", "user", "passed")
or die ("Невозможно подключиться");
print ("Подключение к MySQL успешно"):
mysql_close ($link); ?>

См. также: mysql_pconnect() и mysql_close().

mysql_pconnect

Создание устойчивого подключения к серверу MySQL

int mysql pconnect ([string hostname[ port][:/path/to/socket] [, string username [, string password]]])

Возвращает дескриптор подключения к БД или FALSE - при ошибке (также выдается предупреждение). Обычно следующим шагом является выбор БД на сервере функцией mysql_select_db().

Для неуказанных аргументов используются следующие умолчания: host:port = 'localhost:3306', username = имя пользователя запустившего текущий процесс сервера password = ""; либо значения из файла конфигурации.

Строка hostname может также включать номер порта (в виде "hostname: port") или путь к соксту для локальной машины в системах Unix ":/path/to/socket".

mysql_pconnect() действует подобно mysql_connect() с двумя отличиями.

Перед подключением функция пытается проверить, имеется ли уже открытое (устойчивое) подключение с параметрами (имя сервера, пользователя и пароль), аналогичными указанным. Если такое подключение обнаруживается, то возвращается его идентификатор вместо создания нового подключения.
При завершении сценария подключение не закрывается, а остается действительным для дальнейшего использования. (Функция mysql_ close() не может закрыть подключения, созданные с помощыо mysql_pconnect()).
mysql_close

Отключение от сервера MySQL

int mysql_close ([int 1ink_identifier]) :

Возвращает TRUE или FALSE - при ошибке.

Идентификатор закрываемого подключения указывается в аргументе; если его не указывать, то закрывается последнее открытое данным сценарием подключение.

Фактически использование данной функции не является обязательным, так как РНР автоматически закрывает все незакрытые неустойчивые подключения при завершении сценария.

Заметьте: устойчивые подключения, созданные функцией mysql_ pconnect(), не закрываются.

См. также: mysql_connect() и mysql pconnect().

tmysql_change_user

Изменение параметров подключения int mysql_change_user (string user, string password [. string database [, int linkjidentifier]])

Если не указываются БД или подключение, то используется последняя активная БД. Если авторизация проходит безуспешно, параметры подключения не изменяются.

Работает с MySQL 3.23.3 и выше.

mysq_l list_dbs

Получение списка БД на сервере MySQL

int mysql_list_dbs ([int link_identifier])

Возвращает набор записей, содержащий список БД на сервере.

Slink = mysql_connect
('localhost'. 'myname'. 'secret').
$db_list = mysqljist_dbs($link)
while ($row = mysql_fetch_object
($db_list)) { echo $row->Database .
"\n": }

В данном примере также может использоваться функция mysql_ fetch_row() или ей подобная.

Заметьте: список можно получить, не имея привилегий, то есть не указывая пароль доступа.

Ранее функция называлась mysq'Mistdbs().

mysql_db_name

Получение имени БД из списка

int mysql_db_name (int result, int row [, mixed field])

В аргументе result указывается дескриптор набора записей, полученный от функции mysql_list_dbs(). В аргументе row указывается номер записи. При ошибке возвращает FALSE. Фактически данная функция является излишней.

<?php error_reportirg(E_ALL);
mysq]_connect('dbhost'. 'username'. 'password').
Sdbjist = mysql Jist_dbs():
for ($1 = 0. $1 < ($cnt= mysql_num_rows($cibjist)),
$1 + 1-)
{ echo mysql_db_name($db_list. $i) .
"\n"; } ?>

Ранее функция называлась mysql_dbname().

mysql_select_db

Выбор БД MySQL

int mysql_select_db (string database_name [, int link_identifier])

Возвращает TRUE или FALSE - при ошибке.

Устанавливает БД с именем database_name, активной для текущего или указанного в link_identifier подключения. Если подключений не имеется, то косвенно вызывается функция mysql_connect() с параметрами по умолчанию.

Последующие запросы, выполняемые функцией, будут адресованы данной БД.

См. также: mysql_connect(), mysqlj>connect() и mysql_query().

Ранее функция называлась mysql_selectdb().

mysql_create_db

Создание БД MySQL

int mysql_create_db (string dbnarae [, int link_identifier])

Создаст БД dbname, используя подключение link_identifier.

<?php /
Slink = mysql_pconnect
("localhost". "me", "paswd"): /
if (mysql_create_db ("my_db"))
{ print ("БД создана \n");
} else {
printf ("Ошибка: Xs\n". mysql_error
()). } ?>

Ранее функция называлась mysql_createdb().

См. также mysql_drop_db().

mysql_drop_db

Удаление БД

int mysql_drop_db (string databasejname [, int link_identifier])

Возвращает TRUE, если БД databasejiame успешно удалена, или FALSE - при ошибке.

См. также mysql_create_db().

Ранее функция называлась mysql_dropdb().

mysql_ list_tables

Получение списка таблиц в БД

int mysql_list_tables (string database [. int linkjidentifier])

Возвращает набор записей, из которого можно извлечь имена таблиц функцией mysql_tablename(). Следующий пример распечатывает имена всех БД и таблиц, в них содержащихся.

<?
Slink = mysql_connect
('127 0.0 Г. 'root1. '157984').
Sdbjist = mysql_list_dbs($link).
while ($r_db = mysql_fetch_object(SdbJisU)
{ echo $r_db->Database . "\n":
// распечатать список таблиц Stbljist =
mysql_lTst_tables(Sr_db->Database):
for($i =0: $i < mysql_num_rows
($tbl_list): Si++) {
echo " - ". mysql_tablename
($tbl_list. $1). "\n": } ?>

Ранее функция называлась mysql_listtables().

mysql_tablename

Получение имени таблицы

string mysql_tablename (int result, int i)

Функция используется для получения имени таблицы (с номером i) из набора записей, возвращенного функцией mysql_list_tables().

<?php
mysql_connect ("localhost:3306"):
Sresult = mysql_list_tables ("mydb"):
$1 = 0; while
(Si < mysql_num_rows
(Sresult)) { $tb_names[$i] =
mysql_tablename (Sresult. Si):
echo Stb_names[Si] . "<BR>";
$l++; } ?>

mysql_query

Выполнение запроса к БД

int mysql_query (string query [, int linkjdentifier])

Посылает запрос текущей БД, активной для текущего подключения или указанного в link_identifier. Если подключений не имеется, то косвенно вызывается функция mysql_connect() с параметрами по умолчанию.

Заметьте: SQL-выражение, указанное в аргументе query, не должно оканчиваться точкой с запятой. Если выражение содержит ошибки

или при его выполнении возникают ошибки (например, если текущие привилегии не позволяют выполнить запрос), то функция возвращает FALSE.

Если запрос успешно выполнился, то возвращается набор записей (не забывайте, он также может содержать 0 записей), который может быть обработан функциями:

mysql_resul t() - получить элемент набора записей;
mysql_fetch_array() - занести запись в массив;
mysql_fetch_row() - занести запись в нумерованный массив;
mysql_fetch_assoc() - занести запись в ассоциативный массив;
mysql_fetch_object() - занести запись в объект.
Чтобы выяснить, сколько записей было возвращено командой SELECT, используйте функцию mysql_num_rows(); а чтобы выяснить, сколько записей было изменено в результате выполнения запросов DELETE, INSERT, REPLACE или UPDATE, используйте функцию mysql_affected_rows().

После обработки результатов запроса он может быть удален функцией mysql_free_result(). Хотя в этом ист необходимости, так как ресурсы автоматически освобождаются при завершении сценария.

См. также: mysql_db_query(), mysql_select_db() и raysql_connect().

mysql_db_query

Выполнение запроса к указанной БД

int mysql_db_query (string database, string query [, int linkjdentifier])

Функция эквивалентна последовательному выполнению функций:

mysql_select_db (string database [. int linkjdentifier]); mysql_query (string query [. int link_identifier]};

См. также: mysql_db_query(), mysql_connect(). Ранее функция называлась mysql().

mysql_num_rows

Получение числа возвращенных записей

int mysql_num_rows (int result)

Функция возвращает число записей, возвращенных командами SELECT. Чтобы выяснить, сколько записей было изменено в результате выполнения запросов DELETE, INSERT, REPLACE или UPDATE, используйте функцию mysql_affected_rows().

<?php
Sconn = mysql_connec
t("hostaddress". "username". "password");
mysql_select_db("database".Sconn):
$rs = mysql_query("SELECT
FROM Accounts".$conn);
$N = mysql num_rows($rs),
echo "Всего записей: $N". ?>

См. также: mysql_db_query(), mysql_query() и mysql_fetch_row().

Ранее функция называлась mysql_numrows().

mysql_affected_rows

Получение числа измененных записей в БД

int mysql_affected_rows ([int link_iidentifier])

Возвращается число записей, измененных в результате выполнения запросов DELETE, INSERT, REPLACE или UPDATE.

Если последним запросом была команда DELETE без ограничения WHERE, то из таблицы будут удалены все записи, но эта функция возвратит 0.

Чтобы выяснить, сколько записей было возвращено командой SELECT, используйте функцию mysql_num_rows().

mysql_insert_id

Получение значения последнего автоинкремента

int mysqi_insert_id ([int link_identifier])

При добавлении записей в таблицу командой INSERT для поля, имеющего свойство AUTO_INCREMENT, значение генерируется автоматически (вне зависимости от того, было ли оно задано) и его можно получить с помощью этой функции. Это значение можно использовать для модификации последней добавленной записи.

Это значение также можно получить с помощью SQL запроса MySQL: "SELECT LASTJNSERTJDO".

Если последним запросом значение AUTO_INCREMENT сгенерировано не было, то функция возвратит 0. Заметьте также, что если тип автоин-крементируемого поля был BIGINT, то он будет преобразован к типу LONG, и результат может быть неверным.

Команда LAST_INSERT_ID() имеет два преимущества: она всегда хранит значение последнего автоинкремента (это значение не сбрасывается в 0 между запросами) и она всегда возвращает правильное значение.

mysql_data_seek

Перемещение курсора набора записей

int mysql_data_seek (int result_identifier, int rowjiumber)

При каждом вызове функции mysql_fetch_row() (или подобной ей) внутренний курсор записи смешается на следующую запись. Данная функция позволяет свободно перемещать курсор в наборе записей result_identifier, так, чтобы он указывал на запись с номером row_ number (нумерация начинается с 0).

Функция возвращает TRUE или FALSE - при ошибке.

<?php
Slink = mysql_pconnect
("сервер", "имя", "пароль")
or die ("Нет коннекта"):
mysql_select_db ("samp_db")
or die ("Базу не выбрать").
Squery = "SLLtCT lastjname. firstjname
FROM friends";
$result = mysql_query i$query)
or die ("Query failed").
# отобразить записи в обратном порядке
for ($i = mysql_num_rows ($re.sult) - 1
: $1 >=0; $1-) { if (!mysql_data_seek
(Sresult. $1)) {
printf ("Cannot seek to row 5!d\n". $1);
continue: )
if(!($row = mysql_fetch_object (SresulL)))
continue.
pnntf ("Is s<BR>\n". $row->labt_name.
$row->first_name): }
mysql free_result (Sresult). ?>

mysql_free_result

Уничтожение набора записей

int mysql_free_result (int result)

Функция освобождает память, занимаемую набором записей result, возвращенным запросом. Ее следует использовать только в том случае, если приходится очень экономить память, так как память автоматически освобождается при завершении сценария.

Ранее функция называлась mysql_freeresult().

Обработка результатов запроса

mysql_result

Получение определенного элемента набора записей

mixed mysql_result (int result, int row [, mixed field])

Возвращает содержимое ячейки из набора записей resul t. В аргументе row указывается номер записи (нумерация начинается с 0), в аргументе field можно указать индекс поля (число), имя поля или полное имя поля (вида: «имя_таблицы.имя_поля») или псевдоним поля (для запросов типа 'SELECT foo AS bar FROM...').

При работе с большими наборами записей быстрее выполняются функции типа _fetch_ (см. ниже). Также заметьте, что численные индексы обрабатываются быстрее строковых.

Не следует вызывать функцию mysql_result() в сочетании с другими функциями обработки набора записей.

Рекомендуется использовать альтернативные функции: mysql_fetch_ row(), mysql_fetch_array() и mysql_fetch_object().

mysql_fetch array

Занесение записи в массив

array mysql_fetch_array (int result [, int result_type])

Возвращает массив, соответствующий текущей записи, из набора записей result, возвращенных запросом, или FALSE, если записей более не имеется.

Данная функция является расширением функции mysql_fetch_row(), и она может возвращать нумерованный или ассоциативный массив (а также объединенный). Вид возвращаемого массива может указываться в аргументе result_type одной из констант: MYSQL NUM, MYSQL_ ASSOC, MYSQL_BOTH (по умолчанию).

В ассоциативных массивах индексами служат имена нолей. Если имеются одноименные поля, используется последнее. Для доступа к одноименным полям также можно использовать числовые индексы (поля нумеруются в той последовательности, в которой указаны в запросе или в таблице) или псевдонимы.

SELECT tl.fl AS tl_fl t2.fi AS t2_fl FROM tl. t2

Заметьте, что функция работает лишь немного медленнее, чем mysql_ fetch_row(), но предоставляет дополнительную функциональность.

<?php
mysql_connect (Shost. $use<\ Spassword).
Sresult = mysql_db_query ("database".
"select user_id. full name from tbl");
while ($row = mysql_fetch_array (Sresult))
{ echo "userjid- ".$row["user_id"].
"<brn". echo "user_id: ".$row[0] "<br>\n";
echo "fullname: ",$row["fullnatne"]."<br>\n";
echo "fullname: ".$row[l]."<br>\n"; }
mysql_free_result (Sresult). ?>

См. также: mysql_fetch_row() и mysql_fetch_assoc().

mysql_fetch_row

Занесение записи в нумерованный массив

array mysql_fetch_row (int result)

Возвращает массив, соответствующий текущей записи, из набора записей result, возвращенных запросом (последующий вызов функции возвращает следующую запись), или FALSE, если записей более не имеется.

Каждое поле записи сохраняется в нумерованном элементе массива (нумерация начинается с 0).

См. также: mysql_fetch_array(), mysql_fetch_object(), mysql_data_seek(), mysql_fetch_lengths() и mysql_result().

mysql_fetch_assoc

Занесение записи в ассоциативный массив

array mysql_fetch_assoc (int result)

Возвращает массив, соответствующий текущей записи, из набора записей result, возвращенных запросом, или FALSE, если записей более не имеется. Вызов функции эквивалентен mysql_fetch_array (result, MYSQL_ASSOC).

В возвращаемом массиве индексами служат имена полей. Если имеются одноименные поля, используется последнее. Для доступа к остальным одноименным полям можно использовать псевдонимы или функцию raysql_fetch_array().

Заметьте, что функция работает лишь немного медленнее, чем mysql_ fetch_row(), но предоставляет дополнительную функциональность.

<?php
mysql_connect ($host. $user. Spassword):
$result = mysql_db_query
("database"."select * from table").
while ($row = mysql_fetch_assoc
(Sresult)) { echo $row["user_id"];
echo $ro\4' fullname"] }
mysql_free_result (Sresult); ?>

CM. также: mysql_fetch_row() и mysql_fetch_array().

mysql_fetch_object

Получение записи в свойствах объекта object mysql_fetch_object (int result)

Возвращает объект, в свойствах которого находятся поля текущей записи, или FALSE, если записей более не имеется.

По скорости выполнения функция идентична mysql_fetch_array() и почти идентична mysql_fetch_row().

<?php
mysql_connect ($host. $user. $password).
Sresult = mysql_db_query
("database", "select * from table"):
while ($row = mysql_fetch_object
(Sresult)) {
echo $row->user_id.
echo $row->fullname: }
mysql_free_result (Sresult): ?>

См. также: mysql_fetch_array() и mysql_fetch_row().

ImysqI_fetch_lengths

Получение длины элементов записи array mysql_fetch_lengths (int result) После того как запись была обработана одной из функций: mysql_ fetch_row(), mysql_fetch_array() или mysql_fetch_object(), с помощью данной функции можно узнать размер полученного значения в каждом обработанном поле.

Например, в следующем фрагменте:

Srs_arr = mysql_fetch_row($rs):
S'-sJen - mysql_fetch_lengths($rs).

массив $rs_len будет содержать длину соответствующих элементов массива $rs_arr, то есть $rsjen[0] = strlen($rs_arr[0]) и т. д.

См. также mysql_fetch_row().

mysql_fetch_field

Получение информации о поле записи в свойствах объекта

object mysql_fetch_field (Int result [, int field_offset])

Если номер поля field_offset не указан, при каждом вызове функции возвращаются свойства следующего поля из набора записей result.

Возвращаемый объект имеет следующие свойства (и содержит информацию):

name - имя поля;
table - имя таблицы, которой принадлежит поле;
raax_length - максимальная длина поля;
not_null - 1, если полю разрешено пустое значение;
primary_key - 1, если поле является ключевым (primary key);
unique_key - , если в ноле допускаются только уникальные значения (unique key);
multiple_key - 1, если в поле допустимо иметь повторяющиеся значения;
numeric - 1, если поле числовое;
blob - 1, если поле имеет тип BLOB;
type - чип поля;
unsigned - 1, если поле числовое беззнаковое;
zerofill - 1, если поле заполняется нулями (zero-filled).
<?php /
mysql_connect (Shost. $user. Spassword)
or die ("Could not connect"):
\ $result = mysql_db_query
("database", "select * from table")
or die ("Query failed"): \ \
for($i =0: $1 < mysqljium_fields
(Sresult): $i++)
{ echo "Метаданные поля $i:<BR>\n":
$meta = mysql_fetch_field
(Sresult): if (!$meta) { echo
"No information available<BR>\n";
echo "<PRE> name $meta->
name table- $meta->table
type: $meta->type
roax_length: $meta->
max_length notjiull
$meta->not_pull
zerofill. $meta->zerof ill
umque_key. $meta->umque_key
pnmary_key: $meta->prTinary_key
|4ultiple_key $meta->multiple_key
numeric $meta->numeric
unsigned $meta->unsigned
blob $meta->blob </PRE>". }
mysql_free_result (Sresult): ?>

См. также mysql_field_seek().

mysql_field_seek

Перемещение к указанному полю

int mysql_field_seek (int result, int field_offset)

Функция является излишней, и следующие фрагменты эквивалентны:

$meta = mysql_fetch_field
(Sresult. field_offset): и mysql_fTeld_seek
(Sresult. field_offset)
imeta - mysql_fetch_field ($result).

Эта функция влияет только на mysql_fetch_field(), а остальные функции этого рода (см. ниже) требуют явного указания номера поля.

См. также mysql_fetch_field().

mysql_field_name

Получение имени поля в наборе записей

string mysql_field_name (int result, int fie!d_index)

Функция возвращает имя поля с индексом field_offset (нумерация начинается с 0) в наборе записей result.

$res = !nysql_db_query
( "users", "SELECT user_id. user-name
FROM users"):
echo mysql_field_name($res. !)
// выведет username

Ранее функция называлась mysql_fieldname().

mysql_field_table

Получение имени таблицы, которой принадлежит поле из набора записей string mysql_field_table (int result, int field_offset) Ранее функция называлась mysqljfieldtable().

mysql_field_len

Получение размера поля набора записей

int mysql_field_len (int result, int field_offset)

Ранее функция называлась mysql_fieldlen().

mysql_field_type

Получение типа поля набора записей

string mysql _field_type (int result, int field_offset) Возвращаемая строка содержит название типа ноля: «int», «real», «string», «blob» или другого, описанного в документации по MySQL.

<?php
mysql_ccnnect (" local host.3306").
mysql_select_db ("mydbl"):
$result = mysql_query ("SELECT * FROM tbll");
Sfields = mysql_num_fields (Sresult):
Srows mysql nurn_rows ($result);
Si = 0;
Stable = mysql_field_table
(Sresult. $1).
echo "Таблица 'Stable' имеет
Sfields полей и Srows записей<ВК>":
echo "Структура таблицы: <BR>":
while ($1 < Sfields) {
Stype = mysql_field_type
(Sresult. Si):
$name = mysql_field_name
(Sresult. Si):
Slen = mysql_field_len
(Sresult. Si):
Sflags - mysql_field_flags
(Sresult. Si):
echo Stype." ".$name." ".Slen."
".Sflags."
<BR>": Si++: mysql_close(): ?>

Ранее функция называлась mysql_fieldtype().

mysql_field_flags

Получение флагов поля записи

string mysql_field_flags (int result, int field_offset)

Поля записей в MySQL могут иметь следующие свойства-флаги: "notjiull", "pr1mary_key", "unique_key", "multiple_key", "blob", "unsigned", "zerofill", "binary", "enum", "auto_increment", "timestamp".

Функция возвращает перечисление через пробел флагов, имеющихся у поля с индексом field_offset (нумерация начинается с 0) в наборе записей result (разделить полученную строку на составляющие можно функцией exptode()).

Ранее функция называлась mysql_fieldflags().

mysql_list_fields

Получение списка полей таблицы

int mysql_list_fields (string database_name, string table_name [, int linkjidentifier])

Функция возвращает пустой набор записей таблицы table_name из БД database_name, который можно использовать для получения информации о всех полях, имеющихся в таблице, с помощью функций

mysql_fetch_field(), mysql_field_flags(), mysql_fieldjen(), mysql_field_ name() и mysql_field_type().

Заметьте: при ошибке возвращается -1, а в переменной Sphperrmsg сохраняется сообщение об ошибке и (если функция не была вызвана с оператором @) распечатывается сообщение об ошибке.

$link = mysql_cornect
('localhost'. 'myname'. 'secret');
Sfields = mysql_list_fields
("databasel", "tablel", $link):
Scolumns = mysql_num_fields($fields);
// число полей в таблице
// распечатать имена всех полей
таблицы for ($1 = 0: $1 < Scolumns; $i++)
{
echo mysql_field_name
($fields. $1) . "\n".; }

Ранее функция называлась mysql_listfields().

mysql_num_fields

Получение числа полей в наборе записей

int mysq"ljium_fields (int result)

См. также: mysql_db_query(), mysql_query(), mysql_fetch_field(), mysql_ num_rows().

Ранее функция называлась mysqljiumfields().

mysql_errno

Получение кода ошибки MySQL

int mysql_errno ([int link_identifier])

Возвращает номер ошибки, произошедшей в ходе выполнения последней функции MySQL, или 0, если ошибки не произошло.

Ранее ошибки, происходящие при операциях с MySQL, выдавались в виде предупреждений, но сейчас возникновение ошибок нужно выявлять самостоятельно.

Предупреждения выводятся только при неудачных подключениях или при попытке использования несуществующего ресурса (например, набора записей).

<?php
mysql_connect();
mysql_select_db("non_exi stent_db"):
echo mysql_errno().":
".mysql_error()."<BR>"
mysql_query("SELECT *
FROM non_existent_table"):
echo mysql_errno() ";
".mysql_error().
"<BR>"; ?>

См. также mysql_error().

mysql_error

Получение сообщения об ошибке MySQL

string mysql_error ([int link_identifier])

Возвращает сообщение об ошибке, произошедшей в ходе выполнения последней функции MySQL, или пустую строку, если ошибки не произошло.

<?php
mysql_ccnnect().
mysql_select_db("non_existent_db");
echo mysql_errno().":
" mysql_error() "<BR>".
$conn = mysql_query("SELECT *
FROM non_exibtent_table");
echo mysql_errno() ": ",mysql_error()
"<BR>"; ?>

См. также mysql_errno().

Учебник по основам PHP   Теги:

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉