За последние 24 часа нас посетили 17295 программистов и 1676 роботов. Сейчас ищет 1641 программист ...

А вот и жесть началась, не могу разобраться что не так

Тема в разделе "Сделайте за меня", создана пользователем antonio21, 14 сен 2016.

  1. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    А вот и жесть началась, не могу разобраться, из-за чего не получается как нужно, прикрепил еще фото таблицы бд
    PHP:
    1. <?php
    2. include_once 'setting.php';
    3. $CONNECT = mysqli_connect(HOST, USER, PASS, DB);
    4. ВЫБИРАЕТ ВСЕ СТРОКИ, А НУЖНО ТОЛЬКО ЗА ПРЕДЫДУЩУЮ МИНУТУ, КАК ЭТО РЕАЛИЗОВАТЬ НЕ ПРЕДСТАВЛЯЮ И ПОЧЕМУ НЕ РАБОТАЕТ НЕ ПОНЯТНО, ВСЮ ГОЛОВУ СЛОМАЛ !((
    5. ------> $sql = mysqli_query($CONNECT,"SELECT COUNT(*) FROM `bidders` WHERE `time_start` < NOW() - INTERVAL 1 MINUTE");
    6.  
    7. $b = mysqli_fetch_array( $sql );
    8. $total = $b[0];
    9. $bid = mysqli_query($CONNECT,"SELECT `bidder_id` FROM `bidders` WHERE `time_start` < NOW() - INTERVAL 1 MINUTE ORDER BY rand()
    10. LIMIT 1");
    11. if ($bid > 0) {
    12. И КОД НЕ РАБОТАЕТ ИЗ-ЗА ЭТОЙ СТРОЧКИ, ЧТО НЕ ТАК НЕ ПОЙМУ !(
    13. ------> mysqli_query($CONNECT,"UPDATE `users` SET `balance` + '$total'  WHERE `id` = '$bid';");
    14.  
    15. echo 'Баланс успешно пополнен на &nbsp;'.$total."Балов";
    16. }
    17. else echo 'Нет участников';
    18. ?>
     

    Вложения:

  2. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ты выбираешь все строки, значение поля тайм_старт которых меньше текущего времени на одну минуту. Да, это так читается. Невозможно сломать то, чего нет.
     
    denis01 и artoodetoo нравится это.
  3. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    Прикрепил скриншот что выбирается, если выполнить такой запрос:
    SELECT*FROM`bidders`WHERE`time_start`<NOW()-INTERVAL1MINUTE
    Должна выбраться одна строчка, а почему то выбираются все, что не так не пойму.

    Ganzal: Ты советуешь написать так, на сколько я понял?
    $sql=mysqli_query($CONNECT,"SELECT * FROM `bidders` WHERE `time_start` = NOW() - INTERVAL 1 MINUTE");
    то выдается пустой результат хотя там есть строка.
    --- Добавлено ---
    Прикрепил таблицу.
     

    Вложения:

  4. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    что делает эта конструкция?
     
    denis01 нравится это.
  5. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    Там все прямо написано.
    --- Добавлено ---
    Вопрос как сделать так, чтобы выбиралась именно предыдущая минута. А не INTERVAL 1 MINUTE от текущего времени
    --- Добавлено ---
    А при этом вот так выдает все за текущую минуту:

    SELECT*FROM`bidders`WHERE`time_start`>NOW()-INTERVAL1MINUTE
     
  6. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Да мне не важно прямо или криво там написано. Мне важно чтоб ты понимал что там написано.
    На пальцах:
    NOW() возвращает текущее время. 23:32:09. А через секунду будет уже 23:32:10. Тупо вычитая минуту ты получаешь значения 23:31:09 и 23:31:10.
    Применяя условие "строго меньше" ты получаешь все строки. Применяя условие "равно" ты либо не получаешь результата ибо на нужную секунду не попадается записи, либо находишь таки запись, но это результат скорее случайный чем ожидаемый.
    Решение кроется в прошлой теме, где я тебе давал готовые запросы. Посмотри на них.
     
    denis01 нравится это.
  7. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    Этим сейчас и занимаюсь и не вижу.
    --- Добавлено ---
    Ну вот ты пишешь:
    Выборка кандидатов за прошлый час:
    Код (Text):
    1. 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):
    1. SELECT `user_id` FROM `competitions` WHERE `date_YmdH` = DATE_FORMAT(NOW() - INTERVAL 1 HOUR, '%Y%m%d%H')
     
  8. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    схрена бы такой же? У меня для решения твоей задачи - час соревнования хранится в формате год-месяц-день-час. Там не нужны минуты и секунды. У тебя же обычный таймстамп или поле дата-время. ОК. Хозяин-барин. Захотел хранить лишнее - храни. Ну так что мешает искать-то теперь по этим данным?
    --- Добавлено ---
    Давай все же найдем 10 отличий.
    1. формат даты времени. у меня указан четкий. у тебя - просто вычитание одной минуты из сейчас.
    2. работа со значением поля. я ожидаю в поле такой-то формат. ты просто сравниваешь со значением "минуту назад"
    как бы два, но очень принципиальных отличия.
     
    denis01 нравится это.
  9. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    Сильно лишним не будет, а может пригодиться.

    Как искать то? не нашел вообще инфы по этому вопросу. только интервал 1 minute.
    --- Добавлено ---
    Не понимаю в чем такое отличие и как мне это поможет.
     
  10. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Короче, дядь. Решение твоей типа очень сильно запутанной ситуации сводится к тому, что вместо того чтоб сразу что-то "сложное" делать - надо было почитать теорию. Основы программирования, основы реляционных баз данных, основы языка структурированных запросов.

    Тогда бы ты умел манипулировать данными для достижения цели.
    Тогда бы ты знал что такое агрегированное поле.
    Тогда бы ты сделал просто DATE_FORMAT(`time_start`, '%Y%m%d%H%i') = DATE_FORMAT(NOW() - INTERVAL 1 MINUTE, '%Y%m%d%H%i'). Этой простой конструкцией ты бы привел значение своего поля в нужный формат - год-месяц-день-час-минута и сравнил бы с таким же форматом для даты "минуту назад". И всё. Но ты этого не сделал.

    Ну да, не понимаешь. Я в этом не виноват.
    --- Добавлено ---
    Я тебе еще в рамках той темы задавал наводящие вопросы. Ты вместо ответов на них - а перед ответом предполагалось что ты мозгом подумаешь, оценишь, взвесишь, пересмотришь - тыкал мне мол я тебе не помогаю. Ну вот твоя дерзость тебя и завела в дебри, верно? Ты сочинил систему которую ты сам не понимаешь. В которой ты не можешь обосновать что и зачем. И с которой ты сам по факту не можешь работать.
     
    denis01 и dasdaas нравится это.
  11. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    • Оформляй код, кнопка </> в редакторе, потом выпадающий список и выбирай тип кода: php, javascript, html и т. д.
    Ну вот же, оно, воот, объяснил нормально и все понятно теперь!

    PHP:
    1. function addPayment($dbh, $contest_id, $bidder_id)
    2. {
    3.     /** @noinspection SqlResolve */
    4.     $sql = 'INSERT INTO `'.BIDDERS.'` (time_start, last_click, bidder_id)' .
    5.         'VALUES :)contest_id, DATE_FORMAT(now(),"%Y%m%d%H%i%s") , :bidder_id);';
    6.     $insert = $dbh->prepare($sql);
    7.     return $insert->execute([
    8.         ':contest_id' => $contest_id,
    9.         ':bidder_id'  => $bidder_id
    10.     ]);
    11. }
    И все находится по запросу что ты написал выше
     
    #11 antonio21, 15 сен 2016
    Последнее редактирование модератором: 15 сен 2016
  12. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    Теперь только не понятно почему эта строчка все дело губит:

    PHP:
    1.  $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()
    2. //LIMIT 1");
    PHP:
    1. <?php  
    2. include_once 'setting.php';
    3. $CONNECT = mysqli_connect(HOST, USER, PASS, DB);
    4. $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';");
    5. $b = mysqli_fetch_array( $sql );
    6. $total = $b[0];
    7.  
    8. $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()
    9. //LIMIT 1");
    10.  
    11. if ($bid > 0) {
    12. mysqli_query($CONNECT,"UPDATE `users` SET `balance` + '$total'  WHERE `id` = '$bid';");
    13. echo 'Баланс успешно пополнен на &nbsp;'.$total."Балов";
    14. }
    15. else echo 'Нет участников';
    16.  
    17.  
    18.  
    19.  
    20. ?>
     
  13. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    в каком смысле губит?
     
    denis01 нравится это.
  14. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    если эта строчка не закомментированна то не работает скрипт вообще, белая страница
     
  15. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    читай выше про глубоко залез не имея базиса.
    белая страница может:
    1) означать, что ты на неё тупо ничего не выводишь
    2) что пхп-машина падает, но у тебя при этом отключен вывод ошибок и ты не знаешь где журнал почитать

    с первым можно побороться при помощи процесса отладки. со вторым в общем-то тоже. но для начала неплохо включить сам вывод ошибок. естественно, если ты на локалке химичишь а не на продакшне. на проде не надо включать вывод ошибок.
     
    denis01 нравится это.
  16. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    1) мы не рассматриваем.
    2) не вывожу ошибки

    видимо падает, какая-то ошибка в этой строчке но не пойму какая
     
  17. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    Вот что выдал:
    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
     
  18. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Переводим на русский и понимаем, что запрос к БД вернул какую-то булеву хрень вместо указателя на ресурс. Обычно это значит, что запрос провалился. Попробуй вывести его отдельно как текст и вбить руками в базу.

    Увидишь, где какие ошибки. Кавычку где-то забыл небось, или что-то подобное. Обычное дело.
     
  19. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    там якобы комментирование перед LIMIT. на самом деле коммент в MySQL начинается с -- а не с // так что ошибка
    --- Добавлено ---
    ЗАЧЕМ ТЫ ТАК НАПИСАЛ?
     
  20. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    Прошу помочь как выбрать записи за предыдущие 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';");
    То выбирает всего одну строчку, хотя мне нужно выбрать пять строк.
     
  21. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Надо знак больше использовать, а не равно
     
  22. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    неа, так не годится. Все сложнее, так тоже пытался, не получается все равно, задача такая:

    есть такая таблица(прикрепил фото): [​IMG]

    и есть задача выбрать за предыдущие 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') : Если так, то только за последнюю минуту выводит, а если знак >, то вообще не фига.

    Но не выходит каменный цветок, прошу помочь разобраться.
     
  23. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    только мне кажется, что ты халявщик? создай песочницу на sqlfiddle с достаточным коиеством данных для тестов. не напрягай тех, кого просишь помочь. твоя задача — ты должен напрягаться.
    --- Добавлено ---
    по теме, время как и любой другой тип можно сравнивать на вхождение в промежуток
    … WHERE x BETWEEN y AND z
    без лишней дрочки с какими-то форматами
    --- Добавлено ---
    дополнение: если ничего не нашлось, очень может быть, что ты ищешь не в том направлении. знак не тот или аргументы не те
     
  24. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    Все знаки пробовал, так я вывожу за текущие 5 минут:

    PHP:
    1. SELECT * FROM `bidders` WHERE `time_start` >= (NOW() - INTERVAL 5 MINUTE);
    А как выводить за предыдущие 5 минут не понимаю, игрался со знаками, форматами даты, но тщетно.
    Нужен совет от того кто такое уже делал, прошу помочь.
     
    #24 antonio21, 6 окт 2016
    Последнее редактирование модератором: 6 окт 2016
  25. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    показывай как пробовал
     
    denis01 нравится это.