Добрый день. Итак, имеется таблица БД 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), то считает правильно, но, соответственно, только одно значение. Где то недопонимаю с массивом...
имхо сразу какая то неправильная постановка задачи, вернее исходных данных таких как кол-во регистраций на рабочем месте... понятиями "идут подряд" итд как правило в БД не оперируют. Вы объясните тайный смысл по человечески? Зачем это? в вашем же примере например есть и другое кол-во регистраций подряд с 2 - это 38,39, почему оно не подходит?
1. Почему именно PDO? 2. Почему именно подготовленный запрос? 3. Просматривалась ли выдача прежде, чем к ней применялись какие-то действия? Одни вопросы.
@Dmit или переформулируй задачу, что бы можно было правильно составить sql запрос, или выведи все сразу а в php уже в foreach делай что тебе нужно, так как замечание "в вашем же примере например есть и другое кол-во регистраций подряд с 2 - это 38,39, почему оно не подходит?" очень правильное.
Отвечу сразу всем. Оперируют и еще как! Вы, видимо, никогда не работали на крупном предприятии. Там еще и не такие понятия бывают. Смысл не могу объяснить, т.к. мне начальство не озвучило в чем смысл и цель задачи). Потому что значение 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; ?>
Ну-да, ну-да. Нет. Где вы все это всё-время вычитываете? Какой-то мега-гуру на первых позициях в поиске Гугла всплывает? Зачем использовать универсальный инструмент, если есть простой, доступный, но специальный? Вы работаете сразу с несколькими базами данных от разных поставщиков? Только в этом случае это как-то оправдано.
Ну тут не знаю. Что прочитал, то и говорю). Не занимаюсь РНР профессионально, потому тут ничего сказать не могу. Кстати, как-то спрашивал что-то по запросу к БД, где запрос был написан без PDO, так меня местные гуру закидали какашками)
Это всё объясняет. Не расстраивайтесь. Спорить с такими тоже не надо. Одержимость тоже можно ловко использовать.
Крупное, не крупное .. какая разница. Если имеется ввиду - чем крупнее - тем больше бреда - то да, слава богу не работал. Теперь по существу, почему такой вопросы возникли... 1) у вас обычная выборка - без указания сортировки, в произвольном случае БД имеет право отдавать в произвольном порядке, да, чаще всего будет отдавать с сортировкой по id - но это не факт. То есть два одинаковых запроса могут вам отдать данные в разном порядке - если не указана явно сортировка. это в любой БД, на любом предприятии. 2) Ладно. примем что п 1 не знаем и нам БД всегда в нужном нам порядке отдает. Тогда в формулировке задачи должно быть уточнение - найти длину первой серии данных с такими-то условиями 3) $data AS $data - да можно, но как правило не нужно, для той-же удобочитаемости, и исключения ошибок, не дай бог потом в самом же цикле захотите этой переменной что-то присваивать... экономия на выделении памяти под переменные - давно в прошлом. 4) PDO/не PDO на самом деле не так уж тут и важно, для вас это просто инструмент получения данных из БД 5) делать то что "начальство" сказала - не всегда гуд, надо попытаться выяснить саму суть задачи, в вашем случае в 99.9% есть более правильное, красивое решение, и скорее всего средствами SQL ... ну и если все же учесть п 1., то в один прекрасный день у вас все пойдет не по плану))) то что вы иронизируете над сообществом - ваше право, но я увидел у участников именно желание понять суть задачи, для грамотного решения вопроса...
можно найти примеры по контексту "sql streak length" что важно: - сформулировать задачу не подразумевая свой собственный путь решения ("массив из бд") - в запросе явно указать сортировку. не полагаться на некий "порядок по умолчанию" - его нет - стараться доверить обработку множеств серверу БД, а не вытягивать все данные на сторону PHP - так будет неэффективно, возможно даже будет валиться по нехватке памяти --- Добавлено --- задача сведется к написанию SQL запроса, если она будет нормально сформулирована.
сегодня столкнулся с этой проблемой, решение = ввести переменную новую массива, в цикле запихнуть туда массив базы, получаем пронумерованный двухуровневый массив. если не понятно могу дать свой код (ну это мое решение было возможно и как то по другому решается, я же новичок) Тем более у меня не большие региональные двухуровневые массивы, а так нужно понимать можно упереться в память. Хотя у меня не подходит к Вашей теме.
Да, столкнулся с этим при переходе с MySQL на PostgreSQL. Если MySQL отдаёт в порядке добавления при отсутствии сортировки, то PostgreSQL - по времени последнего обновления. И всё туда/сюда скачет сразу