За последние 24 часа нас посетили 38562 программиста и 1284 робота. Сейчас ищут 1055 программистов ...

Нужно оптимизировать код!

Тема в разделе "PHP для новичков", создана пользователем engine.energy, 31 май 2015.

  1. engine.energy

    engine.energy Новичок

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0
    Вот вышло у меня говно-код. Поэтому хотел с вас профи оптимизировать моего кода на нужный.

    А так код работает нормально но коряво раставил.!

    Код отвечает о добавление предмета со стыком количества.

    А в инвентаре имеет слот вот и добавляют его итем количества.

    Код (PHP):
    1. public function ItemAdd($item = false, $count = 1)
    2.     {
    3.         if (!$item)
    4.         {
    5.             throw new \Exception('Неизвестная ошибка');
    6.         }
    7.     
    8.         $q = Db::GetPdo()->prepare("SELECT SUM(`number`) FROM `bag` WHERE `user` = ?") ;
    9.         $q->execute(array($this->id));
    10.         $bags_all_sum = $q->fetchColumn();
    11.         
    12.         $q = Db::GetPdo()->prepare("SELECT count(*) FROM `bag` WHERE `user` = ?") ;
    13.         $q->execute(array($this->id));
    14.         $bags_all_count = $q->fetchColumn();
    15.         
    16.         $res = Db::GetPdo()->prepare("SELECT SUM(`number`) FROM `bag` WHERE `user` = ? AND `item` = ? AND `number` < 100") ;
    17.         $res->execute(array($this->id, $item));
    18.         $bags_sum = $res->fetchColumn();
    19.         
    20.         $q = Db::GetPdo()->prepare("SELECT count(*) FROM `bag` WHERE `user` = ? AND `item` = ? AND `number` < 100") ;
    21.         $q->execute(array($this->id, $item));
    22.         $bags_count = $q->fetchColumn();
    23.         
    24.         
    25.         if($this->slot > $bags_all_count)
    26.         {
    27.             //Имеет свободный слот
    28.             $q = Db::GetPdo()->prepare("SELECT * FROM `bag` WHERE `user` = ? AND `item` = ? AND `number` < 100 LIMIT 1") ;
    29.             $q->execute(array($this->id, $item));
    30.             
    31.             if($bag = $q->fetch())
    32.             {
    33.                 if(($bag['number'] + $count) > 100)
    34.                 {
    35.                     $count_update = 100 - $bag['number'];
    36.                     $count_add = $count - $count_update;
    37.                     Bag::Update($bag, $count_update);
    38.                     if($this->ItemAdd($item, $count_add))
    39.                     {
    40.                         return true;
    41.                     }
    42.                     return false;
    43.  
    44.                 }
    45.                 else
    46.                 {
    47.                     Bag::Update($bag, $count);
    48.                     return true;
    49.                 }
    50.                 return false;
    51.             }
    52.             else
    53.             {
    54.                 Bag::Add($item, $this->id, $count);
    55.                 return true;
    56.             }
    57.         }
    58.         else
    59.         {
    60.             //Не Имеет свободный слот
    61.             $q = Db::GetPdo()->prepare("SELECT * FROM `bag` WHERE `user` = ? AND `item` = ? AND `number` < 100 LIMIT 1") ;
    62.             $q->execute(array($this->id, $item));
    63.             
    64.             if($bag = $q->fetch())
    65.             {
    66.                 if(($bag['number'] + $count) <= 100)
    67.                 {
    68.                     Bag::Update($bag, $count);
    69.                     return true;
    70.                 }
    71.                 else
    72.                 {
    73.                     if(($bags_sum + $count) > (100 * $bags_count))
    74.                     {    
    75.                         return false;
    76.                     }
    77.                     
    78.                     $count_update = 100 - $bag['number'];
    79.                     $count_add = $count - $count_update;
    80.                     Bag::Update($bag, $count_update);
    81.                     if($this->ItemAdd($item, $count_add))
    82.                     {
    83.                         return true;
    84.                     }
    85.                     return false;
    86.                 }
    87.             }
    88.             else
    89.             {
    90.                 return false;
    91.             }
    92.         }
    93.     }
     
  2. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  3. engine.energy

    engine.energy Новичок

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0
    Я не говорил такой я говорил о правильный код и запрос чтобы не нагружать сайт. а не форматы порядка я и так формат знаю!

    К примеру много запрос это геморой все делать можно в 1 запрос но как я не знаю я еше не продвинул до профи =)
     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Код (PHP):
    1. $q = Db::GetPdo()->prepare("SELECT count(*) AS bags_count, SUM(`number`) AS number_sum FROM `bag` WHERE `user` = ?") ;
    2. $res = Db::GetPdo()->prepare("SELECT SUM(`number`) AS number_sum, count(*) AS bags_count FROM `bag` WHERE `user` = ? AND `item` = ? AND `number` < 100") ;
    Добавлено спустя 2 минуты 46 секунд:
    //Имеет свободный слот
    $q = Db::GetPdo()->prepare("SELECT * FROM `bag` WHERE `user` = ? AND `item` = ? AND `number` < 100 LIMIT 1") ;

    //Не Имеет свободный слот
    $q = Db::GetPdo()->prepare("SELECT * FROM `bag` WHERE `user` = ? AND `item` = ? AND `number` < 100 LIMIT 1") ;

    Одинаковые sql. Может вынести наверх? по коду этот sql всегда выполнится. Если вынесешь потом не придется менять в 2 местах.
     
  5. engine.energy

    engine.energy Новичок

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0
    smitt, да можно, это проверка слота который имеет не полный стык количества. Если нет то ответ false а если слот имеет свободный то добавить такие дела.!

    Добавлено спустя 12 минут 36 секунд:
    Так проверил работает! Но код и тоже правильно упростить надо =(

    Код (PHP):
    1.         $q = Db::GetPdo()->prepare("SELECT count(*) AS bags_count, SUM(`number`) AS number_sum FROM `bag` WHERE `user` = ?") ;
    2.         $q->execute(array($this->id));
    3.         $all_bags = $q->fetch();
    4.         
    5.         $res = Db::GetPdo()->prepare("SELECT SUM(`number`) AS number_sum, count(*) AS bags_count FROM `bag` WHERE `user` = ? AND `item` = ? AND `number` < 100") ;
    6.         $res->execute(array($this->id, $item));
    7.         $bags = $res->fetch();
    8.         
    9.         echo '<pre>';
    10.         print_r(array(
    11.             'all_bags' => $all_bags,
    12.             'bags' => $bags
    13.             ));
    14.         echo '</pre>';
    Добавлено спустя 9 минут 59 секунд:
    Уловил суть запроса и немного поправил и уменшил коды.

    Код (PHP):
    1.     public function ItemAdd($item = false, $count = 1)
    2.     {
    3.         if (!$item)
    4.         {
    5.             throw new \Exception('Неизвестная ошибка');
    6.         }
    7.  
    8.         $q = Db::GetPdo()->prepare("SELECT count(*) AS bags_count, SUM(`number`) AS number_sum FROM `bag` WHERE `user` = ?") ;
    9.         $q->execute(array($this->id));
    10.         $all_bags = $q->fetch();
    11.         
    12.         $q = Db::GetPdo()->prepare("SELECT SUM(`number`) AS number_sum, count(*) AS bags_count FROM `bag` WHERE `user` = ? AND `item` = ? AND `number` < 100") ;
    13.         $q->execute(array($this->id, $item));
    14.         $bags = $q->fetch();
    15.         
    16.         $q = Db::GetPdo()->prepare("SELECT * FROM `bag` WHERE `user` = ? AND `item` = ? AND `number` < 100 LIMIT 1") ;
    17.         $q->execute(array($this->id, $item));
    18.         $bag = $q->fetch();
    19.         
    20.         echo '<pre>';
    21.         print_r(array(
    22.             'all_bags' => $all_bags,
    23.             'bags' => $bags,
    24.             'bag' => $bag
    25.             ));
    26.         echo '</pre>';
    27.         
    28.         if($this->slot > $all_bags['bags_count'])
    29.         {
    30.             //Имеет свободный слот
    31.             if($bag)
    32.             {
    33.                 if(($bag['number'] + $count) > 100)
    34.                 {
    35.                     $count_update = 100 - $bag['number'];
    36.                     $count_add = $count - $count_update;
    37.                     Bag::Update($bag, $count_update);
    38.                     if($this->ItemAdd($item, $count_add))
    39.                     {
    40.                         return true;
    41.                     }
    42.                     return false;
    43.  
    44.                 }
    45.                 else
    46.                 {
    47.                     Bag::Update($bag, $count);
    48.                     return true;
    49.                 }
    50.                 return false;
    51.             }
    52.             else
    53.             {
    54.                 Bag::Add($item, $this->id, $count);
    55.                 return true;
    56.             }
    57.         }
    58.         else
    59.         {
    60.             //Не Имеет свободный слот
    61.             if($bag)
    62.             {
    63.                 if(($bag['number'] + $count) <= 100)
    64.                 {
    65.                     Bag::Update($bag, $count);
    66.                     return true;
    67.                 }
    68.                 else
    69.                 {
    70.                     if(($bags['number_sum'] + $count) > (100 * $bags['bags_count']))
    71.                     {    
    72.                         return false;
    73.                     }
    74.                     
    75.                     $count_update = 100 - $bag['number'];
    76.                     $count_add = $count - $count_update;
    77.                     Bag::Update($bag, $count_update);
    78.                     if($this->ItemAdd($item, $count_add))
    79.                     {
    80.                         return true;
    81.                     }
    82.                     return false;
    83.                 }
    84.             }
    85.             else
    86.             {
    87.                 return false;
    88.             }
    89.         }
    90.     }
    91.