Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 26.09.2023
Сообщений: 71

Как правильно составить запрос PHP?

31.03.2024, 19:23. Показов 929. Ответов 16

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Такой запрос есть:

PHP
1
2
3
$sql = "SELECT s.username, s.timestamp FROM users AS s;
$rs = $conn->execute($sql);
$mails = $rs->getrows();
username - логин пользователя
timestamp - число unix timestamp (время последней активности на сайте).

Запрос отображает список пользователей. Нужно только помечать онлайн или оффлайн, т.е. рядом с каждым логином ставить зелёную или красную метку. Например, если timestamp менее 300 секунд, то делаем онлайн (с помощью переменной $online), если timestamp больше 300 секунд, то ставим оффлайн (с помощью переменной $offline).

В HTML уже все настроил, с помощью переменных $online и $offline через if, не могу только правильно PHP-запрос составить.

Подскажите пожалуйста))

Можно конечно с помощью 2-х запросов выводить, например:

PHP
1
$sql = "SELECT s.username, s.timestamp FROM users AS s WHERE timestamp > " .(time()-300). ";
PHP
1
$sql = "SELECT s.username, s.timestamp FROM users AS s WHERE timestamp < " .(time()-300). ";
И записывать результат в разные переменные. Но хочется, чтобы запрос был один, т.е. чтобы переменная $mails была только одна.

Спасибо))
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.03.2024, 19:23
Ответы с готовыми решениями:

Как правильно составить GET запрос
Пытаюсь сформировать GET запрос (вебхук) из CRM системы, который потом будет принят обработчиком postchat.php. Запрос должен быть...

Как правильно передать php.exe post запрос?
Как правильно передать php.exe post запрос из другой программы? Пытаюсь так: &quot;путь к php.exe&quot; &quot;путь до php страницы&quot;...

Как правильно составить SQL запрос с использованием команды BETWEEN и реализовать его с PDO PHP подготовленными
Питаюсь реализовать фильтр товаров по цене, имеются две переменные которые я использую как минимум и максимум того промежутка цен который...

16
Невнимательный
 Аватар для ft4l
3112 / 1291 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 2
31.03.2024, 21:04
Цитата Сообщение от Dennz Посмотреть сообщение
хочется, чтобы запрос был один, т.е. чтобы переменная $mails была только одна
угу. ещё чтобы никаких COUNT() , LIMIT и пагинаций и мильён юзеров в памяти не висело ))
я вот даже не уверен что если есть какие-то индексы, будет их использовать
даже если делать ORDER BY 2,1 вместо
SELECT username, timestamp , (TIMESTAMPADD(MINUTE,5, timestamp )>=NOW()) new FROM users ORDER BY 3,1;
или с
(TIMESTAMPDIFF(MINUTE,timestamp ,NOW())>5) old ... ORDER BY 2 DESC,1 ?)
... я не спец
explain SELECT ... на какой-то попавшейся таблице ничего обнадёживающего не показывает )
1
176 / 74 / 27
Регистрация: 10.11.2023
Сообщений: 199
31.03.2024, 22:42
Цитата Сообщение от Dennz Посмотреть сообщение
если timestamp больше 300 секунд, то ставим оффлайн
PHP
1
2
3
4
5
6
$sql = "SELECT username, timestamp,
CASE
  WHEN TIME_TO_SEC(TIMEDIFF(timestamp ,NOW())) > 300 THEN 0
  ELSE 1
END AS status 
FROM users";
и проверяйте статус

if ( status == 1) онлайн
else оффлайн
1
0 / 0 / 0
Регистрация: 26.09.2023
Сообщений: 71
01.04.2024, 19:22  [ТС]
Цитата Сообщение от ZeroKara Посмотреть сообщение
и проверяйте статус

if ( status == 1) онлайн
else оффлайн
ZeroKara, сделал так:

PHP
1
2
3
4
5
if ('status' == 1) {
$online = true;
} else {
$online = false;
}
Но не работает, т.е. переменная $online всегда false, в независимости от того, что указано в sql-запросе (больше 300 секунд или меньше - без разницы).

