Вот вышло у меня говно-код. Поэтому хотел с вас профи оптимизировать моего кода на нужный. А так код работает нормально но коряво раставил.! Код отвечает о добавление предмета со стыком количества. А в инвентаре имеет слот вот и добавляют его итем количества. Код (PHP): public function ItemAdd($item = false, $count = 1) { if (!$item) { throw new \Exception('Неизвестная ошибка'); } $q = Db::GetPdo()->prepare("SELECT SUM(`number`) FROM `bag` WHERE `user` = ?") ; $q->execute(array($this->id)); $bags_all_sum = $q->fetchColumn(); $q = Db::GetPdo()->prepare("SELECT count(*) FROM `bag` WHERE `user` = ?") ; $q->execute(array($this->id)); $bags_all_count = $q->fetchColumn(); $res = Db::GetPdo()->prepare("SELECT SUM(`number`) FROM `bag` WHERE `user` = ? AND `item` = ? AND `number` < 100") ; $res->execute(array($this->id, $item)); $bags_sum = $res->fetchColumn(); $q = Db::GetPdo()->prepare("SELECT count(*) FROM `bag` WHERE `user` = ? AND `item` = ? AND `number` < 100") ; $q->execute(array($this->id, $item)); $bags_count = $q->fetchColumn(); if($this->slot > $bags_all_count) { //Имеет свободный слот $q = Db::GetPdo()->prepare("SELECT * FROM `bag` WHERE `user` = ? AND `item` = ? AND `number` < 100 LIMIT 1") ; $q->execute(array($this->id, $item)); if($bag = $q->fetch()) { if(($bag['number'] + $count) > 100) { $count_update = 100 - $bag['number']; $count_add = $count - $count_update; Bag::Update($bag, $count_update); if($this->ItemAdd($item, $count_add)) { return true; } return false; } else { Bag::Update($bag, $count); return true; } return false; } else { Bag::Add($item, $this->id, $count); return true; } } else { //Не Имеет свободный слот $q = Db::GetPdo()->prepare("SELECT * FROM `bag` WHERE `user` = ? AND `item` = ? AND `number` < 100 LIMIT 1") ; $q->execute(array($this->id, $item)); if($bag = $q->fetch()) { if(($bag['number'] + $count) <= 100) { Bag::Update($bag, $count); return true; } else { if(($bags_sum + $count) > (100 * $bags_count)) { return false; } $count_update = 100 - $bag['number']; $count_add = $count - $count_update; Bag::Update($bag, $count_update); if($this->ItemAdd($item, $count_add)) { return true; } return false; } } else { return false; } } }
Я не говорил такой я говорил о правильный код и запрос чтобы не нагружать сайт. а не форматы порядка я и так формат знаю! К примеру много запрос это геморой все делать можно в 1 запрос но как я не знаю я еше не продвинул до профи =)
Код (PHP): $q = Db::GetPdo()->prepare("SELECT count(*) AS bags_count, SUM(`number`) AS number_sum FROM `bag` WHERE `user` = ?") ; $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 местах.
smitt, да можно, это проверка слота который имеет не полный стык количества. Если нет то ответ false а если слот имеет свободный то добавить такие дела.! Добавлено спустя 12 минут 36 секунд: Так проверил работает! Но код и тоже правильно упростить надо =( Код (PHP): $q = Db::GetPdo()->prepare("SELECT count(*) AS bags_count, SUM(`number`) AS number_sum FROM `bag` WHERE `user` = ?") ; $q->execute(array($this->id)); $all_bags = $q->fetch(); $res = Db::GetPdo()->prepare("SELECT SUM(`number`) AS number_sum, count(*) AS bags_count FROM `bag` WHERE `user` = ? AND `item` = ? AND `number` < 100") ; $res->execute(array($this->id, $item)); $bags = $res->fetch(); echo '<pre>'; print_r(array( 'all_bags' => $all_bags, 'bags' => $bags )); echo '</pre>'; Добавлено спустя 9 минут 59 секунд: Уловил суть запроса и немного поправил и уменшил коды. Код (PHP): public function ItemAdd($item = false, $count = 1) { if (!$item) { throw new \Exception('Неизвестная ошибка'); } $q = Db::GetPdo()->prepare("SELECT count(*) AS bags_count, SUM(`number`) AS number_sum FROM `bag` WHERE `user` = ?") ; $q->execute(array($this->id)); $all_bags = $q->fetch(); $q = Db::GetPdo()->prepare("SELECT SUM(`number`) AS number_sum, count(*) AS bags_count FROM `bag` WHERE `user` = ? AND `item` = ? AND `number` < 100") ; $q->execute(array($this->id, $item)); $bags = $q->fetch(); $q = Db::GetPdo()->prepare("SELECT * FROM `bag` WHERE `user` = ? AND `item` = ? AND `number` < 100 LIMIT 1") ; $q->execute(array($this->id, $item)); $bag = $q->fetch(); echo '<pre>'; print_r(array( 'all_bags' => $all_bags, 'bags' => $bags, 'bag' => $bag )); echo '</pre>'; if($this->slot > $all_bags['bags_count']) { //Имеет свободный слот if($bag) { if(($bag['number'] + $count) > 100) { $count_update = 100 - $bag['number']; $count_add = $count - $count_update; Bag::Update($bag, $count_update); if($this->ItemAdd($item, $count_add)) { return true; } return false; } else { Bag::Update($bag, $count); return true; } return false; } else { Bag::Add($item, $this->id, $count); return true; } } else { //Не Имеет свободный слот if($bag) { if(($bag['number'] + $count) <= 100) { Bag::Update($bag, $count); return true; } else { if(($bags['number_sum'] + $count) > (100 * $bags['bags_count'])) { return false; } $count_update = 100 - $bag['number']; $count_add = $count - $count_update; Bag::Update($bag, $count_update); if($this->ItemAdd($item, $count_add)) { return true; } return false; } } else { return false; } } }