Dmit
Добрый день.
Итак, имеется таблица БД MySQL куда записываются данные о количестве регистраций каждого работника на рабочем месте.
Таблица
user_id | num_reg
33 2
34 2
35 2
36 2
37 1
38 2
39 2
Задача — посчитать количество регистраций со значением «2», которые идут подряд, т.е. должно получиться значение 4,Код (Text):
//Подключение к БД $user=»root»; $pass=»pass;»; $dbh = new PDO(‘mysql:host=localhost;dbname=database’, $user, $pass); //Запрос к БД $sth = $dbh->prepare(«SELECT `num_reg` FROM `table`»); $sth->execute(); $data = $sth->fetchAll(PDO::FETCH_ASSOC); //Попытка посчитать количество в цикле $i = 0; $n = 2; foreach ($data as $data) { if($data != $n) { break; } else { $i++; } } echo $i;Но, в результате выводится «0».
Дополнение. Если в если в запрос к БД добавить например «WHERE USER_ID = 33» и в переменную $data выводить не все значения (fetchAll), а одно (fetch), то считает правильно, но, соответственно, только одно значение.
Где то недопонимаю с массивом…
ADSoft
имхо сразу какая то неправильная постановка задачи, вернее исходных данных таких как кол-во регистраций на рабочем месте…
понятиями «идут подряд» итд как правило в БД не оперируют. Вы объясните тайный смысл по человечески? Зачем это?
в вашем же примере например есть и другое кол-во регистраций подряд с 2 — это 38,39, почему оно не подходит?
Androbim
Код (Text):
foreach ($data as $data)а так можно?
Далее не читал.
Drunkenmunky
1. Почему именно PDO?
2. Почему именно подготовленный запрос?
3. Просматривалась ли выдача прежде, чем к ней применялись какие-то действия?Одни вопросы.
Taktreba
@Dmit или переформулируй задачу, что бы можно было правильно составить sql запрос, или выведи все сразу а в php уже в foreach делай что тебе нужно, так как замечание «в вашем же примере например есть и другое кол-во регистраций подряд с 2 — это 38,39, почему оно не подходит?» очень правильное.
Dmit
Отвечу сразу всем.
Оперируют и еще как! Вы, видимо, никогда не работали на крупном предприятии. Там еще и не такие понятия бывают. Смысл не могу объяснить, т.к. мне начальство не озвучило в чем смысл и цель задачи).
Потому что значение 37 — 1, соответственно прерывает серию.
Прикинь, можно. Не знаю как в РНР, я в нем не крупный спец, а в других языках это называется переопределение переменной, что бы не плодить лишние сущности.
1. Потому что таковы требования безопасности запросов к БД на РНР, разве нет?
2. Таковы рекомендации PDO в официальной документации.
И в конце выкладываю вполне рабочий код, который написал покопавшись в документации. Может кому пригодится). Спасибо за помощь. Отличное у вас сообщество РНР-программистов.
Рабочий кодКод (Text):
<?php $sth = $dbh->prepare(«SELECT * FROM `table_name`»); $sth->execute(); $data = $sth->fetchAll(PDO::FETCH_ASSOC); $i = 0; $n = 2; foreach($data as $data) { if($data[‘num_reg’] != $n) { break; } else { $i++; } } echo $i; ?>
Drunkenmunky
Ну-да, ну-да.
Нет. Где вы все это всё-время вычитываете?
Какой-то мега-гуру на первых позициях в поиске Гугла всплывает?
Зачем использовать универсальный инструмент, если есть простой, доступный, но специальный?
Вы работаете сразу с несколькими базами данных от разных поставщиков?
Только в этом случае это как-то оправдано.
Dmit
Ну тут не знаю. Что прочитал, то и говорю). Не занимаюсь РНР профессионально, потому тут ничего сказать не могу. Кстати, как-то спрашивал что-то по запросу к БД, где запрос был написан без PDO, так меня местные гуру закидали какашками)
Drunkenmunky
Это всё объясняет.
Не расстраивайтесь. Спорить с такими тоже не надо.
Одержимость тоже можно ловко использовать.
ADSoft
Крупное, не крупное .. какая разница. Если имеется ввиду — чем крупнее — тем больше бреда — то да, слава богу не работал.
Теперь по существу, почему такой вопросы возникли…
1) у вас обычная выборка — без указания сортировки, в произвольном случае БД имеет право отдавать в произвольном порядке, да, чаще всего будет отдавать с сортировкой по id — но это не факт. То есть два одинаковых запроса могут вам отдать данные в разном порядке — если не указана явно сортировка. это в любой БД, на любом предприятии.
2) Ладно. примем что п 1 не знаем и нам БД всегда в нужном нам порядке отдает. Тогда в формулировке задачи должно быть уточнение — найти длину первой серии данных с такими-то условиями
3) $data AS $data — да можно, но как правило не нужно, для той-же удобочитаемости, и исключения ошибок, не дай бог потом в самом же цикле захотите этой переменной что-то присваивать… экономия на выделении памяти под переменные — давно в прошлом.
4) PDO/не PDO на самом деле не так уж тут и важно, для вас это просто инструмент получения данных из БД
5) делать то что «начальство» сказала — не всегда гуд, надо попытаться выяснить саму суть задачи, в вашем случае в 99.9% есть более правильное, красивое решение, и скорее всего средствами SQL … ну и если все же учесть п 1., то в один прекрасный день у вас все пойдет не по плану)))то что вы иронизируете над сообществом — ваше право, но я увидел у участников именно желание понять суть задачи, для грамотного решения вопроса…
artoodetoo
можно найти примеры по контексту «sql streak length«
что важно:
— сформулировать задачу не подразумевая свой собственный путь решения («массив из бд»)
— в запросе явно указать сортировку. не полагаться на некий «порядок по умолчанию» — его нет
— стараться доверить обработку множеств серверу БД, а не вытягивать все данные на сторону PHP — так будет неэффективно, возможно даже будет валиться по нехватке памяти
— Добавлено —
задача сведется к написанию SQL запроса, если она будет нормально сформулирована.
Evgenii_web
сегодня столкнулся с этой проблемой, решение = ввести переменную новую массива, в цикле запихнуть туда массив базы, получаем пронумерованный двухуровневый массив.
если не понятно могу дать свой код (ну это мое решение было возможно и как то по другому решается, я же новичок) Тем более у меня не большие региональные двухуровневые массивы, а так нужно понимать можно упереться в память. Хотя у меня не подходит к Вашей теме.
mkramer
Да, столкнулся с этим при переходе с MySQL на PostgreSQL. Если MySQL отдаёт в порядке добавления при отсутствии сортировки, то PostgreSQL — по времени последнего обновления. И всё туда/сюда скачет сразу