В логах сервера все чисто в плане ошибок PHP.

Подозреваю, что проблема именно в проверке и вместо:

PHP
1
2
3
4
5
if ('status' == 1) {
$online = true;
} else {
$online = false;
}
нужно по другому сделать, т.е. правильно вытащить status из sql-запроса))
0
Эксперт PHP
 Аватар для liris
5125 / 1084 / 160
Регистрация: 16.01.2023
Сообщений: 2,667
01.04.2024, 20:04
Такая формулировка в целом неправильная. Вы просто слово status сравниваете с числом 1.

PHP
1
if ('status' == 1) {
Должно быть:

PHP
1
2
3
4
5
6
7
8
$online = $status == 1;
/* 
if ($status == 1) {
    $online = true;
} else {
    $online = false;
}
*/
Перед этим вам нужно в переменную $status положить значение колонки status из результата, возвращенного из базы данных.
2
Невнимательный
 Аватар для ft4l
3112 / 1291 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 2
01.04.2024, 20:26
Цитата Сообщение от Dennz Посмотреть сообщение
всегда false,
Запросы лучше проверять в каких-нибудб клиентах типа mysql(в консоли)/phpmyadmin/mysqlworkbench/...
Цитата Сообщение от ZeroKara Посмотреть сообщение
TIMEDIFF(timestamp ,NOW())
мне показалось параметры дожны быть наоборот (NOW(), timestamp )

Добавлено через 6 минут
Цитата Сообщение от ft4l Посмотреть сообщение
показалось
проверил, да, позже впереди, или получите отрицательные значения
Code
1
2
3
4
5
6
mysql> select TIME_TO_SEC(TIMEDIFF('2024-04-01 19:50:00' ,'2024-04-01 19:51:00')) x;
+------+
| x    |
+------+
|  -60 |
+------+
2
176 / 74 / 27
Регистрация: 10.11.2023
Сообщений: 199
01.04.2024, 20:33
Цитата Сообщение от ft4l Посмотреть сообщение
мне показалось параметры дожны быть наоборот
Верно, нужно наоборот, ошибся
От конечного нужно отнять начальное время. end_time - start_time
TIMEDIFF() computes and returns the value of ‘time1 – time2’.
2
Невнимательный
 Аватар для ft4l
3112 / 1291 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 2
01.04.2024, 21:02
ZeroKara, главное мысль подать,) как вариант
кстати, then 0 else 1 , как для возможностей норм, типа можно строку вернуть 'online'/'offline'
... и есть ещё IF(cond? yes,now)
а так x>y AS z оно и так z=1/0 .)

upd:// правильно создавать всё-таки тема,) а не точно копировать
0
0 / 0 / 0
Регистрация: 26.09.2023
Сообщений: 71
02.04.2024, 00:42  [ТС]
Цитата Сообщение от liris Посмотреть сообщение
Перед этим вам нужно в переменную $status положить значение колонки status из результата, возвращенного из базы данных.
А подскажите пожалуйста как это сделать?

Если status было бы поле в БД, то я бы сделал так:

PHP
1
$status = $rsc->fields['status'];
Но status это не поле, я ещё не сталкивался с тем, чтобы подобные sql-запросы в переменную записывать.

А так то да, работает если cделать например:

PHP
1
2
3
4
5
6
7
$status = 1;
 
if ($status == 1) {
$online = true;
} else {
$online = false;
}
то всё работает, но для всех пользователей из списка без исключения))

Осталось разобраться как из sql-запроса:


PHP
1
2
3
4
5
6
$sql = "SELECT username, timestamp,
CASE
WHEN TIME_TO_SEC(TIMEDIFF(NOW(), timestamp)) > 300 THEN 0
ELSE 1
END AS status 
FROM users";
записать результат status (1 или 0) в переменную $status.
0
Невнимательный
 Аватар для ft4l
3112 / 1291 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 2
02.04.2024, 09:06
Лучший ответ Сообщение было отмечено Dennz как решение

Решение

