За последние 24 часа нас посетили 17879 программистов и 1719 роботов. Сейчас ищут 895 программистов ...

Тупик - вывод нескольких значений из ассоциативного массива

Тема в разделе "PHP для новичков", создана пользователем Alexnewaro, 13 фев 2015.

  1. Alexnewaro

    Alexnewaro Активный пользователь

    С нами с:
    8 фев 2015
    Сообщения:
    109
    Симпатии:
    1
    Приветствую!

    Навертел от души прекрасно работающую конструкцию - получение данных из чекбоксовой формы, формирование запроса в базу, параллельная отправка менеджеру письма с данными, что вводил и отмечал пользователь.
    Доволен был как слон, пока не отметил больше одного чекбокса каждого типа. И вот тут грянул вселенский пук - вывод результатов отлично работает, а вот в письме вместо всех отмеченных юзеров значений одного типа - пусто.
    То бишь выбирает он два чекбокса type - в письме напротив графы "тип" - пусто. По одному - все отлично. Но нужно ровно столько прислать в письме, сколько отмечено юзером.
    Вот и не могу никак объединить значения и через запятую их в письме написать.

    Прошу помощи!

    Код (PHP):
    1. if(isset($_REQUEST['submit']))
    2. { $connect = connectDB();
    3.  
    4. if( count($_GET['type']) > 0 )
    5. {$type = implode(',',$_GET['type']);
    6. $str.= ' AND type IN('.$type.')';}
    7.  
    8. if( count($_GET['place']) > 0 )
    9. {$place = implode(',',$_GET['place']);
    10. $str.= ' AND place IN('.$place.')';}
    11.  
    12. if( count($_GET['rating']) > 0 )
    13. {$rating = implode(',',$_GET['rating']);
    14. $str.= ' AND rating IN('.$rating.')';}
    15.  
    16. if( $_GET['clientname'] != null )
    17. {$cname = $_GET['clientname'];}
    18.  
    19. if( $_GET['clientemail'] != null )
    20. {$cmail = $_GET['clientemail'];}
    21.  
    22. if( $_GET['clienttelephone'] != null )
    23. {$ctel = $_GET['clienttelephone'];}
    24.  
    25. $typ['25,26'] = 'ОТЕЛЬ';
    26. $typ[28] = 'САНАТОРИЙ';
    27. $typ[27] = 'ПАНСИОНАТ';
    28.  
    29. $ratt[15] = '1*';
    30. $ratt[17] = '2*';
    31. $ratt[19] = '3*';
    32. $ratt[21] = '4*';
    33. $ratt[23] = '5*';
    34.  
    35. $pla[5] = 'ЦЕНТР';
    36. $pla[6] = 'ХОСТА';
    37. $pla[7] = 'АДЛЕР';
    38. $pla[42] = 'ИМЕРЕТИНКА';
    39. $pla[8] = 'КРАСНАЯ ПОЛЯНА';
    40. $pla[9] = 'ЛАЗАРЕВСКОЕ';
    41. $pla[10] = 'ДАГОМЫС';
    42.   
    43. if($_GET and $_GET['clientemail'] != null){
    44.         if(filter_var($_GET['clientemail'], FILTER_VALIDATE_EMAIL)){
    45. require_once($_SERVER['DOCUMENT_ROOT'].'/test/lib/MailClass.inc');
    46. $mailer = new FreakMailer();
    47. $mailer->Subject = 'Клиент просит связаться по поводу размещения';
    48. $mailer->Body =
    49. 'Имя клиента: '.$cname.'
    50. email: '.$cmail.'
    51. телефон: '.$ctel.'
    52. Параметры его поиска:
    53. Тип: '.$typ[$rating].'
    54. Класс: '.$ratt[$rating].'
    55. Расположение: '.$pla[$place].'';
    56. $mailer->AddAddress('мыло@gmail.com', 'alex');
    57. if(!$mailer->Send())
    58. {
    59. }
    60. else
    61. {
    62.  echo '<div style="display: none;">
    63.     <div class="box-modal" id="exampleModal">
    64.         <div class="box-modal_close arcticmodal-close">закрыть</div>
    65.         СПАСИБО ЗА ВАШУ ЗАЯВКУ, МЫ ОБЯЗАТЕЛЬНО СВЯЖЕМСЯ С ВАМИ В БЛИЖАЙШЕЕ ВРЕМЯ
    66.     </div>
    67. </div>';
    68. }
    69. $mailer->ClearAddresses();
    70. $mailer->ClearAttachments();
    71.        }
    72.         else{
    73.                 echo '<div style="display: none;">
    74.     <div class="box-modal" id="exampleModal">
    75.         <div class="box-modal_close arcticmodal-close">ЗАКРЫТЬ</div>
    76.         ВЫ НЕВЕРНО ВВЕЛИ АДРЕС СВОЕЙ ЭЛЕКТРОННОЙ ПОЧТЫ.<br>ВЫ МОЖЕТЕ ПРОДОЛЖИТЬ РАБОТАТЬ С ПОИСКОМ, НО ЕСЛИ ХОТИТЕ, ЧТОБЫ МЫ С ВАМИ СВЯЗАЛИСЬ - ВВЕДИТЕ СВОЙ ЭЛЕКТРОННЫЙ АДРЕС ПРАВИЛЬНО.<br>СПАСИБО!
    77.     </div>
    78. </div>';
    79.         }
    80. } 
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Re: Тупик - вывод нескольких значений из ассоциативного масс

    http://phpfaq.ru/debug
    а где входящие данные, выходящие как пример?
    Способы ввода и вывода?
    Сделай удобный скрипт с данными в array чтобы кто-то смог помочь.
     
  3. Alexnewaro

    Alexnewaro Активный пользователь

    С нами с:
    8 фев 2015
    Сообщения:
    109
    Симпатии:
    1
    Re: Тупик - вывод нескольких значений из ассоциативного масс

    Вот весь код модуля. Ниже его - данные об ошибках, что он вываливает.

    Код (Text):
    1. <?
    2. if( ! defined( 'DATALIFEENGINE' ) ) {
    3.     die( "Hacking attempt!" ); }
    4. $tpl->load_template( 'hotels.tpl' );
    5. ini_set('display_errors',1);
    6. error_reporting(E_ALL);
    7. function connectDB (){
    8. define('DB_HOST', '');
    9. define('DB_USER', '');
    10. define('DB_PASS', '');
    11. define('DB_NAME', '');
    12.  
    13. $dbconn = mysql_connect(DB_HOST, DB_USER, DB_PASS)
    14. or die("Ошибка соединения с базой данных! " . mysql_error());
    15. mysql_select_db(DB_NAME);
    16. mysql_query('SET NAMES utf8');
    17. return $dbconn;
    18. }
    19.  
    20. $site['from_name'] = 'Технический отдел'; // from (от) имя
    21. $site['from_email'] = 'it@mail';
    22. $site['smtp_mode'] = 'disabled';
    23. $site['smtp_host'] = null;
    24. $site['smtp_port'] = null;
    25. $site['smtp_username'] = null;
    26.  
    27. if(isset($_REQUEST['submit']))
    28. { $connect = connectDB();
    29.  
    30. if( count($_GET['type']) > 0 )
    31. {$type = implode(',',$_GET['type']);
    32. $str.= ' AND type IN('.$type.')';}
    33.  
    34. if( count($_GET['place']) > 0 )
    35. {$place = implode(',',$_GET['place']);
    36. $str.= ' AND place IN('.$place.')';}
    37.  
    38. if( count($_GET['rating']) > 0 )
    39. {$rating = implode(',',$_GET['rating']);
    40. $str.= ' AND rating IN('.$rating.')';}
    41.  
    42. if( $_GET['clientname'] != null )
    43. {$cname = $_GET['clientname'];}
    44.  
    45. if( $_GET['clientemail'] != null )
    46. {$cmail = $_GET['clientemail'];}
    47.  
    48. if( $_GET['clienttelephone'] != null )
    49. {$ctel = $_GET['clienttelephone'];}
    50.  
    51. $typ['25,26'] = 'ОТЕЛЬ';
    52. $typ[28] = 'САНАТОРИЙ';
    53. $typ[27] = 'ПАНСИОНАТ';
    54.  
    55. $rat[15] = '<img src="/templates/img/s1.png" border="0">';
    56. $rat[17] = '<img src="/templates/img/s2.png" border="0">';
    57. $rat[19] = '<img src="/templates/img/s3.png" border="0">';
    58. $rat[21] = '<img src="/templates/img/s4.png" border="0">';
    59. $rat[23] = '<img src="/templates/img/s5.png" border="0">';
    60.  
    61. $ratt[15] = '1*';
    62. $ratt[17] = '2*';
    63. $ratt[19] = '3*';
    64. $ratt[21] = '4*';
    65. $ratt[23] = '5*';
    66.  
    67. $pla[5] = 'ЦЕНТР';
    68. $pla[6] = 'ХОСТА';
    69. $pla[7] = 'АДЛЕР';
    70. $pla[42] = 'ИМЕРЕТИНКА';
    71. $pla[8] = 'КРАСНАЯ ПОЛЯНА';
    72. $pla[9] = 'ЛАЗАРЕВСКОЕ';
    73. $pla[10] = 'ДАГОМЫС';
    74.  
    75. if($_GET and $_GET['clientemail'] != null){
    76.         if(filter_var($_GET['clientemail'], FILTER_VALIDATE_EMAIL)){
    77. require_once($_SERVER['DOCUMENT_ROOT'].'/test/lib/MailClass.inc');
    78. $mailer = new FreakMailer();
    79. $mailer->Subject = 'Клиент просит связаться по поводу размещения';
    80. $mailer->Body =
    81. 'Имя клиента: '.$cname.'
    82. email: '.$cmail.'
    83. телефон: '.$ctel.'
    84. Параметры его поиска:
    85. Тип: '.$typ[$rating].'
    86. Класс: '.$ratt[$rating].'
    87. Расположение: '.$pla[$place].'';
    88. $mailer->AddAddress('@gmail', '');
    89. if(!$mailer->Send())
    90. {
    91.   //echo 'Не могу отослать письмо!';
    92. }
    93. else
    94. {
    95.  echo '<div style="display: none;">
    96.     <div class="box-modal" id="exampleModal">
    97.         <div class="box-modal_close arcticmodal-close">закрыть</div>
    98.         СПАСИБО ЗА ВАШУ ЗАЯВКУ, МЫ ОБЯЗАТЕЛЬНО СВЯЖЕМСЯ С ВАМИ В БЛИЖАЙШЕЕ ВРЕМЯ!
    99.     </div>
    100. </div>';
    101. }
    102. $mailer->ClearAddresses();
    103. $mailer->ClearAttachments();
    104.        }
    105.         else{
    106.                 echo '<div style="display: none;">
    107.     <div class="box-modal" id="exampleModal">
    108.         <div class="box-modal_close arcticmodal-close">ЗАКРЫТЬ</div>
    109.         ВЫ НЕВЕРНО ВВЕЛИ АДРЕС СВОЕЙ ЭЛЕКТРОННОЙ ПОЧТЫ.<br>ВЫ МОЖЕТЕ ПРОДОЛЖИТЬ РАБОТАТЬ С ПОИСКОМ ПО ОТЕЛЯМ, НО ЕСЛИ ХОТИТЕ, ЧТОБЫ МЫ С ВАМИ СВЯЗАЛИСЬ - ВВЕДИТЕ СВОЙ ЭЛЕКТРОННЫЙ АДРЕС ПРАВИЛЬНО.<br>СПАСИБО!
    110.     </div>
    111. </div>';
    112.         }
    113. }
    114.  
    115. function resSQL($s){
    116. $r=mysql_query($s);
    117. if ($row=mysql_fetch_row($r))
    118.  return $row[0];
    119. else
    120.  return false; }
    121.  
    122. $mpp=9;
    123.  
    124. if (empty($_GET['page']) || ($_GET['page'] <= 0)) {
    125. $page = 1; } else { $page = (int) $_GET['page']; }
    126.  
    127. $q=mysql_query('select SQL_CALC_FOUND_ROWS `name`, `rating`, `key`, `address`, `desc`, `src` FROM `sled_hotels` WHERE town=4 '.$str.' limit '.(($page-1)*$mpp).','.$mpp);
    128. $fr=resSQL('SELECT FOUND_ROWS()');
    129. $num = '<div class="hotelsearchresults">По вашему запросу найдено объектов для размещения:&nbsp;'.$fr.' </div>';
    130.  
    131. if( $type > 0 )
    132. {$typelink = '&type[]='.$type;
    133. } else {$typelink = null;}
    134. if( $rating > 0 )
    135. {$ratinglink = '&rating[]='.$rating;
    136. } else {$ratinglink = null;}
    137. if( $place > 0 )
    138. {$placelink = '&place[]='.$place;
    139. } else {$placelink = null;}
    140.  
    141. $pc=ceil($fr/$mpp);
    142. $pagi = 'страниц:&nbsp;';
    143. if ($pc>1)
    144. {
    145.     $raz='';
    146.     for($n=1;$n<=$pc;$n++)
    147.     {
    148.         $pagi .= $raz;
    149.         if ($page==$n)
    150.             $pagi .= $n;
    151.         else
    152.         {
    153.             $pagi .= '<A HREF="/test/?do=hotels';
    154.             if ($n>0)
    155.                 $pagi .= '&page='.$n.$typelink.$ratinglink.$placelink.'&submit=ПОКАЗАТЬ+ВЫБРАННОЕ';
    156.             $pagi .= '">'.$n.'</A>';
    157.         }
    158.         $raz='<span style="color:#999;"> | </span>';
    159.     }$pagi .= '</div>';
    160. }
    161. echo '</div>';
    162.  
    163. if ($_GET['submit'] = 'ПОКАЗАТЬ+ВЫБРАННОЕ')
    164.  
    165. {$demo = '<div class="allresult">';
    166. while( $r=mysql_fetch_assoc($q))
    167. {
    168. $demo .= '<div class="eachresult">
    169.         <div class="hotelnamewhiteline">
    170.           <div class="hotelrating">'.$rat[$r['rating']].'</div>
    171.           <div class="hotelname"><a href="/'.$r['key'].'.html" target="_parent">&nbsp;&nbsp;"'.$r['name'].'"&nbsp;&nbsp;</a></div>
    172.         </div>
    173.           <div class="hoteladdress">'.$r['address'].'</div>
    174.           <div class="hoteldescription"><a href="/'.$r['key'].'.html" target="_parent">'.$r['desc'].'</a></div>
    175.           <div class="hotelphoto"><a href="/'.$r['key'].'.html" target="_parent"><img src="http://www.sgtours.ru'.$r['src'].'" border="0" width="160" height="120" style="border: 7px solid rgb(255, 255, 255); box-shadow: 0px 1px 4px rgba(0, 0, 0, 0.3); border-radius: 7px; margin: 0px 10px 0px 0px;"></a></div>
    176.       </div>';
    177. }
    178. echo '</div>';
    179. }else{$demo .= null;}
    180.  
    181. }
    182.  
    183. else
    184.  
    185. {}
    186.  
    187. $tpl->set( '{demo}', $demo );
    188. $tpl->set( '{num}', $num );
    189. $tpl->set( '{pagi}', $pagi );
    190. $tpl->compile( 'content' );
    191. $tpl->clear();
    192.  
    193. ?>
    Ошибки до выполнения скрипта.
    Код (Text):
    1. Notice: Undefined variable: demo in /home/site/www/test/engine/modules/hotels.php on line 204
    2. Notice: Undefined variable: num in /home/site/www/test/engine/modules/hotels.php on line 205
    3. Notice: Undefined variable: pagi in /home/site/www/test/engine/modules/hotels.php on line 206
    Ошибки после выполнения скрипта
    Код (Text):
    1. Notice: Undefined variable: str in /home/site/www/test/engine/modules/hotels.php on line 35
    2. Notice: Undefined variable: cname in /home/site/www/www/test/engine/modules/hotels.php on line 88
    3. Notice: Undefined variable: ctel in /home/site/www/test/engine/modules/hotels.php on line 90
    4. Notice: Undefined index: 21 in /home/site/www/test/engine/modules/hotels.php on line 92
    строка 92:
    Тип: '.$typ[$rating].'

    Добавлено спустя 4 минуты 40 секунд:
    Re: Тупик - вывод нескольких значений из ассоциативного массива
    Последняя ошибка - не ошибка.
    Пока искал косяк - случайно попутал и вместо type написал rating
     
  4. Alexnewaro

    Alexnewaro Активный пользователь

    С нами с:
    8 фев 2015
    Сообщения:
    109
    Симпатии:
    1
    Re: Тупик - вывод нескольких значений из ассоциативного масс

    Апаю тему, прошу помощи или подскажите, какие еще нужно данные дать...
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: Тупик - вывод нескольких значений из ассоциативного масс

    хз. я два раза читал так и не понял что не пашет
     
  6. Alexnewaro

    Alexnewaro Активный пользователь

    С нами с:
    8 фев 2015
    Сообщения:
    109
    Симпатии:
    1
    Re: Тупик - вывод нескольких значений из ассоциативного масс

    Есть форма такого вида:
    Код (Text):
    1. <form name="form" id="form" method="GET" action="/test/?do=hotels" >
    2.     <input type="hidden" name="do" value="hotels" />
    3.     <div class="search4hoteltype">
    4.         <input type="checkbox" name="type[]" value="25,26">&nbsp;&nbsp;Отель<br>
    5.         <input type="checkbox" name="type[]" value="28">&nbsp;&nbsp;Санаторий<br>
    6.         <input type="checkbox" name="type[]" value="27">&nbsp;&nbsp;Пансионат<br>
    7.     </div>
    8.         <div class="search4hotelrating">
    9.         <input type="checkbox" name="rating[]" value="15,17">&nbsp;&nbsp;2*<br>
    10.         <input type="checkbox" name="rating[]" value="19">&nbsp;&nbsp;3*<br>
    11.         <input type="checkbox" name="rating[]" value="21">&nbsp;&nbsp;4*<br>
    12.         <input type="checkbox" name="rating[]" value="23">&nbsp;&nbsp;5*<br>
    13.     </div>
    14.     <div class="search4hotelplace">
    15.         <input type="checkbox" name="place[]" value="5">&nbsp;&nbsp;Центр<br>
    16.         <input type="checkbox" name="place[]" value="6">&nbsp;&nbsp;Хоста<br>
    17.         <input type="checkbox" name="place[]" value="7">&nbsp;&nbsp;Адлер<br>
    18.         <input type="checkbox" name="place[]" value="42">&nbsp;&nbsp;Имеретинка<br>
    19.         <input type="checkbox" name="place[]" value="8">&nbsp;&nbsp;Красная Поляна<br>
    20.         <input type="checkbox" name="place[]" value="10">&nbsp;&nbsp;Дагомыс<br>
    21.         <input type="checkbox" name="place[]" value="9">&nbsp;&nbsp;Лазаревское<br>
    22.         ваше имя<input type="text" name="clientname" size="25">
    23.         ваш eMail<input type="text" name="clientemail" size="25">
    24.         ваш телефон<input type="text" name="clienttelephone" size="25">
    25.         Дата заезда<input type="text" name="datein" class="tcal"  value="выберите дату" />
    26.         Дата отъезда<input type="text" name="dateout" class="tcal"  value="выберите дату" />
    27.  
    28.     </div>
    29.     <div class="search4hotelbuttons">
    30.         <input name="submit" value="ПОКАЗАТЬ ВЫБРАННОЕ" type="submit">
    31.     </div>
    32.     </form>
    На ее основе все и работает. Делается запрос в базу исходя из собранных данных, результаты выводятся постранично в нужном оформлении.
    ПЛЮС!
    На электронный адрес манагера уходит письмо с данными, что отмечены клиентом.

    ПРОБЛЕМА:
    Если человек отметил один чекбокс в группе (например Отель), то в письме приходит: Отель.
    Если человек отметил два чекбокса в группе (например Отель и Санаторий - ну рассматривает варианты человек), то в письме не приходит ничего.
    И тоже самое по группам чекбоксов "рейтинг"(rating) и "расположение" (place).

    Максимум, что происходит - при указании в теле письма $rating, а не $typ[$rating] например, в письме приходят числовые значения выбранных пунктов, причем приходят верно. Например:
    Желаемый тип размещения: 27, 28.
    А нужны то присвоенные слова: Санаторий, Пансионат.
     
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Re: Тупик - вывод нескольких значений из ассоциативного масс

    Перед отправкой на почту посмотри какие данные хранятся в переменных $_GET['type'] и $_GET['place'] может там пусто.
    var_dump()
    Что не понятно в инструкции отладки? http://phpfaq.ru/debug
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: Тупик - вывод нескольких значений из ассоциативного масс

    в бд попадает, потому что там всё правино, но вы склеиваете всё это дело в одну переменную
    Код (Text):
    1. $rating = implode(',', $_GET['rating']);
    тип того, поэтому у вас
    Код (Text):
    1. Класс: ' . $ratt[$rating] . '
    не работает, т.к. там внутре сидит что-то типа $ratt['15,17,19'], а такого у вас в
    Код (Text):
    1.   $ratt[15] = '1*';
    2.   $ratt[17] = '2*';
    3.   $ratt[19] = '3*';
    4.   $ratt[21] = '4*';
    5.   $ratt[23] = '5*';
    эссно нету.

    Соотв. вам надо при выводе в письмо заново собирать эти значения тип того:
    Код (Text):
    1.   $rating = [];
    2.   foreach ($_GET['rating'] as $val) {
    3.     $rating[] = $ratt[$val];
    4.   }
    5.   $rating = implode(', ', $rating);
    а потом
    Код (Text):
    1. Класс: ' . $rating . '
    И ещё у вас инъекция в бд
     
  9. Alexnewaro

    Alexnewaro Активный пользователь

    С нами с:
    8 фев 2015
    Сообщения:
    109
    Симпатии:
    1
    Re: Тупик - вывод нескольких значений из ассоциативного масс

    Спасибо, сейчас попробую...
    Можно и нужно на ты, я ваш давний "фанат" :)
    А про инъекцию - можно поподробнее? Я, несомненно, начитаю и разберусь, характер такой, но сейчас оставлять без внимание брешь в защите - дико не хотелось бы...
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: Тупик - вывод нескольких значений из ассоциативного масс

    У тебя что пришло то ты и ставишь в запрос. И если тебе кто-то пришлет запрос вместо данных, то он уйдёт в бд и исполнится. Могут быть проблемы. Нужно эскейпить.

    Добавлено спустя 47 минут 33 секунды:
    Re: Тупик - вывод нескольких значений из ассоциативного массива
    для безопасности вот, но она устарена, и надо юзать другие подходы, http://php.ru/manual/function.mysql-real-escape-string.html

    когда же кто-нить запилит топик по инъекциям?... =(
     
  11. Alexnewaro

    Alexnewaro Активный пользователь

    С нами с:
    8 фев 2015
    Сообщения:
    109
    Симпатии:
    1
    Re: Тупик - вывод нескольких значений из ассоциативного масс

    мне стыдно, но я не до конца понял...
    Так как выскакивают ошибки типа
    Fatal error: Cannot use [] for reading in...

    И знания сразу поплыли...


    $rating = [];
    foreach ($_GET['rating'] as $val) {
    $rating[] = $ratt[$val];
    }
    $rating = implode(', ', $rating);
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: Тупик - вывод нескольких значений из ассоциативного масс

    пхп старый, надо писать $rating = array();
     
  13. Alexnewaro

    Alexnewaro Активный пользователь

    С нами с:
    8 фев 2015
    Сообщения:
    109
    Симпатии:
    1
    Re: Тупик - вывод нескольких значений из ассоциативного масс

    А я еще смотрю, но думаю совсем чего-то не знаю, ваш авторитет неприложен )))
    Поменял на array - все заработало как надо. Гениально, спасибо!