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
Форумы портала PHP.SU :: Версия для печати :: Свести две функции в один запрос
Форумы портала PHP.SU » » Вопросы новичков » Свести две функции в один запрос

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

1. Lolya - 19 Мая, 2018 - 12:42:34 - перейти к сообщению
Возможно свести две функции в один запрос? Выборка у них одинаковая идет, но для разных таблиц.

PHP:
скопировать код в буфер обмена
  1. function genrelist() {
  2.     $ret = array();
  3.     $res = sql_query('SELECT id, name, image FROM categories ORDER BY sort ASC');
  4.     while ($row = mysql_fetch_array($res))
  5.         $ret[] = $row;
  6.     return $ret;
  7. }
  8.  
  9. function incatlist() {
  10.     $rek = array();
  11.     $res = sql_query('SELECT id, name, image FROM incategories ORDER BY sort ASC');
  12.     while ($row = mysql_fetch_array($res))
  13.         $rek[] = $row;
  14.     return $rek;
  15. }


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

Возможно ли объединение? Растерялся
2. Строитель - 20 Мая, 2018 - 11:12:19 - перейти к сообщению
Lolya, у вас ведь по сути меняется только название таблицы, из которой идёт выборка? Тогда можно описать всего одну функцию, добавив в сигнатуру один аргумент - в этот аргумент будет передаваться текущее название таблицы. В результате на выходе вы получите массив значений выборки из нескольких таблиц. Пример:
Спойлер (Отобразить)

(Добавление)
Lolya пишет:
таких еще будет 4 одинаковых
Добавьте остальные названия таблиц в массив с названиями таблиц.
3. Lolya - 21 Мая, 2018 - 20:15:19 - перейти к сообщению
Строитель пишет:
Lolya, у вас ведь по сути меняется только название таблицы, из которой идёт выборка? Тогда можно описать всего одну функцию, добавив в сигнатуру один аргумент - в этот аргумент будет передаваться текущее название таблицы. В результате на выходе вы получите массив значений выборки из нескольких таблиц. Пример:
Спойлер (Отобразить)

(Добавление)
Lolya пишет:
таких еще будет 4 одинаковых
Добавьте остальные названия таблиц в массив с названиями таблиц.


Спасибо. А теперь вопрос дополнительный:

как теперь расписывать функции для запроса? Растерялся
4. Строитель - 21 Мая, 2018 - 20:41:39 - перейти к сообщению
Lolya пишет:
как теперь расписывать функции для запроса?
Если запросы к БД одинаковые (как выше было написано), то ничего больше расписывать не нужно. Всё что надо сделать, это заполнить массив $table_names названиями таблиц, из которых будет выборка, по такому принципу:
PHP:
скопировать код в буфер обмена
  1. // Массив с названиями таблиц
  2. $table_names = ['categories', 'incategories'/*и т.д. через запятую*/];
5. Lolya - 21 Мая, 2018 - 21:09:34 - перейти к сообщению
Строитель пишет:
Lolya пишет:
как теперь расписывать функции для запроса?
Если запросы к БД одинаковые (как выше было написано), то ничего больше расписывать не нужно. Всё что надо сделать, это заполнить массив $table_names названиями таблиц, из которых будет выборка, по такому принципу:
PHP:
скопировать код в буфер обмена
  1. // Массив с названиями таблиц
  2. $table_names = ['categories', 'incategories'/*и т.д. через запятую*/];


Вот что пишет когда заменил на выше код:
Цитата:
syntax error, unexpected '[' in


PHP:
скопировать код в буфер обмена
  1. $result = [];
6. Строитель - 21 Мая, 2018 - 22:00:19 - перейти к сообщению
Lolya пишет:
syntax error, unexpected '['
Поднимите версию вашего PHP хотя бы до версии 5.4

Ну или заменяйте сокращённые объявления массивов $result = []; на $result = array();

А так же замените это $table_names = ['categories', 'incategories']; на этот вариант $table_names = array('categories', 'incategories');
7. Lolya - 21 Мая, 2018 - 22:35:44 - перейти к сообщению
Строитель пишет:
$table_names = array(


Большое спасибо. Работает в таком виде (полный код):
PHP:
скопировать код в буфер обмена
  1. $table = array('categories', 'incategories');
  2. function get_list($table) {
  3.     $result = array();
  4.     $res = sql_query("SELECT id, name, image FROM $table ORDER BY sort ASC");
  5.     while ($row = mysql_fetch_array($res))
  6.                 $ret[] = $row;
  7.         return $ret;
  8. }


Вывод на сранице взял так:
PHP:
скопировать код в буфер обмена
  1. $cats = get_list(categories);
  2. $incats = get_list(incategories);


Скорость *вроде как быстрее стала, но один черт запросов два на страницу как и было. Огорчение

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

 

Powered by ExBB FM 1.0 RC1