Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Скрипт вывода товаров, очень долго грузится (foreach).

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
RageXL
Отправлено: 18 Ноября, 2014 - 22:44:16
Post Id


Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Авг. 2013  


Помог: 0 раз(а)




Функции выборки товаров из базы:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  function result_to_array($result) {
  2.                 $res_array = array();
  3.                 $count = 0;
  4.                 while( $row = $result->fetch_assoc() ) {
  5.                         $res_array[$count] = $row;
  6.                         $count++;
  7.                 }
  8.                 return $res_array;
  9.         }
  10.  
  11.     function get_product() {
  12.                 connect_db();
  13.                 global $mysqli;
  14.                 $result = $mysqli->query("SELECT *FROM `product` ORDER by `id` DESC");
  15.                 $result = result_to_array($result);
  16.                 return $result;
  17.         }


На самой странице все товары выводятся циклом foreach:

CODE (htmlphp):
скопировать код в буфер обмена
  1.     $products = get_product();
  2.  
  3.     <? foreach ($products as $product): ?>
  4.    
  5.     html код
  6.    
  7.     <? endforeach; ?>


Проблема в том, что страница с товарами открывается ну очень долго, раньше просто на этой же самой странице делал запрос и выводил все через while по скорости было ощутимо быстрее. Подскажите что я делаю не так и почему так медленно работает скрипт ?
 
 Top
kotyara1979
Отправлено: 19 Ноября, 2014 - 02:19:24
Post Id


Частый гость


Покинул форум
Сообщений всего: 247
Дата рег-ции: Окт. 2012  


Помог: 7 раз(а)




1. потому что два цикла вместо одного.
2. уходит больше памяти. всю выборку после первого цикла ты хранишь в оперативке.

Лучше сделать вывод непосредственно из базы первым циклом. Если пытаешься отрезать html-код от php, то определи шаблон вывода в нужном файле и передай его в функцию (printf, например, используй).

(Отредактировано автором: 19 Ноября, 2014 - 02:25:09)



-----
Сделать можно все. Главное одеть каску.
 
 Top
alnik-75
Отправлено: 19 Ноября, 2014 - 08:15:41
Post Id



Посетитель


Покинул форум
Сообщений всего: 338
Дата рег-ции: Сент. 2012  
Откуда: Гродно, Беларусь


Помог: 0 раз(а)




можно для наглядности привести простенький примерчик реализации ?
 
 Top
kotyara1979
Отправлено: 20 Ноября, 2014 - 04:25:23
Post Id


Частый гость


Покинул форум
Сообщений всего: 247
Дата рег-ции: Окт. 2012  


Помог: 7 раз(а)




alnik-75 пишет:
можно для наглядности привести простенький примерчик реализации ?


PHP:
скопировать код в буфер обмена
  1. function get_product()
  2. {
  3.         connect_db();
  4.         global $mysqli,$pattern;
  5.         $result = $mysqli->query("SELECT * FROM `product` ORDER by `id` DESC");
  6.         while( $row = $result->fetch_assoc()) {
  7.                 printf($pattern,$row['name'],$row['price']);
  8.         }
  9. }
  10.  
  11. $pattern = '<TR><TD>%1$s</TD><TD>%2$s</TD></TR>';
  12. echo "<table>";
  13. $products = get_product();
  14. echo "</table>";


-----
Сделать можно все. Главное одеть каску.
 
 Top
alnik-75
Отправлено: 20 Ноября, 2014 - 07:31:34
Post Id



Посетитель


Покинул форум
Сообщений всего: 338
Дата рег-ции: Сент. 2012  
Откуда: Гродно, Беларусь


Помог: 0 раз(а)




спасибо за совет)))))а то я в html лепил кучу php
 
 Top
Мелкий Супермодератор
Отправлено: 20 Ноября, 2014 - 09:31:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




kotyara1979, Никогда так не делайте!
(Добавление)
RageXL, у вас изначальный код правильный. Осталось выкинуть result_to_array за ненадобностью, mysqli уже давно реализует итератор и выкинуть к чертям все глобальные переменные (благо синглтон можно реализовать и функцией, раз они вам так милы).

PHP:
скопировать код в буфер обмена
  1.  
  2. function get_db_connect() {
  3.         static $mysqli;
  4.         if(is_null($mysqli)) {
  5.                 $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
  6.                 $mysqli->set_charset('utf8');
  7.         }
  8.    return $mysqli;
  9. }
  10. function get_products() {
  11. return get_db_connect()->query("SELECT * FROM `product` ORDER by `id` DESC");
  12. }

Во вьюхе:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <? foreach (get_products() as $product): ?>
  2. <!--html-->
  3. <?endforeach?>


-----
PostgreSQL DBA
 
 Top
