Вот что будет быстрее работать запрос из бд сразу с нескольки таблиц одним запросом допустим из 4. и если работать будет запрос в бд. то как такой написать? Либо что то такое? PHP: $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"); $result_prod = mysqli_fetch_array($select_prod); do{ $select_img = mysqli_query($link, "SELECT * FROM oc_product_image WHERE product_id = ".$result_prod['product_id'].""); $result_img = mysqli_fetch_array($select_img); $select_description = mysqli_query($link, "SELECT * FROM oc_product_description WHERE product_id = ".$result_prod['product_id'].""); $result_description = mysqli_fetch_array($select_description); $select_product_to_category = mysqli_query($link, "SELECT * FROM oc_product_to_category WHERE product_id = ".$result_prod['product_id'].""); $result_product_to_category = mysqli_fetch_array($select_product_to_category); $select_product_discount = mysqli_query($link, "SELECT * FROM oc_product_discount WHERE product_id = ".$result_prod['product_id'].""); $result_product_discount = mysqli_fetch_array($select_product_discount); $select_manufacturer = mysqli_query($link, "SELECT * FROM oc_manufacturer WHERE manufacturer_id = ".$result_prod['manufacturer_id'].""); if($select_manufacturer){ $result_manufacturer = mysqli_fetch_array($select_manufacturer); $manufactured = $result_manufacturer['name']; }else{ $manufactured =''; } $mas_prod[] = array( "product_id" => $result_prod['product_id'], "image" => $result_prod['image'], "price" => $result_prod['price'], "price_discount" => $result_product_discount['price'], "flag1" => $result_prod['flag1'], "flag2" => $result_prod['flag2'], "flag3" => $result_prod['flag3'], "flag4" => $result_prod['flag4'], "text1" => $result_prod['text1'], "text2" => $result_prod['text2'], "text3" => $result_prod['text3'], "text4" => $result_prod['text4'], "flag5" => $result_prod['flag5'], "text5" => $result_prod['text5'], "flag6" => $result_prod['flag6'], "text6" => $result_prod['text6'], "all_image" => $result_img['image'], "product_image_id" => $result_img['product_image_id'], "name" => $result_description['name'], "description" => $result_description['description'], "meta_title" => $result_description['meta_title'], "meta_h1" => $result_description['meta_h1'], "meta_description" => $result_description['meta_description'], "meta_keyword" => $result_description['meta_keyword'], "manufacturer" => $manufactured, "product_to_category" => $result_product_to_category, ); } while($result_prod = mysqli_fetch_array($select_prod));
Я не понял что ты хотел сказать. Но возможно тебе поможет это: PHP: $start = microtime(true); # Здесь вставляешь свой скрипт $time = microtime(true) - $start; printf('Скрипт выполнялся %.4F сек.', $time) И потом тоже самое, но с другим скриптом чтобы засечь время и будет тебе ответ.
я ож охренел, как увидел, не надо так больше. У меня комп тормозить начал просто от наличия этого вот на мониторе.
Чувак, а открыть модели Open Cart, и посмотреть, как разработчики сделали? Они, конечно, говняненько пишут, если честно, но всё-таки профессионально.
Одно другому не мешает. А вообще, так-на-так. Много работаю с этим движком, некоторые фрагменты кода просто бесят. Допустим, когда они в контроллерах 40 элементов массива из языкового файла по одному перегоняют в массив $data, хотя их же подсистема работы с языками позволяет это сделать в одну строчку. Натуральный фетиш. Но join-ы в таблицах они использовать умеют
Я думаю, что, скорее всего разные люди разрабатывали, и человек, который работал с перебором массива попросту не знал об этой самой подсистеме.
Вот это просто любители говнокода. Больше всего бесит Спойлер: Говнокод из Open Cart --- Добавлено --- А самое главное, это переписывается одной строчкой: PHP: $data=$this->load->language('catalog/product');
@mkramer, это не говнокод, это необходидомсть. Так несомненно ты вытянешь язык, но затрешь все что было в $data а там кроме языка может много чего еще быть. Ну, практические все данные которые передаются в представление. --- Добавлено --- И в конце этот массив экстрактится это на мой взгляд еще один плюс
PHP: $data = array_merge($data, $this->load->language('catalog/product')); А вообще, $this->load->language('catalog/product') у них в большей части акций первой строкой, когда в $data затирать ещё нечего.
Да, где надо они используют такой подход чтобы вытянуть языкaовые данные для шаблона product PHP: $data['text_select'] = $this->language->get('text_select'); $data['text_manufacturer'] = $this->language->get('text_manufacturer'); $data['text_model'] = $this->language->get('text_model'); $data['text_reward'] = $this->language->get('text_reward'); $data['text_points'] = $this->language->get('text_points'); $data['text_stock'] = $this->language->get('text_stock'); а данные которые они тянут методом выше отсутствуют в файле catalog/product. Я думаю эти глобальные языковые данные, которые надо тянуть при необходимости, что они и делают. А не прописали они эти данные прямо в языковый конфиг(скажем так) потому, что будет дублирование этого всего почти для каждого конфига шаблона страницы. Я к чему говорил PHP: $data=$this->load->language('catalog/product'); Так ты затрешь данные в дата, тут просто вызова хватает, не надо инициализировать $data инициализация происходит неявно.
Чувак, чтобы не палиться, вместо: PHP: $result_prod = mysqli_fetch_array($select_prod); do{ //бла бла бла } while ( $result_prod = mysqli_fetch_array($select_prod) ); пиши вот так: PHP: while ( $result_prod = mysqli_fetch_array($select_prod) ){ //бла бла бла }
Не-а. Глобальные языковые данные загружаются ещё в index.php, они сидят в экземпляре Language, и потом вызов load из контроллера примешивает к ним конкретные данные, и, самое прикольное, возвращает всё вместе. А создатели Open Cart почему-то спускают это в унитаз и начинают свою возню с выковыриванием по одной строчке. Ладно, офтоп уже. ТС, ты в курсе, что product_description может быть несколько (на каждом языке)? Поэтому он в отдельной таблице и есть. А если конкретно в твоём случае так не может быть, то лучше сделать join, как это сделано в родной модели open cart (хотя запросы у них жутковато немного выглядят, но работают достаточно эффективно) PHP: $query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, " . "(SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND " . "pd2.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND pd2.quantity = '1' " . "AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) " . "ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps " . "WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) " . "ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT points FROM " . DB_PREFIX . "product_reward pr " . "WHERE pr.product_id = p.product_id AND customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "') " . "AS reward, (SELECT ss.name FROM " . DB_PREFIX . "stock_status ss " . "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') . "'"); Конечно, в исходнике ты его в таком виде не найдёшь. Я просто на этом магазине туда лазил, поэтому привёл в вид, более понятный мне.
@mkramer, ок. Ты всегда сможешь модифицировать код в одном из контроллеров для прикола, тогда увидишь, зачем они это так делают
Я это делал Всё ОК. Первой строчкой контроллера ставишь $data = $this->language->load(/* */) и радуешься. И в своих контроллерах всегда так пишу
@mkramer, даже если есть первой строчкой $this->language->load(/* */) они всеравно иногда лопатят эти данные. Попробуй эти данные так жя затянуть