1. PHP / Говнокод #4511

    +164

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    function get_afisha()
    {
    	global $database;
    	$i=2;			
    	while(count($row)<4)
    	{
    		$query='
    		(
    			SELECT DISTINCT ae.id, ae.title
    				FROM afisha.#__afisha_events ae
    				WHERE  	ae.published = 1 AND
    						ae.deleted = 0 AND
    						ae.type_event = 1 AND
    						ae.id IN (SELECT aed.id_event FROM afisha.#__afisha_event_dates aed WHERE aed.date >= CURDATE()) AND
    						ae.city=1
    				ORDER BY RAND()	
    				LIMIT 1
    		)
    		union
    		(		
    			SELECT c.id,c.title		
    				FROM night.#__content c 
    				LEFT JOIN night.#__content_afisha_date ca 
    					ON c.id = ca.id_content		
    				WHERE 	c.state=1 AND 
    						c.access=0 AND 
    						ca.date >= CURDATE() AND 
    						c.catid=5 AND
    						ae.city=1
    				GROUP BY c.id, ca.id_content		
    				ORDER BY RAND()		
    				LIMIT 1
    		)
    		union
    		(		
    			SELECT DISTINCT ae.id, ae.title
    				FROM afisha.#__afisha_events ae
    				WHERE  	ae.published = 1 AND
    						ae.deleted = 0 AND
    						ae.type_event = 4 AND
    						ae.id IN (SELECT aed.id_event FROM afisha.#__afisha_event_dates aed WHERE aed.date >= CURDATE()) AND
    						ae.city=1
    				ORDER BY RAND()	
    				LIMIT 1
    		)
    		union
    		(
    			SELECT DISTINCT ae.id, ae.title
    				FROM afisha.#__afisha_events ae
    				WHERE  	ae.published = 1 AND
    						ae.deleted = 0 AND
    						ae.type_event = 2 AND
    						ae.id IN (SELECT aed.id_event FROM afisha.#__afisha_event_dates aed WHERE aed.date >= CURDATE()) AND
    						ae.city=1
    				ORDER BY RAND()	
    				LIMIT 1
    		)';		
    		$database->setQuery($query);
    		$row=$database->loadObjectlist();
    		$i++;
    	}
    	return $row;
    }
    $row=get_afisha();

    Очень нужная переменная i.

    Запостил: vidok, 02 Ноября 2010

    Комментарии (28) RSS

    • И в этом всё говно? Слабовато...
      Ответить
      • Это говно вешало наш 8 ядерный сервер с 16 гигами оперативы
        Ответить
        • > Это говно вешало наш 8 ядерный сервер с 16 гигами оперативы

          а вы всмотритесь в строчки 16,31,43,55 и поймете почему
          еще подзапросы в строчках 14,41,53 мне кажутся избыточными - думаю, если их вынести в отдельный запрос, можно уже будет обойтись 2ядерным сервом с 4гигами оперативы.

          А если потрудитесь обьяснить задачу этого ужасного запроса, то наверное вполне можно будет сократить его обьем раз в 5, да и скорость увеличится.
          Ответить
        • > Это говно вешало наш 8 ядерный сервер с 16 гигами оперативы
          рефакторинг -> уберите $i
          Ответить
      • а больше говна вы нигде не чуете?
        Ответить
        • Просто мне лень этот код вкуривать ,но раз аффтар сказал, что говно только в $i, то так оно и есть.
          Ответить
          • Гавно не только в i
            Ответить
          • 1. беглый осмотр кода показывает оооочень размазанный скул-запрос, так что, при равной возможности каждой строчки на содержание говна, скул сразу попадает под подозрение
            2. далее, опять же, не вникая в код, мы видим, что визуально он представляет собой несколько похожих кусков, следовательно, количество информации в них меньше (архиваторы неплохо бы сжали) - что только подкрепляет гипотезу 1
            3. далее, обращая внимание только на бросающиеся ключевые слова, видим много селектов, а так же чудовищную строку ORDER BY RAND(), что более-менее опытным кодерам известна.
            4. дальше концентрат говна детектед, далее лень разжевывать кодеру, что да как
            Ответить
            • Предположительно, например, первый и третий куски можно объединить, при условии "type_event in (1,4 )", как минимум.
              Проблемы всегда начинаются, когда лезут в калашный ряд те, кто не разбираются в предмете. В результате, если ещё php как-то нагрузку держит, базы начинают затыкаться на ровном месте.
              Ответить
              • а что значит "разбираться в предмете"? автор сабжа вполне умеет писать скул-запросы. А оптимизация запросов это предметная область, или все же изыски опытных кодеров?

                К примеру, в университете у нас, помнится, был предмет "системы управления базами данных", и там, среди прочих базовых знаний, учили даже нормальным формам вплоть до четвертой. Предмет пройден, то есть, считается, что нас обучили как следует. Однако про оптимизацию запросов пришлось интересоваться самому + здравый смысл + эмпирический опыт.
                Ответить
                • Значит, те, кто может/хочет - те научатся. Любимая фраза же всех остальных "профессионалы построили Титаник".
                  Не думаю, что интститут мне дал что-то кроме скупого базиса. Ну, по крайней мере, с join'ами пришлось разбираться самостоятельно.
                  Тем не менее, некоторые отрасли требовательнее к кодомартышкам, нежели другие. И запросы подобного рода, например, им с рук уже не сходят. Тут уже не скачать компонент, который "сделает все хорошо". И не скопипастить кусочек функции на форуме. Вот и получается, что регулярки у обезьян - совершенно ненормальные, запросы жрут сотни памяти через одного.
                  Уметь писать запрос и уметь написать корректный запрос - два совершенно разных умения.
                  Ответить
                  • тут дело в подходе.
                    есть два совершенно разных подхода, и их носители друг друга не понимают.

                    первый: "мне надо работать с FOO. Сейчас я разберусь, как с ней правильно работать, пойму ее идеологию, почитаю бестпрактисы, подпишусь на рассылку, и через недельку буду сносно рубить в FOO".

                    второй: "мне надо работать с FOO. Но времени (да и сил) разбираться с ним нет. В конце концов -- я же специалист по BAR , а не по FOO, мне не за это платят. Сейчас я скопирую готовый код с форума, и если он заработает -- все ок. Если что-то сглючит -- будем разбираться, в конце концов на форуме мне всегда помогут".

                    Я видел такое и среди админов и среди программеров.
                    Ответить
                    • есть ещё третий: "мне надо работать с FOO. Но времени (да и сил) разбираться с ним нет. В конце концов -- я же специалист по BAR. Сейчас я [немножко] пойму ее идеологию, и через недельку перепишу FOO на BAR."
                      ---
                      PS копипаста - зло...
                      Ответить
                      • >>перепишу FOO на BAR
                        а потом:
                        --зачем ты пишешь десктопное приложение и демона на php?
                        --потому что я php уже знаю, а другие языки -- нет
                        Ответить
                        • winapi под php - по определению уже говно. типа, если можно написать гуёвое приложение на питоне, почему не дать возможность сделать его и на пхп?
                          Ответить
                • > автор сабжа вполне умеет писать скул-запросы
                  копипастить точно умеет
                  Ответить
    • прикольно, пока мы все таки 4 строки не достанем, продолжаем выбирать, получаем почти Perpetuum Mobile
      Ответить
    • обожаю вшитые SQL запросы
      Ответить
    • > Это говно вешало наш 8 ядерный сервер с 16 гигами оперативы

      Не уж-то все дело в инкременте $i... :)
      Ответить
    • mail.ru?
      Ответить
    • vanished
      Ответить

    Добавить комментарий