kotyara1979
Отправлено: 20 Ноября, 2014 - 11:55:41
Post Id


Частый гость


Покинул форум
Сообщений всего: 247
Дата рег-ции: Окт. 2012  


Помог: 7 раз(а)




Мелкий пишет:
Никогда так не делайте!


Если не затруднит, хоть чуток расшифруйте, почему.


-----
Сделать можно все. Главное одеть каску.
 
 Top
Мелкий Супермодератор
Отправлено: 20 Ноября, 2014 - 12:08:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Прибитая гвоздями глобальная переменная, я не знаю, что тут вообще можно комментировать. И опять же гвоздями прибитая модель (получение данных) к вьюхе (сколько именно, какие и в каком именно порядке выводить результаты).


-----
PostgreSQL DBA
 
 Top
esterio
Отправлено: 20 Ноября, 2014 - 12:27:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




kotyara1979
Пожалуйста не давайте плохих советов. Потом будут вопросы как поменять тайтл на странице, отослать редирект (после вывода) и т.д.

Мелкий
за итератор в mysqli спасибо не знал

(Отредактировано автором: 20 Ноября, 2014 - 12:32:12)

 
 Top
kotyara1979
Отправлено: 20 Ноября, 2014 - 15:08:45
Post Id


Частый гость


Покинул форум
Сообщений всего: 247
Дата рег-ции: Окт. 2012  


Помог: 7 раз(а)




Мелкий пишет:
Прибитая гвоздями глобальная переменная, я не знаю, что тут вообще можно комментировать. И опять же гвоздями прибитая модель (получение данных) к вьюхе (сколько именно, какие и в каком именно порядке выводить результаты).


Извините, вопрос, наверное, глупый, но, где вы увидели глобальную переменную "прибитую гвоздями"? Прибитая к чему?

1. шаблон вывода в блоке, отвечающем за эту часть.
2. функция для вывода отдельно от html. хоть подключаемый по условию файл, например. да мало ли вариантов.

В чем затык для работы? Спрашиваю не из праздного любопытства, подобные варианты кода, не совсем в таком виде, но приходилось использовать в проектах. всегда предпочитаю знать о возможных проблемах в работе. заранее спасибо за ответ.


(Добавление)
esterio пишет:
Потом будут вопросы как поменять тайтл на странице, отослать редирект (после вывода) и т.д.


Как это связано с начальным постом темы?

(Отредактировано автором: 20 Ноября, 2014 - 15:20:15)



-----
Сделать можно все. Главное одеть каску.
 
 Top
esterio
Отправлено: 20 Ноября, 2014 - 16:14:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




kotyara1979
это связано с скорее вашим сообщениям нежели с топиком. такое советовать плохой тон
 
 Top
Мелкий Супермодератор
Отправлено: 20 Ноября, 2014 - 16:19:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




kotyara1979 пишет:
$pattern = '<TR><TD>%1$s</TD><TD>%2$s</TD></TR>';

kotyara1979 пишет:
global $mysqli,$pattern;

Вот глобальная переменная. Гвоздями прибиты эта переменная к этой функции.
Просто и очевидно - зачем это вообще сделано глобальной переменной, а не банальным параметром?

Читайте "Совершенный код" Макконнелла, затем "Рефакторинг" Фаулера. Надеюсь, ещё не поздно вправить руки - то, что надо вообще говорить о вреде глобальных переменных - говорит очень о многом и весьма негативно.

kotyara1979 пишет:
функция для вывода отдельно от html.

Не отдельно.
Сколько именно, какие и в каком порядке выводить поля строки таблицы - жёстко задано в функции.
Банальное - надо продуктам с полем sale=1 поставить css-класс sale. Ваши действия? Переносить логику отображения в эту функцию?


-----
PostgreSQL DBA
 
 Top
kotyara1979
Отправлено: 20 Ноября, 2014 - 17:10:05
Post Id


Частый гость


Покинул форум
Сообщений всего: 247
Дата рег-ции: Окт. 2012  


Помог: 7 раз(а)




Мелкий пишет:
Читайте "Совершенный код" Макконнелла, затем "Рефакторинг" Фаулера.


За такие советы всегда спасибо. Включу в план.

Мелкий пишет:
Вот глобальная переменная. Гвоздями прибиты эта переменная к этой функции.

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

Мелкий пишет:
Банальное - надо продуктам с полем sale=1 поставить css-класс sale. Ваши действия? Переносить логику отображения в эту функцию?

Повторюсь, зависит от задачи, от условий на момент реализации проекта. Функция ориентирована на конкретный вывод в разных местах - включу туда, если раскладка такова, что функция ориентирована только на получение данных одной таблицы из разных блоков с разным форматированием - разметку буду варьировать на месте вызова.


-----
Сделать можно все. Главное одеть каску.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB