За последние 24 часа нас посетили 72617 программистов и 3032 робота. Сейчас ищут 1470 программистов ...

Что будет быстрее работать?

Тема в разделе "PHP для новичков", создана пользователем Dron-Boy, 23 мар 2017.

  1. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Вот что будет быстрее работать запрос из бд сразу с нескольки таблиц одним запросом допустим из 4. и если работать будет запрос в бд. то как такой написать?
    Либо что то такое?
    PHP:
    1. $select_prod = mysqli_query($link, "SELECT`product_id`,`image`,`price`,`manufacturer_id`,`flag1`,`flag2`,`flag3`,`flag4`,`text1`,`text2`,`text3`,`text4`,`flag5`,`text5`,`flag6`,`text6` FROM oc_product");
    2.     $result_prod = mysqli_fetch_array($select_prod);
    3.     do{
    4.         $select_img = mysqli_query($link, "SELECT * FROM oc_product_image WHERE product_id = ".$result_prod['product_id']."");
    5.         $result_img = mysqli_fetch_array($select_img);
    6.         $select_description = mysqli_query($link, "SELECT * FROM oc_product_description WHERE product_id = ".$result_prod['product_id']."");
    7.         $result_description = mysqli_fetch_array($select_description);
    8.         $select_product_to_category = mysqli_query($link, "SELECT * FROM oc_product_to_category WHERE product_id = ".$result_prod['product_id']."");
    9.         $result_product_to_category = mysqli_fetch_array($select_product_to_category);
    10.         $select_product_discount = mysqli_query($link, "SELECT * FROM oc_product_discount WHERE product_id = ".$result_prod['product_id']."");
    11.         $result_product_discount = mysqli_fetch_array($select_product_discount);
    12.         $select_manufacturer = mysqli_query($link, "SELECT * FROM oc_manufacturer WHERE manufacturer_id = ".$result_prod['manufacturer_id']."");
    13.         if($select_manufacturer){
    14.             $result_manufacturer = mysqli_fetch_array($select_manufacturer);
    15.             $manufactured = $result_manufacturer['name'];
    16.         }else{
    17.             $manufactured ='';
    18.         }
    19.      
    20.      
    21.         $mas_prod[] =
    22.             array(
    23.                 "product_id" => $result_prod['product_id'],
    24.                 "image" => $result_prod['image'],
    25.                 "price" => $result_prod['price'],
    26.                 "price_discount" => $result_product_discount['price'],
    27.                 "flag1" => $result_prod['flag1'],
    28.                 "flag2" => $result_prod['flag2'],
    29.                 "flag3" => $result_prod['flag3'],
    30.                 "flag4" => $result_prod['flag4'],
    31.                 "text1" => $result_prod['text1'],
    32.                 "text2" => $result_prod['text2'],
    33.                 "text3" => $result_prod['text3'],
    34.                 "text4" => $result_prod['text4'],
    35.                 "flag5" => $result_prod['flag5'],
    36.                 "text5" => $result_prod['text5'],
    37.                 "flag6" => $result_prod['flag6'],
    38.                 "text6" => $result_prod['text6'],
    39.                 "all_image" => $result_img['image'],
    40.                 "product_image_id" => $result_img['product_image_id'],
    41.                 "name" => $result_description['name'],
    42.                 "description" => $result_description['description'],
    43.                 "meta_title" => $result_description['meta_title'],
    44.                 "meta_h1" => $result_description['meta_h1'],
    45.                 "meta_description" => $result_description['meta_description'],
    46.                 "meta_keyword" => $result_description['meta_keyword'],
    47.                 "manufacturer" => $manufactured,
    48.                 "product_to_category" => $result_product_to_category,
    49.                 );
    50.     }
    51.     while($result_prod = mysqli_fetch_array($select_prod));
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.822
    Симпатии:
    1.333
    Адрес:
    Лень
    LEFT JOIN помогает
    --- Добавлено ---
    do {} while () дно
     
  3. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Я не понял что ты хотел сказать.
    Но возможно тебе поможет это:
    PHP:
    1. $start = microtime(true);
    2. # Здесь вставляешь свой скрипт
    3. $time = microtime(true) - $start;
    4. printf('Скрипт выполнялся %.4F сек.', $time)
    И потом тоже самое, но с другим скриптом чтобы засечь время и будет тебе ответ.
     
  4. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Я знаю
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    я ож охренел, как увидел, не надо так больше. У меня комп тормозить начал просто от наличия этого вот на мониторе.
     
    [vs] нравится это.
  6. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Чувак, а открыть модели Open Cart, и посмотреть, как разработчики сделали? Они, конечно, говняненько пишут, если честно, но всё-таки профессионально.
     
  7. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Так говняненько, или профессионально? :)
     
  8. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Одно другому не мешает. А вообще, так-на-так. Много работаю с этим движком, некоторые фрагменты кода просто бесят. Допустим, когда они в контроллерах 40 элементов массива из языкового файла по одному перегоняют в массив $data, хотя их же подсистема работы с языками позволяет это сделать в одну строчку.
    Натуральный фетиш. Но join-ы в таблицах они использовать умеют :)
     
  9. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Я думаю, что, скорее всего разные люди разрабатывали, и человек, который работал с перебором массива попросту не знал об этой самой подсистеме.
     
  10. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Вот это просто любители говнокода. Больше всего бесит :)
    upload_2017-3-23_21-59-55.png
    --- Добавлено ---
    А самое главное, это переписывается одной строчкой:
    PHP:
    1. $data=$this->load->language('catalog/product');
     
    acho нравится это.
  11. acho

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

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    @mkramer, а изменения предложить им нельзя?
     
  12. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @mkramer, это не говнокод, это необходидомсть. Так несомненно ты вытянешь язык, но затрешь все что было в $data а там кроме языка может много чего еще быть. Ну, практические все данные которые передаются в представление.
    --- Добавлено ---
    И в конце этот массив экстрактится это на мой взгляд еще один плюс
     
  13. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    PHP:
    1. $data = array_merge($data, $this->load->language('catalog/product'));
    А вообще, $this->load->language('catalog/product') у них в большей части акций первой строкой, когда в $data затирать ещё нечего.
     
  14. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Да, где надо они используют такой подход чтобы вытянуть языкaовые данные для шаблона product
    PHP:
    1. $data['text_select'] = $this->language->get('text_select');
    2.             $data['text_manufacturer'] = $this->language->get('text_manufacturer');
    3.             $data['text_model'] = $this->language->get('text_model');
    4.             $data['text_reward'] = $this->language->get('text_reward');
    5.             $data['text_points'] = $this->language->get('text_points');
    6.             $data['text_stock'] = $this->language->get('text_stock');
    а данные которые они тянут методом выше отсутствуют в файле catalog/product. Я думаю эти глобальные языковые данные, которые надо тянуть при необходимости, что они и делают.

    А не прописали они эти данные прямо в языковый конфиг(скажем так) потому, что будет дублирование этого всего почти для каждого конфига шаблона страницы.

    Я к чему говорил
    PHP:
    1. $data=$this->load->language('catalog/product');
    Так ты затрешь данные в дата, тут просто вызова хватает, не надо инициализировать $data инициализация происходит неявно.
     
  15. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Чувак, чтобы не палиться, вместо:
    PHP:
    1. $result_prod = mysqli_fetch_array($select_prod);
    2. do{
    3. //бла бла бла
    4. }
    5. while ( $result_prod = mysqli_fetch_array($select_prod) );
    пиши вот так:
    PHP:
    1. while ( $result_prod = mysqli_fetch_array($select_prod) ){
    2. //бла бла бла
    3. }
    ;)
     
    MouseZver нравится это.
  16. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Не-а. Глобальные языковые данные загружаются ещё в index.php, они сидят в экземпляре Language, и потом вызов load из контроллера примешивает к ним конкретные данные, и, самое прикольное, возвращает всё вместе. А создатели Open Cart почему-то спускают это в унитаз и начинают свою возню с выковыриванием по одной строчке. Ладно, офтоп уже.

    ТС, ты в курсе, что product_description может быть несколько (на каждом языке)? Поэтому он в отдельной таблице и есть. А если конкретно в твоём случае так не может быть, то лучше сделать join, как это сделано в родной модели open cart (хотя запросы у них жутковато немного выглядят, но работают достаточно эффективно)
    PHP:
    1. $query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, "
    2.               . "(SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND "
    3.               . "pd2.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND pd2.quantity = '1' "
    4.               . "AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) "
    5.               . "ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps "
    6.               . "WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') .
    7.               "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) "
    8.               . "ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT points FROM " . DB_PREFIX . "product_reward pr "
    9.               . "WHERE pr.product_id = p.product_id AND customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "') "
    10.               . "AS reward, (SELECT ss.name FROM " . DB_PREFIX . "stock_status ss "
    11.               . "WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '" . $lang . "') AS stock_status, (SELECT wcd.unit FROM " . DB_PREFIX . "weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS weight_class, (SELECT lcd.unit FROM " . DB_PREFIX . "length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS length_class, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT COUNT(*) AS total FROM " . DB_PREFIX . "review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews, p.sort_order FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) WHERE p.product_id = '" . (int)$product_id . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'");
    Конечно, в исходнике ты его в таком виде не найдёшь. Я просто на этом магазине туда лазил, поэтому привёл в вид, более понятный мне.
     
  17. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @mkramer, ок. Ты всегда сможешь модифицировать код в одном из контроллеров для прикола, тогда увидишь, зачем они это так делают :)
     
  18. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Я это делал :) Всё ОК. Первой строчкой контроллера ставишь $data = $this->language->load(/* */) и радуешься. И в своих контроллерах всегда так пишу
     
  19. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @mkramer, даже если есть первой строчкой $this->language->load(/* */) они всеравно иногда лопатят эти данные. Попробуй эти данные так жя затянуть
     
  20. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    @mahmuzar, нормально всё будет. Удалял я пару раз всю эту языковую дребедень, и нормально работало.