За последние 24 часа нас посетили 11089 программистов и 835 роботов. Сейчас ищут 389 программистов ...

Подсчет значений в массиве из БД

Тема в разделе "PHP для новичков", создана пользователем Dmit, 4 авг 2021.

  1. Dmit

    Dmit Новичок

    С нами с:
    21 дек 2018
    Сообщения:
    16
    Симпатии:
    0
    Добрый день.
    Итак, имеется таблица БД MySQL куда записываются данные о количестве регистраций каждого работника на рабочем месте.
    Таблица
    user_id | num_reg
    33 2
    34 2
    35 2
    36 2
    37 1
    38 2
    39 2
    Задача - посчитать количество регистраций со значением "2", которые идут подряд, т.е. должно получиться значение 4,
    Код (Text):
    1.  
    2. //Подключение к БД
    3. $user='root';
    4. $pass='pass;';
    5. $dbh = new PDO('mysql:host=localhost;dbname=database', $user, $pass);
    6.  
    7. //Запрос к БД
    8. $sth = $dbh->prepare("SELECT `num_reg` FROM `table`");
    9. $sth->execute();
    10. $data = $sth->fetchAll(PDO::FETCH_ASSOC);
    11.  
    12. //Попытка посчитать количество в цикле
    13. $i = 0;
    14. $n = 2;
    15. foreach ($data as $data) {
    16.    if($data != $n) {
    17.       break;
    18.    }
    19.    else {
    20.        $i++;
    21.         }
    22.     }
    23.     echo $i;
    Но, в результате выводится "0".:(

    Дополнение. Если в если в запрос к БД добавить например "WHERE USER_ID = 33" и в переменную $data выводить не все значения (fetchAll), а одно (fetch), то считает правильно, но, соответственно, только одно значение.
    Где то недопонимаю с массивом...
     
    #1 Dmit, 4 авг 2021
    Последнее редактирование: 4 авг 2021
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    2.966
    Симпатии:
    570
    Адрес:
    Татарстан
    имхо сразу какая то неправильная постановка задачи, вернее исходных данных таких как кол-во регистраций на рабочем месте...

    понятиями "идут подряд" итд как правило в БД не оперируют. Вы объясните тайный смысл по человечески? Зачем это?

    в вашем же примере например есть и другое кол-во регистраций подряд с 2 - это 38,39, почему оно не подходит?
     
  3. Androbim

    Androbim Новичок

    С нами с:
    17 июн 2021
    Сообщения:
    4
    Симпатии:
    0
    Код (Text):
    1. foreach ($data as $data)
    а так можно?

    Далее не читал.
     
  4. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.047
    Симпатии:
    214
    1. Почему именно PDO?
    2. Почему именно подготовленный запрос?
    3. Просматривалась ли выдача прежде, чем к ней применялись какие-то действия?

    Одни вопросы.
     
  5. Taktreba

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

    С нами с:
    11 янв 2017
    Сообщения:
    525
    Симпатии:
    124
    @Dmit или переформулируй задачу, что бы можно было правильно составить sql запрос, или выведи все сразу а в php уже в foreach делай что тебе нужно, так как замечание "в вашем же примере например есть и другое кол-во регистраций подряд с 2 - это 38,39, почему оно не подходит?" очень правильное.
     
  6. Dmit

    Dmit Новичок

    С нами с:
    21 дек 2018
    Сообщения:
    16
    Симпатии:
    0
    Отвечу сразу всем.
    Оперируют и еще как! Вы, видимо, никогда не работали на крупном предприятии. Там еще и не такие понятия бывают. Смысл не могу объяснить, т.к. мне начальство не озвучило в чем смысл и цель задачи).
    Потому что значение 37 - 1, соответственно прерывает серию.
    Прикинь, можно:). Не знаю как в РНР, я в нем не крупный спец, а в других языках это называется переопределение переменной, что бы не плодить лишние сущности.
    1. Потому что таковы требования безопасности запросов к БД на РНР, разве нет?
    2. Таковы рекомендации PDO в официальной документации.
    И в конце выкладываю вполне рабочий код, который написал покопавшись в документации. Может кому пригодится). Спасибо за помощь. Отличное у вас сообщество РНР-программистов:D.
    Рабочий код
    Код (Text):
    1. <?php
    2. $sth = $dbh->prepare("SELECT * FROM `table_name`");
    3. $sth->execute();
    4. $data = $sth->fetchAll(PDO::FETCH_ASSOC);
    5. $i = 0;
    6. $n = 2;
    7. foreach($data as $data) {
    8.         if($data['num_reg'] != $n) {
    9.             break;
    10.         }
    11.         else {
    12.             $i++;
    13.         }
    14.     }
    15.     echo $i;
    16. ?>
     
  7. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.047
    Симпатии:
    214
    Ну-да, ну-да.
    Нет. Где вы все это всё-время вычитываете?
    Какой-то мега-гуру на первых позициях в поиске Гугла всплывает?
    Зачем использовать универсальный инструмент, если есть простой, доступный, но специальный?
    Вы работаете сразу с несколькими базами данных от разных поставщиков?
    Только в этом случае это как-то оправдано.
     
  8. Dmit

    Dmit Новичок

    С нами с:
    21 дек 2018
    Сообщения:
    16
    Симпатии:
    0
    Ну тут не знаю. Что прочитал, то и говорю). Не занимаюсь РНР профессионально, потому тут ничего сказать не могу. Кстати, как-то спрашивал что-то по запросу к БД, где запрос был написан без PDO, так меня местные гуру закидали какашками)
     
  9. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.047
    Симпатии:
    214
    Это всё объясняет.
    Не расстраивайтесь. Спорить с такими тоже не надо.
    Одержимость тоже можно ловко использовать.
     
  10. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    2.966
    Симпатии:
    570
    Адрес:
    Татарстан
    Крупное, не крупное .. какая разница. Если имеется ввиду - чем крупнее - тем больше бреда - то да, слава богу не работал.

    Теперь по существу, почему такой вопросы возникли...
    1) у вас обычная выборка - без указания сортировки, в произвольном случае БД имеет право отдавать в произвольном порядке, да, чаще всего будет отдавать с сортировкой по id - но это не факт. То есть два одинаковых запроса могут вам отдать данные в разном порядке - если не указана явно сортировка. это в любой БД, на любом предприятии.
    2) Ладно. примем что п 1 не знаем и нам БД всегда в нужном нам порядке отдает. Тогда в формулировке задачи должно быть уточнение - найти длину первой серии данных с такими-то условиями
    3) $data AS $data - да можно, но как правило не нужно, для той-же удобочитаемости, и исключения ошибок, не дай бог потом в самом же цикле захотите этой переменной что-то присваивать... экономия на выделении памяти под переменные - давно в прошлом.
    4) PDO/не PDO на самом деле не так уж тут и важно, для вас это просто инструмент получения данных из БД
    5) делать то что "начальство" сказала - не всегда гуд, надо попытаться выяснить саму суть задачи, в вашем случае в 99.9% есть более правильное, красивое решение, и скорее всего средствами SQL ... ну и если все же учесть п 1., то в один прекрасный день у вас все пойдет не по плану)))

    то что вы иронизируете над сообществом - ваше право, но я увидел у участников именно желание понять суть задачи, для грамотного решения вопроса...
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.602
    Симпатии:
    1.102
    Адрес:
    там-сям
    можно найти примеры по контексту "sql streak length"
    что важно:
    - сформулировать задачу не подразумевая свой собственный путь решения ("массив из бд")
    - в запросе явно указать сортировку. не полагаться на некий "порядок по умолчанию" - его нет
    - стараться доверить обработку множеств серверу БД, а не вытягивать все данные на сторону PHP - так будет неэффективно, возможно даже будет валиться по нехватке памяти
    --- Добавлено ---
    задача сведется к написанию SQL запроса, если она будет нормально сформулирована.
     
    don.bidon нравится это.
  12. Evgenii_web

    Evgenii_web Новичок

    С нами с:
    7 май 2021
    Сообщения:
    50
    Симпатии:
    0
    сегодня столкнулся с этой проблемой, решение = ввести переменную новую массива, в цикле запихнуть туда массив базы, получаем пронумерованный двухуровневый массив.
    если не понятно могу дать свой код (ну это мое решение было возможно и как то по другому решается, я же новичок) Тем более у меня не большие региональные двухуровневые массивы, а так нужно понимать можно упереться в память. Хотя у меня не подходит к Вашей теме.
     
    #12 Evgenii_web, 13 авг 2021
    Последнее редактирование: 13 авг 2021
  13. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.128
    Симпатии:
    1.638
    Да, столкнулся с этим при переходе с MySQL на PostgreSQL. Если MySQL отдаёт в порядке добавления при отсутствии сортировки, то PostgreSQL - по времени последнего обновления. И всё туда/сюда скачет сразу
     
    don.bidon нравится это.