Цитата Сообщение от Dennz Посмотреть сообщение
status это не поле
без разницы, в получаемом наборе, что поле, что выражение, если ему присвоен алиас возвращаются с заданными именами
например
Code
1
2
3
4
5
6
7
mysql> select username name, timestamp AS time, TIMESTAMPDIFF(SECOND, timestamp, NOW())<=300
AS online from users;
+------------+---------------------+--------+
| name       | time                | online |
+------------+---------------------+--------+
| some.ghost | 2024-04-02 09:56:20 |      1 |
+------------+---------------------+--------+
Добавлено через 7 минут
как вариант можно вообще словами получать
IF(TIMESTAMPDIFF(SECOND, timestamp, NOW())<=300, 'online','offline') status
+---------+
| status |
+---------+
| offline |
+---------+

или кусками разметки с тегами ))... но памяти соответственно чуть больше чем 1/0
1
0 / 0 / 0
Регистрация: 26.09.2023
Сообщений: 71
03.04.2024, 16:09  [ТС]
Цитата Сообщение от ft4l Посмотреть сообщение
как вариант можно вообще словами получать
IF(TIMESTAMPDIFF(SECOND, timestamp, NOW())<=300, 'online','offline') status
+---------+
| status |
+---------+
| offline |
+---------+
Я просто не могу понять, как результат из status sql-запроса дальше записать в переменную.

Например, после sql-запроса у меня идет следующий код:

PHP
1
2
$rs = $conn->execute($sql);
$mails = $rs->getrows();
Нужно теперь добавить переменную статус:

PHP
1
$status = 'вот тут не знаю что писать';
Просто еще не особо разбираюсь в синтаксисе))
0
Надуваю лягушек
Эксперт PHP
 Аватар для Царь Бабай
289 / 219 / 93
Регистрация: 01.05.2014
Сообщений: 742
03.04.2024, 16:23
Простите, у меня вопрос.
А если целочисленное - intval
Что 3-им равно мы доказываем? (существование предмета объекта - нелепо как-то, когда цифровая варияция в условии.)
PHP
1
if ('status' == 1) {
PHP
1
if ('status' === 1) {
Так же и строку можно задать
PHP
1
if ('status' === '1') {
PHP
1
if ('status' == '1') {
0
Невнимательный
 Аватар для ft4l
3112 / 1291 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 2
03.04.2024, 16:57
Цитата Сообщение от Dennz Посмотреть сообщение
сделал так:
PHP
1
$status = $rsc->fields['status'];
Так и для каждого ряда получать надо видимо
это $mails = $rs->getrows();, какое-то нестандартное...
но видимо в итерациях получаете объекты $rsc, если такой синтаксис
напишите там echo '<pre>', var_export([$rsc, $rsc->fields], 1); exit;
чтобы попытаться увидеть первый из получаемых рядов
И да со строкой '0' в условиях тоже должно работать
Code
1
2
3
4
5
  php -r "var_export([(bool)'0',(bool)'1']);"
array (
  0 => false,
  1 => true,
)
0
0 / 0 / 0
Регистрация: 26.09.2023
Сообщений: 71
03.04.2024, 17:50  [ТС]
Цитата Сообщение от ft4l Посмотреть сообщение
это $mails = $rs->getrows();, какое-то нестандартное...
Там везде так сделано)

Полный код выглядит так:

PHP
1
2
3
$sql = "SELECT s.username, s.timestamp FROM users AS s;
$rs = $conn->execute($sql);
$mails = $rs->getrows();
Т.е. мы получили список пользователей и записали его в переменную $mails.

Чтобы вывести username и timestamp в этом списке, в HTML пишу:

HTML5
1
{$mails[i].username} -> {$mails[i].timestamp}
Получается примерно так:

Code
1
2
User1 -> 1687539744
User2 -> 1687535736
Мне хочется по аналогии вывести status (который мы рассчитываем в sql-запросе), т.е. должно быть примерно так:

Code
1
2
User1 -> 1687539744 -> Онлайн
User2 -> 1687535736 -> Оффлайн
Добавлено через 23 минуты
Сейчас использовал такую конструкцию в sql-запросе:

PHP
1
IF (TIMESTAMPDIFF(SECOND, s.timestamp, NOW()) > 300, '1', '0') status
В HTML прописал:

HTML5
1
{$mails[i].status}
Вроде бы работает (нет ошибок в логах), но всегда показывает 0. Хоть больше 300 делай, хоть меньше.

Чувствую что разгадка где-то рядом))
0
Невнимательный
 Аватар для ft4l
3112 / 1291 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 2
03.04.2024, 19:37
Цитата Сообщение от Dennz Посмотреть сообщение
{$mails[i].status}
$mails[$i] ... возможно

Добавлено через 2 минуты
Цитата Сообщение от Dennz Посмотреть сообщение
IF (TIMESTAMPDIFF(SECOND, s.timestamp, NOW()) > 300, '1', '0')
то же что просто TIMESTAMPDIFF(SECOND, s.timestamp, NOW()) > 300 AS status
1
0 / 0 / 0
Регистрация: 26.09.2023
Сообщений: 71
03.04.2024, 20:27  [ТС]
ft4l, огромное спасибо за помощь! Получилось))

