Добрых времен суток, есть таблица oc_color: Код (Text): +-----+-------+---------+---------------+ | id ~ | color | price | data_mod | +-----+-------+---------+---------------+ | 105 | red | 20.038 | 25.02. 2023| | 106 | gre | 19.045 | 25.02. 2023| | 107 | yel | 15.068 | 25.02. 2023| | 108 | red | 20.068 | 26.02. 2023| | 109 | gre | 18.045 | 26.02. 2023| | 110 | yel | 14.058 | 26.02. 2023| | 111 | red | 21.068 | 27.02. 2023| | 112 | gre | 14.045 | 27.02. 2023| | 113 | yel | 16.058 | 27.02. 2023| | хочется передать значение из одного model/1.php файла в другой controler/1.php через функцию первого. Первый файл model/1.php : PHP: class ModelExtensionDashboardChartColor extends Model { public function getTotal_per_red_ByMonth(date, str) { $data = array(); $data = $this->db->query("SELECT price FROM `oc_color` WHERE code='red' AND data_mod='". $date ."' "); return $data; } И второй файл controler/1.php : PHP: for ($i = -3; $i < 1; $i++) { $date = date('d.m.Y' ,strtotime ("$i days")); $result = $this->model_extension_dashboard_сhart_сolor->getTotal_per_red_ByMonth($date); } и хотелось бы увидеть последние 3 записи при вызове PHP: var_dump ($result) ; 20.038 : 20.068 : 21.068
А чем мне limit поможет, в таблице 1095 записей по моей выборке максимально мне нужно представить 365. И вообще, без указания лимита он должен был показать(исходя из цикла) все три значения , а у меня выводит одно значение из таблицы + ошибка, так как не идут все значения в присваивании из таблицы, сыпется josn ответ из контролера
Да все верно вы заметили таблицу указал для примера. мой запрос к данной таблице PHP: $data = $this->db->query("SELECT price FROM `oc_color` WHERE color='red' AND data_mod='". $date ."' "); /* здесь в функцию передаются из controler/1.php через цикл даты: 25.02.2023,26.02.2023,27.02.2023*/
Ну, так накапливайте результаты ф-ции, а не затирайте. Вообще более вменяемым является подход добавить ф-цию модели, которая бы делала выборку по диапазону дат. --- Добавлено --- У вас прямо в БД даты хранятся в «человеку понятном» виде? Или все же поле с датами имеет соотв. тип?
так в начале и было , но почему-то в цикле в модели не хотело передавать дату PHP: public function getTotal_per_red_ByMonth() { $data = array(); $date = date('d.m.Y'); for ($i = -3; $i < 1; $i++) { $date = date('d.m.Y' ,strtotime ("$i days")); $data=$this->db->query("SELECT price FROM `oc_color` WHERE color='red' AND data_mod='".$date."' order by id"); } // return $data; да заметил что так не работет return $data->row; // так норм, но цикл не передает дату , вернее получаю не три значения, а только одно } data_mod имеет тип varchar(10)
PHP: public function getTotal_per_red_ByMonth(): array { $dates = [date('d.m.Y')]; for ($i = -3; $i < 1; $i++) { $dates[] = date('d.m.Y', strtotime("$i days")); } $sql = "SELECT price FROM `oc_color` WHERE color='red' AND data_mod IN ('" . implode("', '", $dates) . "') order by id"; $sth = $this->db->query($sql,\PDO::FETCH_ASSOC); return $sth->fetchAll(); }
$this->db - это объект PDO или mysqli? Для PDO PHP: public function getTotal_per_red_ByMonth(): array { $dates = [date('d.m.Y')]; for ($i = -3; $i < 1; $i++) { $dates[] = date('d.m.Y', strtotime("$i days")); } $sql = "SELECT price FROM `oc_color` WHERE color='red' AND data_mod IN('" . implode("', '", $dates) . "') order by id"; $result = []; foreach ($this->db->query($sql,\PDO::FETCH_ASSOC) as $row) { $result[] = $row; } return $result; } Для mysqli PHP: public function getTotal_per_red_ByMonth(): array { $dates = [date('d.m.Y')]; for ($i = -3; $i < 1; $i++) { $dates[] = date('d.m.Y', strtotime("$i days")); } $sql = "SELECT price FROM `oc_color` WHERE color='red' AND data_mod IN('" . implode("', '", $dates) . "') order by id"; $result = []; if ($resultQuery = $this->db->query($sql)) { while ($row = $resultQuery->fetch_assoc()) { $result[] = $row; } $resultQuery->close(); } return $result; }
И так всем спасибо за помощь, но я к сожалению достаточно внятного ответа от miketomlin , поступил по своему и вроде решение! я выводя в модуле: PHP: public function getTotal_per_red_ByMonth($date) { $data = array(); $data = $this->db->query("SELECT price FROM `oc_color` WHERE color='red' AND data_mod='" . $this->db->escape($date) . "' order by id"); return $data->row; } все таки получил ответ в контролере PHP: $date = date('d.m.Y'); for ($i = -3; $i < 1; $i++) { $date = date('d.m.Y' ,strtotime ("$i days")); $periud[] = 3+$i; $json['results'][] = $this->model_extension_dashboard_chart_valute->getTotal_per_red_ByMonth($date); print_r($json['results']); и вроде все хорошо , получаю ответ : Array ( [0] => Array ( [price] => 20.038 ) [1] => Array ( [price] => 20.068 ) [2] => Array ( [price] => 21.068 ) ) но хотелось видеть в контролере: Array ( [0] => Array ( [0] => 20.038 ) [1] => Array ( [1] => 20.068 ) [2] => Array ( [2] => 21.068 ) ) Внимание вопрос, как от массива получить ответ выборки не [price] => 20.068 , а лишь 20.068 получить одномерный массив только со значениями без пункта price либо price заменить на индекс
Имхо запросы в цикле зло... Лучше в запросе сразу выбрать последние сколько надо... Без всяких циклов
Запросы в цикле, как и не соответствие типа в базе нужно переделывать. Если нужно будет сделать выборку за год будет 300 + запросов?
в моей таблице на каждый день по 3 строки и на 365 дней суммарно 1095 строк, и я делал запрос на 365 раз по три раза к удаленому серверу , и это не гуд! в результате я сделал один общий запрос к удаленному серверу и сформировал, таблицу в 1095 строк, каждый день мой cron добовляет в базу три новые строки, при этом удаляет первые архивные три строки, моя таблица всегда имеет 1095 строк ! я не вижу проблемы запросить данные из своей таблицы 365 раз или за месяц 30 запросов. но меня не устраивает вывод - выше я это отметил! у меня нет не соответствия в базе , у меня есть желание при вызове из таблицы из оного поля присвоить не его имя в качестве инекса ответа , а индекс от 0 до конца запроса я использовал конструкцию PHP: print_r array_values( ($json['results'])); ; но получил ответ в контролере Array ( [0] => Array ( [0] => 20.038 ) [1] => Array ( [0] => 20.068 ) [2] => Array ( [0] => 21.068 ) ) что расходиться с моей задачей выше --- Добавлено --- а как без цикла, подскажите выборку по двум полям на разный период: неделя , месяц, год? При этом индекс плавающий - сегодня таблица начинается с индекса 1, завтра с 4 , после с 7 далее с 10 ... и так далее --- Добавлено --- это интерестно, проверю ... и отпишусь
Удивительно, когда решение находишь сам !? Хоть и рекомендовали правильно, а всё равно сделал по своему и работает... Хоть и медленно) но работает!
Ёжики плакали, кололись - но лезли на кактусы (с) Все зависит от первоначальной постановки задачи... вы прям себя запрограммировали на неправильных подход ... что именно функцию которая 1 результат должна выдавать надо использовать.... N раз Если перефразировать задачу 1. Имеется ваша таблица 2. учитывая что - "в моей таблице на каждый день по 3 строки", следует, что по 1 записи red в день - не более 3. хотелось бы увидеть последние 3 записи то решается просто Код (Text): SELECT price FROM `oc_color` WHERE color='red' ORDER BY data_mod DESC LIMIT 0,3 если условия немного другие.... запрос просто меняется.. но принцип тот-же - получение данных одним запросом
Содержательно тут у вас беседы проходят. Буду писать для своей читалки именно запрос в цикле, наверное. Задача - накидать на страницу sitename.com/books/genres/ заголовков книг с куском текста и картинакми, для перехода на чтение и пагинатором.
а суп вы наверное будете вилкой есть? зачем делать запросы в цикле - когда можно и нужно делать это одним запросом?
Я тупанул, вы правы. Циклом у меня переменные в шаблон загоняться будут. Костяк такой будет: Один запрос в БД выдаст нам значение X, сколько данных грузить, для пагинатора и не только. Второй запрос - грузим данные из нескольких таблиц, с лимитом X. Далее циклом WHILE массив данных распихиваем в переменные, которые уже пойдут на шаблон фронтэнда. Я юзаю шаблонизатор от phpBB2 в силу его удобства.
РЕШИЛ приведением data_mod к типу DATE, далее откоректировал: экспорт базы -> блокнот -> regexp -> импорт в зад и далее имею в модели PHP: class ModelExtensionDashboardChartColor extends Model { public function getTotal_per_red_ByMonth() { date_default_timezone_set("Europe/Chisinau"); $date = date('Y-m-d'); $date_per_month = date('Y-m-d' ,strtotime ("-30 days")); $query =$this->db->query("SELECT price FROM oc_color WHERE data_mod BETWEEN '" . $date_per_month . "' AND '" . $date . "' AND color NOT IN ('yel','gre') order by data_mod "); foreach ($query->rows as $result) { $per_red_data[] = ( $result['price'] ); } return $per_red_data ; } и в контролере я наконец правильно получил значения, PHP: for ($i = -30; $i < 1; $i++) { $periud[] = 30+$i; } $results['red'] = $this->model_extension_dashboard_chart_color->getTotal_per_red_ByMonth(); $json['per_red'][] = array_combine($periud , $results['red'] ); foreach ($json['per_red'][0] as $key => $value) { $json['per_red']['data'][] = array($key, $value); } и всё прекрасно , но ! помогите избавится от дублей как переменную уложить в контролере , вижу как то так! Но не работает в запросе get??? PHP: $results[$color] = $this->model_extension_dashboard_chart_color->getTotal_per_" ' . $color . ' "_ByMonth(); $json['per_$color'][] = array_combine($periud , $results[$color] ); foreach ($json['per_$color'][0] as $key => $value) { $json['per_$color']['data'][] = array($key, $value);
Ой а чё я такого сделал: убрал циклы , в модели получил внятный один query запрос, всё четинько , а то что в зад развернул массив int в date 1095 строк, так я регэкспамии 5000 гостинец по три выборки из Гугл, качественных фотЭ выводил и тоже потом результат в базу в зад отправлял, они обиделись один раз но! Ночью они спали) всего то 2 гига))) чё им жалко