А вот и жесть началась, не могу разобраться, из-за чего не получается как нужно, прикрепил еще фото таблицы бд PHP: <?php include_once 'setting.php'; $CONNECT = mysqli_connect(HOST, USER, PASS, DB); ВЫБИРАЕТ ВСЕ СТРОКИ, А НУЖНО ТОЛЬКО ЗА ПРЕДЫДУЩУЮ МИНУТУ, КАК ЭТО РЕАЛИЗОВАТЬ НЕ ПРЕДСТАВЛЯЮ И ПОЧЕМУ НЕ РАБОТАЕТ НЕ ПОНЯТНО, ВСЮ ГОЛОВУ СЛОМАЛ !(( ------> $sql = mysqli_query($CONNECT,"SELECT COUNT(*) FROM `bidders` WHERE `time_start` < NOW() - INTERVAL 1 MINUTE"); $b = mysqli_fetch_array( $sql ); $total = $b[0]; $bid = mysqli_query($CONNECT,"SELECT `bidder_id` FROM `bidders` WHERE `time_start` < NOW() - INTERVAL 1 MINUTE ORDER BY rand() LIMIT 1"); if ($bid > 0) { И КОД НЕ РАБОТАЕТ ИЗ-ЗА ЭТОЙ СТРОЧКИ, ЧТО НЕ ТАК НЕ ПОЙМУ !( ------> mysqli_query($CONNECT,"UPDATE `users` SET `balance` + '$total' WHERE `id` = '$bid';"); echo 'Баланс успешно пополнен на '.$total."Балов"; } else echo 'Нет участников'; ?>
ты выбираешь все строки, значение поля тайм_старт которых меньше текущего времени на одну минуту. Да, это так читается. Невозможно сломать то, чего нет.
Прикрепил скриншот что выбирается, если выполнить такой запрос: SELECT*FROM`bidders`WHERE`time_start`<NOW()-INTERVAL1MINUTE Должна выбраться одна строчка, а почему то выбираются все, что не так не пойму. Ganzal: Ты советуешь написать так, на сколько я понял? $sql=mysqli_query($CONNECT,"SELECT * FROM `bidders` WHERE `time_start` = NOW() - INTERVAL 1 MINUTE"); то выдается пустой результат хотя там есть строка. --- Добавлено --- Прикрепил таблицу.
Там все прямо написано. --- Добавлено --- Вопрос как сделать так, чтобы выбиралась именно предыдущая минута. А не INTERVAL 1 MINUTE от текущего времени --- Добавлено --- А при этом вот так выдает все за текущую минуту: SELECT*FROM`bidders`WHERE`time_start`>NOW()-INTERVAL1MINUTE
Да мне не важно прямо или криво там написано. Мне важно чтоб ты понимал что там написано. На пальцах: NOW() возвращает текущее время. 23:32:09. А через секунду будет уже 23:32:10. Тупо вычитая минуту ты получаешь значения 23:31:09 и 23:31:10. Применяя условие "строго меньше" ты получаешь все строки. Применяя условие "равно" ты либо не получаешь результата ибо на нужную секунду не попадается записи, либо находишь таки запись, но это результат скорее случайный чем ожидаемый. Решение кроется в прошлой теме, где я тебе давал готовые запросы. Посмотри на них.
Этим сейчас и занимаюсь и не вижу. --- Добавлено --- Ну вот ты пишешь: Выборка кандидатов за прошлый час: Код (Text): SELECT `user_id` FROM `competitions` WHERE `date_YmdH` = DATE_FORMAT(NOW() - INTERVAL 1 HOUR, '%Y%m%d%H') Найдите 10ть отличий, код ведь такой же как и мой по сути SELECT bidders_id FROM`bidders`WHERE`time_start` = NOW()-INTERVAL1MINUTE --- Добавлено --- Вот так: Выборка кандидатов за прошлый час: Код (Text): SELECT `user_id` FROM `competitions` WHERE `date_YmdH` = DATE_FORMAT(NOW() - INTERVAL 1 HOUR, '%Y%m%d%H')
схрена бы такой же? У меня для решения твоей задачи - час соревнования хранится в формате год-месяц-день-час. Там не нужны минуты и секунды. У тебя же обычный таймстамп или поле дата-время. ОК. Хозяин-барин. Захотел хранить лишнее - храни. Ну так что мешает искать-то теперь по этим данным? --- Добавлено --- Давай все же найдем 10 отличий. 1. формат даты времени. у меня указан четкий. у тебя - просто вычитание одной минуты из сейчас. 2. работа со значением поля. я ожидаю в поле такой-то формат. ты просто сравниваешь со значением "минуту назад" как бы два, но очень принципиальных отличия.
Сильно лишним не будет, а может пригодиться. Как искать то? не нашел вообще инфы по этому вопросу. только интервал 1 minute. --- Добавлено --- Не понимаю в чем такое отличие и как мне это поможет.
Короче, дядь. Решение твоей типа очень сильно запутанной ситуации сводится к тому, что вместо того чтоб сразу что-то "сложное" делать - надо было почитать теорию. Основы программирования, основы реляционных баз данных, основы языка структурированных запросов. Тогда бы ты умел манипулировать данными для достижения цели. Тогда бы ты знал что такое агрегированное поле. Тогда бы ты сделал просто DATE_FORMAT(`time_start`, '%Y%m%d%H%i') = DATE_FORMAT(NOW() - INTERVAL 1 MINUTE, '%Y%m%d%H%i'). Этой простой конструкцией ты бы привел значение своего поля в нужный формат - год-месяц-день-час-минута и сравнил бы с таким же форматом для даты "минуту назад". И всё. Но ты этого не сделал. Ну да, не понимаешь. Я в этом не виноват. --- Добавлено --- Я тебе еще в рамках той темы задавал наводящие вопросы. Ты вместо ответов на них - а перед ответом предполагалось что ты мозгом подумаешь, оценишь, взвесишь, пересмотришь - тыкал мне мол я тебе не помогаю. Ну вот твоя дерзость тебя и завела в дебри, верно? Ты сочинил систему которую ты сам не понимаешь. В которой ты не можешь обосновать что и зачем. И с которой ты сам по факту не можешь работать.
Ну вот же, оно, воот, объяснил нормально и все понятно теперь! PHP: function addPayment($dbh, $contest_id, $bidder_id) { /** @noinspection SqlResolve */ $sql = 'INSERT INTO `'.BIDDERS.'` (time_start, last_click, bidder_id)' . 'VALUES :)contest_id, DATE_FORMAT(now(),"%Y%m%d%H%i%s") , :bidder_id);'; $insert = $dbh->prepare($sql); return $insert->execute([ ':contest_id' => $contest_id, ':bidder_id' => $bidder_id ]); } И все находится по запросу что ты написал выше
Теперь только не понятно почему эта строчка все дело губит: PHP: $bid = mysqli_query($CONNECT,"SELECT `bidder_id` FROM `bidders` WHERE DATE_FORMAT(`time_start`, '%Y%m%d%H%i') = DATE_FORMAT(NOW() - INTERVAL 1 MINUTE, '%Y%m%d%H%i') ORDER BY rand() //LIMIT 1"); PHP: <?php include_once 'setting.php'; $CONNECT = mysqli_connect(HOST, USER, PASS, DB); $sql = mysqli_query($CONNECT,"SELECT COUNT(*) FROM `bidders` WHERE DATE_FORMAT(`time_start`, '%Y%m%d%H%i') = DATE_FORMAT(NOW() - INTERVAL 1 MINUTE, '%Y%m%d%H%i';"); $b = mysqli_fetch_array( $sql ); $total = $b[0]; $bid = mysqli_query($CONNECT,"SELECT `bidder_id` FROM `bidders` WHERE DATE_FORMAT(`time_start`, '%Y%m%d%H%i') = DATE_FORMAT(NOW() - INTERVAL 1 MINUTE, '%Y%m%d%H%i') ORDER BY rand() //LIMIT 1"); if ($bid > 0) { mysqli_query($CONNECT,"UPDATE `users` SET `balance` + '$total' WHERE `id` = '$bid';"); echo 'Баланс успешно пополнен на '.$total."Балов"; } else echo 'Нет участников'; ?>
читай выше про глубоко залез не имея базиса. белая страница может: 1) означать, что ты на неё тупо ничего не выводишь 2) что пхп-машина падает, но у тебя при этом отключен вывод ошибок и ты не знаешь где журнал почитать с первым можно побороться при помощи процесса отладки. со вторым в общем-то тоже. но для начала неплохо включить сам вывод ошибок. естественно, если ты на локалке химичишь а не на продакшне. на проде не надо включать вывод ошибок.
1) мы не рассматриваем. 2) не вывожу ошибки видимо падает, какая-то ошибка в этой строчке но не пойму какая
Вот что выдал: Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /home/a0016454/domains/loto.ru/public_html/form/randomandbal.phpon line 44
Переводим на русский и понимаем, что запрос к БД вернул какую-то булеву хрень вместо указателя на ресурс. Обычно это значит, что запрос провалился. Попробуй вывести его отдельно как текст и вбить руками в базу. Увидишь, где какие ошибки. Кавычку где-то забыл небось, или что-то подобное. Обычное дело.
там якобы комментирование перед LIMIT. на самом деле коммент в MySQL начинается с -- а не с // так что ошибка --- Добавлено --- ЗАЧЕМ ТЫ ТАК НАПИСАЛ?
Прошу помочь как выбрать записи за предыдущие 5 минут и за текущие 5 минут? Если пишу так, по аналогии что обсуждали выше, то не получается : DATE_FORMAT(`time_start`, '%Y%m%d%H%i') = DATE_FORMAT(NOW() - INTERVAL 1 MINUTE, '%Y%m%d%H%i'). Подскажите что делаю не так? Например если так: SELECT * FROM `bidders` WHERE DATE_FORMAT(`time_start`, '%Y%m%d%H%i') = DATE_FORMAT(NOW() - INTERVAL 5 MINUTE, '%Y%m%d%H%i';"); То выбирает всего одну строчку, хотя мне нужно выбрать пять строк.
неа, так не годится. Все сложнее, так тоже пытался, не получается все равно, задача такая: есть такая таблица(прикрепил фото): и есть задача выбрать за предыдущие 5 минут запись id_win : SELECT `id_win` FROM `5minbidders` WHERE DATE_FORMAT(`time_start`, '%Y%m%d%H%i') = DATE_FORMAT(NOW() - INTERVAL 5 MINUTE, '%Y%m%d%H%i') : Если так, то только за последнюю минуту выводит, а если знак >, то вообще не фига. Но не выходит каменный цветок, прошу помочь разобраться.
только мне кажется, что ты халявщик? создай песочницу на sqlfiddle с достаточным коиеством данных для тестов. не напрягай тех, кого просишь помочь. твоя задача — ты должен напрягаться. --- Добавлено --- по теме, время как и любой другой тип можно сравнивать на вхождение в промежуток … WHERE x BETWEEN y AND z без лишней дрочки с какими-то форматами --- Добавлено --- дополнение: если ничего не нашлось, очень может быть, что ты ищешь не в том направлении. знак не тот или аргументы не те
Все знаки пробовал, так я вывожу за текущие 5 минут: PHP: SELECT * FROM `bidders` WHERE `time_start` >= (NOW() - INTERVAL 5 MINUTE); А как выводить за предыдущие 5 минут не понимаю, игрался со знаками, форматами даты, но тщетно. Нужен совет от того кто такое уже делал, прошу помочь.