В итоге сделал так:

PHP
1
IF (TIMESTAMPDIFF(SECOND, s.datetime, NOW()) < 300, 'Online', 'Offline') AS status
В HTML:

HTML5
1
2
3
4
5
{if $mails[i].status == Online}
*выводим зеленую иконку*
{else}
*выводим красную иконку*
{/if}
Кажется, я понял свою ошибку, а именно не учел, что функция TIMESTAMPDIFF поддерживает форматы DATE и DATETIME, а у меня в поле timestamp используется UNIX_TIMESTAMP.

Но когда я создавал поля для пользователей, то на всякий случай создал еще "дублирующее" поле datetime, куда записываются данные в формате DATETIME. Вот это поле сейчас и пригодилось))

А может быть все таки есть функция, которая считает именно значения в UNIX_TIMESTAMP? Просто в основном я пользуюсь именно UNIX_TIMESTAMP, а DATETIME создавал "на всякий случай".
0
Невнимательный
 Аватар для ft4l
3112 / 1291 / 359
Регистрация: 08.02.2013
Сообщений: 7,566
Записей в блоге: 2
03.04.2024, 20:36
Цитата Сообщение от Dennz Посмотреть сообщение
UNIX_TIMESTAMP
mysql> select UNIX_TIMESTAMP() - UNIX_TIMESTAMP('2024-04-03 21:30:20') > 300;
+----------------------------------------------------------------+
| UNIX_TIMESTAMP() - UNIX_TIMESTAMP('2024-04-03 21:30:20') > 300 |
+----------------------------------------------------------------+
| 1 |
+----------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select UNIX_TIMESTAMP() - UNIX_TIMESTAMP('2024-04-03 21:40:20') > 300;
+----------------------------------------------------------------+
| UNIX_TIMESTAMP() - UNIX_TIMESTAMP('2024-04-03 21:40:20') > 300 |
+----------------------------------------------------------------+
| 0 |
+----------------------------------------------------------------+

Вобщем наверное
IF (UNIX_TIMESTAMP() - s.datetime < 300, 'Online', 'Offline') status
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.04.2024, 20:36
Помогаю со студенческими работами здесь

Как правильно составить такой запрос?
2 таблицы: group - категория товаров с полями id, name_group biggroup - подкатегории товаров с полями id,name,section Связь между...

Как правильно составить запрос с LIMIT?
Здравствуйте. Хочу выбрать 10 пользователей из базы, какие 10 - зависит от страницы, на которой я нахожусь. И что то не получается у меня...

Как правильно составить запрос в запросе?
в таблице есть строки с id: id = 1 id = 2 id = 3 id = 4 id = 5 Как сделать, что бы выборка произошла сверху вниз от маленько...

Подскажите как правильно составить sql запрос
Имеются две никак между собой не связанных табилцы (БД MYSQL), в первой таблице 4 поля и во второй таблице 4 поля, нужно взять какое-нибудь...

PDO как составить правильно запрос к базе данных
Приветствую господа профессионалы, прошу прошения за свою тупость, не могу разобраться с pdo, вот есть код: //Эту страку хочу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru