Примеров гугалиард можно нагуглить. Взять толковую книжку по пхп и вот тебе примеры. В мануале толковые примеры. Короче. Тема лежит в разделе для слепоглухонемых, поэтому я тебе закидываю запросы, ибо они "за тебя" и придуманы, но адаптацию их к своей инфосистеме - либо сам, либо за деньги. По опубликованному выше - понятно, что у тебя там очень весело. Итак. У нас есть таблицы пользователей и соревнований: PHP: -- -- Структура таблицы `competitions` -- CREATE TABLE `competitions` ( `date_Ymdh` int(11) NOT NULL, `user_id` int(10) UNSIGNED NOT NULL, `is_winner` smallint(5) UNSIGNED NOT NULL DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -------------------------------------------------------- -- -- Структура таблицы `users` -- CREATE TABLE `users` ( `id` int(10) UNSIGNED NOT NULL, `name` varchar(32) CHARACTER SET utf8 NOT NULL, `balance` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -- Индексы сохранённых таблиц -- -- -- Индексы таблицы `competitions` -- ALTER TABLE `competitions` ADD UNIQUE KEY `date_Ymdh_user_id_unq` (`date_Ymdh`,`user_id`) USING BTREE, ADD KEY `user_id_idx` (`user_id`) USING BTREE, ADD KEY `is_winner_idx` (`is_winner`) USING BTREE; -- -- Индексы таблицы `users` -- ALTER TABLE `users` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `name_unq` (`name`) USING BTREE, ADD KEY `balance_idx` (`balance`); Вот этим запросом мы определяем является ли юзер платежеспособным (первая колонка) и участником текущего соревнования (вторая колонка): PHP: SELECT CASE WHEN u.`balance` > 0 THEN 1 ELSE 0 END `solvent`, CASE WHEN ( SELECT `user_id` FROM `competitions` WHERE `date_YmdH` = DATE_FORMAT(NOW(), '%Y%m%d%H') AND `user_id` = $USER_ID ) IS NOT NULL THEN 1 ELSE 0 END `participant` FROM `users` u WHERE u.`id` = $USER_ID Вместо $USER_ID подставлять свое великолепное значение идентификатора пользователя. Нужно обязательно учесть такой момент, что юзер может оказаться бомжом, поставив последний балл на участие в соревновании. Тогда пара будет 0-1 и ему надо показать "ты уже участник". Для пары "0-0" нужно сказать, что человек - бомжара. На пару "1-0" - будешь списывать баланс и записывать в участники. То есть, первым делом надо проверять именно признак участия, а платежеспособность - вторым. Больше сложных запросов, которые ты не понимаешь - не будет. Списание баланса: PHP: UPDATE `users` SET `balance` = `balance` - 1 WHERE `id` = $USER_ID Тут всё просто. Списали рублик с баланса такого-то балбеса. Запись хрена моржового на соревнования: PHP: INSERT INTO `competitions` (`date_YmdH`, `user_id`) VALUES (DATE_FORMAT(NOW(), '%Y%m%d%H'), $USER_ID) Тут всё тоже просто. Закидываем в соревновательную таблицу пару год-месяц-день-час+пользователь. Выборка кандидатов за прошлый час: Код (Text): SELECT `user_id` FROM `competitions` WHERE `date_YmdH` = DATE_FORMAT(NOW() - INTERVAL 1 HOUR, '%Y%m%d%H') Тут ты получаешь список айдишников участников соревнования за прошлый час (и по нему же ты можешь посчитать и их кол-во). Рандомишь, определяешь победителя и... Записываешь победителя: PHP: UPDATE `competitions` SET `is_winner` = 1 WHERE `date_YmdH` = DATE_FORMAT(NOW() - INTERVAL 1 HOUR, '%Y%m%d%H') AND `user_id` = $WINNER_ID (просто ставим единичку напротив нужной строки) И поздравляешь его капитал: PHP: UPDATE `users` SET `balance` = `balance` + $TOTAL_COMPETITORS WHERE `id` = $WINNER_ID (просто прибавляем кол-во участников соревнования прошлого часа к балансу пользователя)
Такс, написал вот так и все равно не работает )) Корректно страница отображается, но в базе ничего не появляется (( Как понять в чем дело? Соединение с базой есть, вывожу статус подключения к бд, такие таблицы с такими полями есть, значит что-то коряво написал, прошу посмотреть и подсказать в чем тут дело! Заранее благодарен! PHP: <?php if ($Module == 'minute' and $_POST['enter']) { $id = $_SESSION['USER_ID']; $res = mysql_query("SELECT `user_id` FROM `konkurs` WHERE `user_id` = '$id'"); // если такой записи нет: if (mysql_num_rows($res) == 0) { // то все ок, выполняем код программы: mysql_query("INSERT INTO `konkurs` (user_id, win_id, time_start) VALUES ($id,'', NOW());"); //записываем в таблицу konkurs, id того кто нажал участвовать и время. // списываем 1 балл, но ОБЯЗАТЕЛЬНО нужно указать у кого: mysql_query("UPDATE users SET balance = balance - 1 WHERE ‘id’ = '".$id."'"); } // если вдруг окажется, что в вашей базе несколько пользователей с одинаковым айди, то: elseif (mysql_num_rows($res) > 1) { echo "Тут несколько пользователей с таким ИД. ";} // если пользователя с таким айди нет, то: } echo "<pre>"; print_r($_SESSION); echo "</pre>"; ?>
debug http://phpfaq.ru/debug https://netbeans.org/kb/docs/php/debugging_ru.html https://php.ru/forum/threads/howto-...i-po-shagam-i-s-kartinkami.58974/#post-474550
Все получилось, юзер и записывается на участие, не дает много раз записывать, списывает баланс и выдает ошибки если что-то не так. 1) Теперь как реализовать таймер обратного отсчета?( .JS ?) 2) Как собирать всех участников за это время? 3) Как прерывать текущий конкурс и начинать новый? 4) Определять победителя поздравляем баланс и что дальше делать? Стирать эти данные? Как их составлять-группировать? 5) Писать в отдельный файл или в БД? Есть мысли по этому поводу? Примеры?
2) Код (Text): SELECT * FROM `competitions` c WHERE c.`date_YmdH` = DATE_FORMAT(NOW(), '%Y%m%d%H') JOIN `users` u ON u.`id` = c.`user_id` 3) нахер его закрывать-открывать если это делает вселенная простым течением времени, неотвратимо переводящим часы на час вперёд каждые 3600 секунд? 4) ничего не делать. Оставлять. Таблицу [участников] соревнований нетронутой. Потом можешь придумать всякие запросы типа "самый плотный час", "частый победитель", "заядлый участник", "топчик заработка" и тому подобное. Раздел "за меня" вряд ли предполагает, что мы за тебя будем продумывать возможности твоей системы. Тут как бы решают конкретную задачу, если автору по каким-то причинам лениво. 5) Что писать? Ты и так работаешь с базой. Что тебе в файл записывать?
То что вы написали отлично, но Вы не написали как тогда определять что прошлый конкурс закончился и снова записывать участника в Новый конкурс?
К огромному сожалению, раздел "за меня" не предполагает синтез серого вещества. Когда час изменился - все участники автоматически не могут участвовать в конкурсе за прошлый час, как и в конкурсах любого будущего и прошедшего времени. Зато могут участвовать в конкурсе текущего часа. Вся магия контролируется простыми запросами к СУБД. Не надо ничего сочинять.
Вы же не написали мне готовый код в разделе который называется "за меня", в связи с этим делаю сам, спрашивая у Вас совета, если можете, то напишите готовый работающий код.
Да, я не сразу обратил внимания, на то, в каком разделе находиться тема. Готовый код писать лениво было, но и совсем ничего тоже неправильно было написать. Вот и написал запросы, комментарии к ним, идеи.
Всю голову сломал, не работает и все, посмотри плиз: PHP: <?php include_once 'setting.php'; echo $result; echo $id; $CONNECT = mysqli_connect(HOST, USER, PASS, DB); $id = $_SESSION['USER_ID']; $a = mysqli_query($CONNECT,"SELECT balance FROM users WHERE `id` = '$id' "); $result = mysqli_query($CONNECT,"SELECT `id_konkurs` FROM `konkurs` WHERE `time_start` <= NOW() AND NOW() <= `time_finish`"); // $b = mysqli_query($CONNECT,"SELECT `user_id` FROM `konkurs` WHERE `id_konkurs` = '$result'"); //нажимаем на кнопку if ($_POST['state']) { mysqli_query($CONNECT,"UPDATE `users` SET `balance` = `balance` - 1 WHERE `id` = '$id'"); } else echo "Пополните баланс"; //Если такого айди еще нет, то записываем на участие if (mysqli_query($b) == 0) { mysqli_query($CONNECT,"INSERT INTO konkurs (user_id, time_start, id_konkurs) VALUES ('$id', NOW(), '$result');"); echo "Вы участвуете"; } else echo "Вы уже участвуете"; ?>
Удобнее написал, но не работает, не пойму в чем дело, подключение к базе есть, все поля тоже, может что увидите: <form method="POST"> <input name="enter" type="submit" value="Участвовать"; /> </form> PHP: <?php include_once 'setting.php'; $CONNECT = mysqli_connect(HOST, USER, PASS, DB); $id = $_SESSION['USER_ID']; $a = mysqli_query($CONNECT,"SELECT balance FROM users WHERE `id` = '$id' "); $b = mysqli_query($CONNECT,"SELECT `user_id` FROM `konkurs` WHERE `id_konkurs` = '$result'"); if ($_POST['enter']) { $result = mysqli_query($CONNECT,"SELECT `id_konkurs` FROM `konkurs` WHERE `time_start` <= NOW() AND NOW() <= `time_finish`"); echo $result;} else echo "Такого конкурса нет"; if ($a > 0) { mysqli_query($CONNECT,"UPDATE `users` SET `balance` = `balance` - 1 WHERE `id` = '$id'"); } else echo "Пополните баланс"; //Если такого айди еще нет, то записываем на участие if (mysqli_query($b) == 0) { mysqli_query($CONNECT,"INSERT INTO konkurs (win_id, time_start, id_konkurs, time_finish, user_id) VALUES ('0', NOW(), '$result', '0' , '$id');"); echo "Вы участвуете"; } else echo "Вы уже участвуете"; ?>
Подскажите плиз что тут не так, хочу получать id_конкуса чтобы потом по нему смотреть есть ли такой айди юзера с таким-то айди конкурса, фото таблицы прикрепил: PHP: $result = mysqli_query($CONNECT,"SELECT `id_konkurs` FROM `konkurs` WHERE `time_start` <= NOW() AND NOW() <= `time_finish`");
Так и не пойму почему этот код не работает, а именно одна строчка которую ниже распишу: PHP: <?php include_once 'setting.php'; $CONNECT = mysqli_connect(HOST, USER, PASS, DB); $id = $_SESSION['USER_ID']; $n = date('Y-m-d H:i:s'); $a = mysqli_query($CONNECT,"SELECT balance FROM users WHERE `id` = '$id' "); $b = mysqli_query($CONNECT,"SELECT `user_id` FROM `konkurs` WHERE `id_konkurs` = '$result'"); if ($_POST['enter']) { $result = mysqli_query($CONNECT,"SELECT `id_konkurs` FROM `konkurs` WHERE `time_start` < '$n' AND '$n' < `time_finish`"); } else echo "Такого конкурса нет"; if ($a > 0) { mysqli_query($CONNECT,"UPDATE `users` SET `balance` = `balance` - 1 WHERE `id` = '$id'"); } else echo "Пополните баланс"; //Если такого айди еще нет, то записываем на участие if (mysqli_query($b) == 0) { mysqli_query($CONNECT,"INSERT INTO konkurs (win_id, time_start, id_konkurs, time_finish, user_id) VALUES ('0', NOW(), '$result', '0' , '$id');"); echo "Вы участвуете"; } else echo "Вы уже участвуете"; ?> Если писать в mysql через phpmyadmin так, то он выводит id текущего конкурса: SELECT `id_konkurs` FROM `konkurs` WHERE `time_start` < NOW() AND NOW() < `time_finish` Но если я пишу в коде так: $result = mysqli_query($CONNECT,"SELECT `id_konkurs` FROM `konkurs` WHERE `time_start` < '$n' AND '$n' < `time_finish`"); $n = date('Y-m-d H:i:s'); В общем ни фига не могу получить $result и вывести его, а почему не пойму, а через SQL все ок(( Подскажите в чем дело, почему так ?
Я тебе вечно задаю правильные вопросы с целью разведать смысл твоих черезжопных решений. Ты обязан был головой подумать перед тем как делать те или иные действия. Ок. У тебя собственная таблица у конкурса и собственный уникальный идентификатор, помимо даты проведения. НАфига? В моей архитектуре всё лишнее убрано, поэтому что оно лишнее и работать будет прекрасно и без этого лишнего. Но у тебя твоя архитектура. Подобными вопросами в стиле НАфига мы сейчас либо выясним что нужно позарез иметь такую замысловатую архитектуру с лишними элементами, блекджеком и шлюхами, либо ты поймешь что не прав и упростишь систему. Ну и вопросы в стиле НАфига очень помогут понять ход твоих мыслей, чтоб если я захочу выложить тебе готовый код - он был под твою замысловатую архитектуру, а не под мою красивую. Ну чтоб тебе портировать было проще.
Прошу помочь, ни как не могу посчитать участников конкурса, нужно брать точку подсчета кол-ва строк от time_start, чтобы считал не с момента клика пользователя, так как они все в разное время кликают а с time_start(каждую минуту), то есть нужно выбрать строки в которых: `last_click` меньше или равен NOW() и не меньше чем time_start *- INTERVAL 1 MINUTE как это написать не понимаю, реально сложно, прошу подсказать! Заранее благодарен! --- Добавлено --- Пишу если так, то выдает все записи: SELECT COUNT(*) FROM `bidders` WHERE `last_click` >= `time_start` - INTERVAL 1 MINUTE AND NOW() >= `time_start` - INTERVAL 1 MINUTE --- Добавлено --- Вопрос решен))) SELECT COUNT(*) FROM `bidders` WHERE `time_start` >= NOW() - INTERVAL 1 MINUTE
А вот и жесть началась, ни как не могу разобраться, прошу помочь, есть два затыка: 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 'Нет участников'; ?>
Ты уже три недели висишь в разделе за меня. Может тебе уже пора задуматься о посещении раздела фриланса? Как мы видим, никто особо не взялся помочь тебе прям вот готовым кодом. Потому что кода много. Потому что у тебя система не продумана и будет головняк с интеграцией твоими прямыми руками готового кода. В доказательство тезиса проголовняк приведу тот факт, что тебе уже объемную подсказку дали - алгоритм, готовые запросы, идеи - но ты из этого что-то еще ничего не вывез, хотя там работы на несколько часов. Ты пошел другим путём, без особого обоснования самому себе того, зачем ты что-то так-то делаешь. Так вот, за материальную компенсацию затрат человекочасов на общение с твоей задачей - найдутся люди. Я, например, совсем не против разменять твою денюжку на несколько скриптов реализации моей идеи. А потом еще раз разменять твою денюжку на несколько часов интеграции в уже готовую ужасно спланированную систему.
Ganzal ты уже и признался что тебе впадлу и что ты не заметил в какой теме это написано и уже 20 раз рассказал какой ты умный. За три недели я многое сделал, учитывая что три недели назад я вообще про php ничего не знал, а сейчас я уже на финишной прямой. А если возвращаться к твоим подсказкам и готовым алгоритмам и к моим вопросам, то в целом я пришел к тому что ты писал и даже захватил кусок PDO и если бы я хотел найти фрилансера я бы написал на фриланс. Ближе к телу, вот ты пишешь: Выбираем победителя за предыдущий час: SELECT `user_id` FROM `competitions` WHERE `date_YmdH` = DATE_FORMAT(NOW() - INTERVAL 1 HOUR, '%Y%m%d%H') Вот я пишу: SELECT COUNT(*) FROM `bidders` WHERE `time_start` < NOW() - INTERVAL 1 MINUTE"); И твой запрос и мой не выдает пользователей за предыдущий час, а в моем случае за предыдущую минуту и почему так, я не пойму. И если так тоже SELECT `bidder_id` FROM `bidders` WHERE `time_start` = NOW() - INTERVAL 1 MINUTE"); Подскажите, как выбрать участников за предыдущую минуту?
Чувак, мой запрос выводит. То что он не работает у тебя - это прямое следствие прямоты твоих рук и правильности архитектуры твоего приложения. Мне что сейчас удалённо какую-то отладку надо сделать для тебя? У меня всё работает как нужно. ЧТО Я ДЕЛАЮ НЕ ТАК?