За последние 24 часа нас посетили 20960 программистов и 1622 робота. Сейчас ищут 1014 программистов ...

Избавиться от нескольких запросов или сделать рефакторинг

Тема в разделе "Прочие вопросы по PHP", создана пользователем vayas, 27 фев 2013.

  1. vayas

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

    С нами с:
    13 дек 2012
    Сообщения:
    167
    Симпатии:
    9
    Адрес:
    Пермь
    Всех приветствую...
    Есть следующий метод для работы с объявлением(недвижимости)
    Код (Text):
    1.  
    2. public function ActivateAdvert()
    3.     {
    4.         $arrChek = explode(',', $this->post['all-chek']); // на странице мы отметили несколько чеков с объявлениями и пришла строка вида "4,3,2,1,"
    5.         $arrChekParam = explode(',', $this->post['param-chek']);   // на этой же странице мы указали параметры куда может будет выгружаться данное объявление может придти строка вида "site1|4,site1|2,site2|2,site3|2,site1|1,site3|1," т.е. в $arrChekParam будет массив с элементами типа (site1|4,) где site1 это на какой сайт выгрузить, а 4 это id объявления
    6.        
    7.         foreach ($arrChek as $val)  // итак первая итерация сюда приходит 4
    8.         {
    9.             if($val != '')
    10.             {
    11.                 $param = '';
    12.                 foreach ($arrChekParam as $arrParam) // а сюда site1|4,
    13.                 {
    14.                     $arr = explode('|', $arrParam);      
    15.                     if($val == $arr[1] && $val != '')  здесь проверим будут ли равны ID
    16.                     {
    17.                         $param .= $arr[0] . '#'; сюда запишем сайт
    18.                         $idAdvert = $arr[1];        сюда ID
    19.                     }                        
    20.                 }
    21.                 if(!$param) это условие выполниться в том случае, если например мы выбрали одно объявление, но не выбрали ни одного сайта, тогда просто подставятся все параметры
    22.                 {
    23.                     $vals = '1';
    24.                     $query = $this->conn->dbh->prepare("UPDATE main_obj_realty SET site1= :site1,
    25.                                                     site2= :site2, site3= :site3
    26.                                                     WHERE user_id = :id AND id = :idAdvert");
    27.                         $query->bindParam(":id", $this->session['id'], PDO::PARAM_STR);
    28.                         $query->bindParam(":site1", $vals, PDO::PARAM_STR);
    29.                         $query->bindParam(":site2", $vals, PDO::PARAM_STR);
    30.                         $query->bindParam(":site3", $vals, PDO::PARAM_STR);
    31.                         $query->bindParam(":idAdvert", $val, PDO::PARAM_INT);
    32.                         $query->execute();
    33.  
    34.                 }
    35.                 else
    36.                 {
    37.                     $paramSplit = explode('#', $param); // здесь у нас может придти массив из трех сайтов поэтому такое условие думаю это понятно
    38.                     $site1= ($paramSplit[0] == 'site1' || $paramSplit[1] == 'site1' || $paramSplit[2] == 'site1) ? '1' : '0';
    39.                     $site2 = ($paramSplit[0] == 'site2' || $paramSplit[1] == 'site2' || $paramSplit[2] == 'site2') ? '1' : '0';
    40.                     $site3 = ($paramSplit[0] == 'site3' || $paramSplit[1] == 'site3' || $paramSplit[2] == 'site3') ? '1' : '0';
    41.                     $query = $this->conn->dbh->prepare("UPDATE main_obj_realty SET site1= :site1,
    42.                                                     site2= :site2, site3= :site3
    43.                                                     WHERE user_id = :id AND id = :idAdvert");
    44.                         $query->bindParam(":id", $this->session['id'], PDO::PARAM_STR);
    45.                         $query->bindParam(":site1", $site1, PDO::PARAM_STR);
    46.                         $query->bindParam(":site2", $site2, PDO::PARAM_STR);
    47.                         $query->bindParam(":site3", $site3, PDO::PARAM_STR);
    48.                         $query->bindParam(":idAdvert", $val, PDO::PARAM_INT);
    49.                         $query->execute();
    50.                 }
    51.             }
    52.         }  
    53.     }
    54. // ну и так по каждой итерации, подскажите можно что то с этим сделать
    Может быть можно как то избавиться от нескольких запросов, или сделать рефакторинг.
    Таких методов несколько для поднятия объявления, для продления, и т.д.
     
  2. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Re: Избавиться от нескольких запросов или сделать рефакторин

    не осилил. непонятно почему post['param-chek'] содержит id объявлений и при этом есть post['all-chek'] опять же с номерами объявлений.
    смысл как-то ускользает.

    наверное случай, когда "выбрали одно объявление, но не выбрали ни одного сайта" можно поймать до захода в цикл. хз...
     
  3. vayas

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

    С нами с:
    13 дек 2012
    Сообщения:
    167
    Симпатии:
    9
    Адрес:
    Пермь
    Re: Избавиться от нескольких запросов или сделать рефакторин

    Нет, это на тот случай когда мы выбираем например, у первого объявления (1 и третий сайт), а у 4 (только первый сайт).
    Иначе как мы узнаем, в каком именно объявлении был выбран какой-то параметр.
    Надеюсь на скрине будет лучше понятна моя мысль
    [​IMG]
    Если будет не понятно, постараюсь как то иначе объяснить.
     
  4. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Re: Избавиться от нескольких запросов или сделать рефакторин

    Непонятно... скрина то нет)
     
  5. vayas

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

    С нами с:
    13 дек 2012
    Сообщения:
    167
    Симпатии:
    9
    Адрес:
    Пермь
    Re: Избавиться от нескольких запросов или сделать рефакторин

    Блин, слетел когда я перезаливал видимо, чуть позже обновлю.