За последние 24 часа нас посетили 17578 программистов и 1865 роботов. Сейчас ищут 1705 программистов ...

через функцию помогите с правильным запросом к базе

Тема в разделе "PHP и базы данных", создана пользователем aliensgroup, 3 мар 2023.

Метки:
  1. aliensgroup

    aliensgroup Новичок

    С нами с:
    28 май 2022
    Сообщения:
    33
    Симпатии:
    0
    Добрых времен суток,
    есть таблица oc_color:
    Код (Text):
    1.  
    2. +-----+-------+---------+---------------+
    3. |  id ~ | color |  price   |  data_mod    |
    4. +-----+-------+---------+---------------+
    5. | 105 | red    |  20.038 |  25.02. 2023|
    6. | 106 | gre    |  19.045 |  25.02. 2023|
    7. | 107 | yel    |  15.068 |  25.02. 2023|
    8. | 108 | red    |  20.068 |  26.02. 2023|
    9. | 109 | gre    |  18.045 |  26.02. 2023|
    10. | 110 | yel    |  14.058 |  26.02. 2023|
    11. | 111 | red    |  21.068 |  27.02. 2023|
    12. | 112 | gre    |  14.045 |  27.02. 2023|
    13. | 113 | yel    |  16.058 |  27.02. 2023|
    14. |
    хочется передать значение из одного model/1.php файла в другой controler/1.php через функцию первого.
    Первый файл model/1.php :
    PHP:
    1. class ModelExtensionDashboardChartColor extends Model {
    2.  
    3.     public function getTotal_per_red_ByMonth(date, str) {
    4.     $data = array();
    5.          
    6.     $data = $this->db->query("SELECT price FROM `oc_color` WHERE code='red' AND data_mod='". $date ."' ");
    7.    
    8.     return $data;
    9.   }
    И второй файл controler/1.php :

    PHP:
    1. for ($i = -3; $i < 1; $i++) {
    2.       $date = date('d.m.Y' ,strtotime ("$i days"));
    3. $result = $this->model_extension_dashboard_сhart_сolor->getTotal_per_red_ByMonth($date);
    4. }
    и хотелось бы увидеть последние 3 записи при вызове
    PHP:
    1. var_dump ($result) ;
    20.038 : 20.068 : 21.068
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.850
    Симпатии:
    745
    Адрес:
    Татарстан
    Про limit в запросах слышал?
     
    aliensgroup нравится это.
  3. aliensgroup

    aliensgroup Новичок

    С нами с:
    28 май 2022
    Сообщения:
    33
    Симпатии:
    0
    А чем мне limit поможет, в таблице 1095 записей по моей выборке максимально мне нужно представить 365. И вообще, без указания лимита он должен был показать(исходя из цикла) все три значения , а у меня выводит одно значение из таблицы + ошибка, так как не идут все значения в присваивании из таблицы, сыпется josn ответ из контролера
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.829
    Симпатии:
    651
    --- Добавлено ---
    И даты разные у red, а у вас в запросе
     
  5. aliensgroup

    aliensgroup Новичок

    С нами с:
    28 май 2022
    Сообщения:
    33
    Симпатии:
    0
    Да все верно вы заметили таблицу указал для примера. мой запрос к данной таблице
    PHP:
    1.     $data = $this->db->query("SELECT price FROM `oc_color` WHERE color='red' AND data_mod='". $date ."' ");
    2. /* здесь в функцию передаются из controler/1.php через цикл даты:
    3. 25.02.2023,26.02.2023,27.02.2023*/
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.829
    Симпатии:
    651
    Ну, так накапливайте результаты ф-ции, а не затирайте.

    Вообще более вменяемым является подход добавить ф-цию модели, которая бы делала выборку по диапазону дат.
    --- Добавлено ---
    У вас прямо в БД даты хранятся в «человеку понятном» виде? Или все же поле с датами имеет соотв. тип?
     
  7. aliensgroup

    aliensgroup Новичок

    С нами с:
    28 май 2022
    Сообщения:
    33
    Симпатии:
    0
    так в начале и было , но почему-то в цикле в модели не хотело передавать дату
    PHP:
    1. public function getTotal_per_red_ByMonth() {
    2. $data = array();
    3. $date = date('d.m.Y');
    4.         for ($i = -3; $i < 1; $i++) {
    5.             $date = date('d.m.Y' ,strtotime ("$i days"));
    6. $data=$this->db->query("SELECT price FROM `oc_color` WHERE color='red' AND data_mod='".$date."' order by id");
    7. }
    8. // return $data; да заметил что так не работет
    9. return $data->row; // так норм, но цикл не передает дату , вернее получаю не три значения, а только одно
    10. }
    data_mod имеет тип varchar(10)
     
  8. Aleksandr.B

    Aleksandr.B Новичок

    С нами с:
    2 фев 2023
    Сообщения:
    158
    Симпатии:
    41
    Адрес:
    Барнаул
    PHP:
    1. public function getTotal_per_red_ByMonth(): array
    2. {
    3.     $dates  = [date('d.m.Y')];
    4.  
    5.     for ($i = -3; $i < 1; $i++) {
    6.         $dates[] = date('d.m.Y', strtotime("$i days"));
    7.     }
    8.  
    9.     $sql = "SELECT price FROM `oc_color` WHERE color='red' AND data_mod IN ('" . implode("', '", $dates) . "') order by id";
    10.  
    11.     $sth = $this->db->query($sql,\PDO::FETCH_ASSOC);
    12.  
    13.     return $sth->fetchAll();
    14. }
     
    #8 Aleksandr.B, 4 мар 2023
    Последнее редактирование: 4 мар 2023
  9. aliensgroup

    aliensgroup Новичок

    С нами с:
    28 май 2022
    Сообщения:
    33
    Симпатии:
    0
    спасибо, очн интересно для изучения, но! ошибка
     

    Вложения:

    • fatality.png
      fatality.png
      Размер файла:
      2,6 КБ
      Просмотров:
      4
    • fatality.png
      fatality.png
      Размер файла:
      2,6 КБ
      Просмотров:
      3
  10. Aleksandr.B

    Aleksandr.B Новичок

    С нами с:
    2 фев 2023
    Сообщения:
    158
    Симпатии:
    41
    Адрес:
    Барнаул
    $this->db - это объект PDO или mysqli?

    Для PDO
    PHP:
    1. public function getTotal_per_red_ByMonth(): array
    2. {
    3.     $dates  = [date('d.m.Y')];
    4.  
    5.     for ($i = -3; $i < 1; $i++) {
    6.         $dates[] = date('d.m.Y', strtotime("$i days"));
    7.     }
    8.  
    9.     $sql = "SELECT price FROM `oc_color` WHERE color='red' AND data_mod IN('" . implode("', '", $dates) . "') order by id";
    10.  
    11.     $result = [];
    12.  
    13.     foreach ($this->db->query($sql,\PDO::FETCH_ASSOC) as $row) {
    14.         $result[] = $row;
    15.     }
    16.  
    17.     return $result;
    18. }
    Для mysqli
    PHP:
    1. public function getTotal_per_red_ByMonth(): array
    2. {
    3.     $dates = [date('d.m.Y')];
    4.  
    5.     for ($i = -3; $i < 1; $i++) {
    6.         $dates[] = date('d.m.Y', strtotime("$i days"));
    7.     }
    8.  
    9.     $sql = "SELECT price FROM `oc_color` WHERE color='red' AND data_mod IN('" . implode("', '", $dates) . "') order by id";
    10.  
    11.     $result = [];
    12.  
    13.     if ($resultQuery = $this->db->query($sql)) {
    14.  
    15.         while ($row = $resultQuery->fetch_assoc()) {
    16.             $result[] = $row;
    17.         }
    18.  
    19.         $resultQuery->close();
    20.     }
    21.  
    22.     return $result;
    23. }
     
    #10 Aleksandr.B, 4 мар 2023
    Последнее редактирование: 4 мар 2023
    aliensgroup нравится это.
  11. aliensgroup

    aliensgroup Новичок

    С нами с:
    28 май 2022
    Сообщения:
    33
    Симпатии:
    0
    И так всем спасибо за помощь, но я к сожалению достаточно внятного ответа от miketomlin , поступил по своему и вроде решение! я
    выводя в модуле:
    PHP:
    1. public function getTotal_per_red_ByMonth($date) {
    2.     $data = array();
    3.      
    4.     $data = $this->db->query("SELECT price FROM `oc_color` WHERE color='red' AND data_mod='" . $this->db->escape($date) . "' order by id");
    5.  
    6.     return $data->row;
    7.   }
    все таки получил ответ в контролере
    PHP:
    1. $date = date('d.m.Y');
    2. for ($i = -3; $i < 1; $i++) {
    3.                $date = date('d.m.Y' ,strtotime ("$i days"));
    4.                $periud[] = 3+$i;
    5.             $json['results'][] = $this->model_extension_dashboard_chart_valute->getTotal_per_red_ByMonth($date);
    6.  
    7. 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 заменить на индекс
     
    #11 aliensgroup, 4 мар 2023
    Последнее редактирование: 4 мар 2023
  12. antoniii

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

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Да ты в начальники метишь...
     
  13. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.850
    Симпатии:
    745
    Адрес:
    Татарстан
    Имхо запросы в цикле зло...
    Лучше в запросе сразу выбрать последние сколько надо... Без всяких циклов
     
    aliensgroup нравится это.
  14. aliensgroup

    aliensgroup Новичок

    С нами с:
    28 май 2022
    Сообщения:
    33
    Симпатии:
    0
    очень содержательно, главное какое элегантное решение. Вас в эксперты пора записывать)))
     
  15. Aleksandr.B

    Aleksandr.B Новичок

    С нами с:
    2 фев 2023
    Сообщения:
    158
    Симпатии:
    41
    Адрес:
    Барнаул
    Запросы в цикле, как и не соответствие типа в базе нужно переделывать.
    Если нужно будет сделать выборку за год будет 300 + запросов?
     
  16. aliensgroup

    aliensgroup Новичок

    С нами с:
    28 май 2022
    Сообщения:
    33
    Симпатии:
    0
    в моей таблице на каждый день по 3 строки и на 365 дней суммарно 1095 строк, и я делал запрос на 365 раз по три раза к удаленому серверу , и это не гуд! в результате я сделал один общий запрос к удаленному серверу и сформировал, таблицу в 1095 строк, каждый день мой cron добовляет в базу три новые строки, при этом удаляет первые архивные три строки, моя таблица всегда имеет 1095 строк !
    я не вижу проблемы запросить данные из своей таблицы 365 раз или за месяц 30 запросов. но меня не устраивает вывод - выше я это отметил!

    у меня нет не соответствия в базе , у меня есть желание при вызове из таблицы из оного поля присвоить не его имя в качестве инекса ответа , а индекс от 0 до конца запроса
    я использовал конструкцию
    PHP:
    1. ($json['results']));
    2. ;
    но получил ответ в контролере
    Array
    (
    [0] => Array
    (
    [0] => 20.038
    )

    [1] => Array
    (
    [0] => 20.068
    )

    [2] => Array
    (
    [0] => 21.068
    )
    )
    что расходиться с моей задачей выше
    --- Добавлено ---
    а как без цикла, подскажите выборку по двум полям на разный период: неделя , месяц, год?
    При этом индекс плавающий - сегодня таблица начинается с индекса 1, завтра с 4 , после с 7 далее с 10 ... и так далее
    --- Добавлено ---
    это интерестно, проверю ... и отпишусь
     
  17. aliensgroup

    aliensgroup Новичок

    С нами с:
    28 май 2022
    Сообщения:
    33
    Симпатии:
    0
    Удивительно, когда решение находишь сам !? Хоть и рекомендовали правильно, а всё равно сделал по своему и работает... Хоть и медленно) но работает!
     
  18. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.850
    Симпатии:
    745
    Адрес:
    Татарстан
    Ёжики плакали, кололись - но лезли на кактусы (с)

    Все зависит от первоначальной постановки задачи... вы прям себя запрограммировали на неправильных подход ... что именно функцию которая 1 результат должна выдавать надо использовать.... N раз

    Если перефразировать задачу

    1. Имеется ваша таблица
    2. учитывая что - "в моей таблице на каждый день по 3 строки", следует, что по 1 записи red в день - не более
    3. хотелось бы увидеть последние 3 записи

    то решается просто
    Код (Text):
    1. SELECT price FROM `oc_color` WHERE color='red' ORDER BY data_mod DESC LIMIT 0,3
    если условия немного другие.... запрос просто меняется.. но принцип тот-же - получение данных одним запросом
     
    aliensgroup нравится это.
  19. JohnWarner

    JohnWarner Новичок

    С нами с:
    16 ноя 2022
    Сообщения:
    18
    Симпатии:
    1
    Содержательно тут у вас беседы проходят.
    Буду писать для своей читалки именно запрос в цикле, наверное.
    Задача - накидать на страницу sitename.com/books/genres/ заголовков книг с куском текста и картинакми, для перехода на чтение и пагинатором.
     
  20. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.850
    Симпатии:
    745
    Адрес:
    Татарстан
    а суп вы наверное будете вилкой есть?
    зачем делать запросы в цикле - когда можно и нужно делать это одним запросом?
     
  21. JohnWarner

    JohnWarner Новичок

    С нами с:
    16 ноя 2022
    Сообщения:
    18
    Симпатии:
    1
    Я тупанул, вы правы.
    Циклом у меня переменные в шаблон загоняться будут.
    Костяк такой будет:
    Один запрос в БД выдаст нам значение X, сколько данных грузить, для пагинатора и не только.
    Второй запрос - грузим данные из нескольких таблиц, с лимитом X.
    Далее циклом WHILE массив данных распихиваем в переменные, которые уже пойдут на шаблон фронтэнда.
    Я юзаю шаблонизатор от phpBB2 в силу его удобства.
     
  22. aliensgroup

    aliensgroup Новичок

    С нами с:
    28 май 2022
    Сообщения:
    33
    Симпатии:
    0
    РЕШИЛ приведением data_mod к типу DATE, далее откоректировал: экспорт базы -> блокнот -> regexp -> импорт в зад

    и далее имею в модели
    PHP:
    1. class ModelExtensionDashboardChartColor extends Model {
    2.  
    3.  
    4.     public function getTotal_per_red_ByMonth() {
    5.         date_default_timezone_set("Europe/Chisinau");
    6.         $date = date('Y-m-d');
    7.         $date_per_month = date('Y-m-d' ,strtotime ("-30 days"));
    8.       $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 ");
    9.     foreach ($query->rows as $result) {
    10.             $per_red_data[] = (
    11.             $result['price']
    12.             );
    13.         }
    14.         return $per_red_data ;
    15.     }
    16.    
    и в контролере я наконец правильно получил значения,
    PHP:
    1.  for ($i = -30; $i < 1; $i++) {
    2.             $periud[] = 30+$i;
    3.         }
    4.  
    5.     $results['red'] = $this->model_extension_dashboard_chart_color->getTotal_per_red_ByMonth();
    6.     $json['per_red'][] = array_combine($periud  , $results['red'] );
    7.             foreach ($json['per_red'][0] as $key => $value) {
    8.                     $json['per_red']['data'][] = array($key, $value);
    9.             }
    и всё прекрасно , но ! помогите избавится от дублей как переменную уложить в контролере , вижу как то так!
    Но не работает в запросе get???
    PHP:
    1. $results[$color] = $this->model_extension_dashboard_chart_color->getTotal_per_" ' . $color . ' "_ByMonth();
    2.     $json['per_$color'][] = array_combine($periud  , $results[$color] );
    3.             foreach ($json['per_$color'][0] as $key => $value) {
    4.                     $json['per_$color']['data'][] = array($key, $value);
     
    #22 aliensgroup, 7 мар 2023
    Последнее редактирование: 7 мар 2023
  23. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.850
    Симпатии:
    745
    Адрес:
    Татарстан
    Именно так и продолжаете делать.. ))) помогать в этом не буду
     
  24. aliensgroup

    aliensgroup Новичок

    С нами с:
    28 май 2022
    Сообщения:
    33
    Симпатии:
    0
    Ой а чё я такого сделал: убрал циклы , в модели получил внятный один query запрос, всё четинько , а то что в зад развернул массив int в date 1095 строк, так я регэкспамии 5000 гостинец по три выборки из Гугл, качественных фотЭ выводил и тоже потом результат в базу в зад отправлял, они обиделись один раз но! Ночью они спали) всего то 2 гига))) чё им жалко
     
    #24 aliensgroup, 7 мар 2023
    Последнее редактирование: 7 мар 2023