previned Ответов: 2

Как подсчитать получатель и отправитель непрочитанных сообщений в PHP


Я создаю скрипт подсчета непрочитанных сообщений получателя и отправителя в php mysqli. у меня есть одна проблема, я добавил скрипт sql count в свой существующий код, он не работает. отображение такого сообщения об ошибке

Fatal error: Call to a member function get_result() on boolean in C:\xampp\htdocs\demo\npm\cons.php on line 123



Я добавил код здесь
(SELECT from_id, COUNT(*) unread FROM pm WHERE to_id=? AND read='0' GROUP BY from_id)


эта проблема с кодом здесь
from_id, COUNT(*) 


когда я удалил это рабочее, но отображающее одни и те же непрочитанные сообщения все от пользователей.

отображение тех же результатов, что и это

user1 unread message 2
user2 unread message 2
user3 unread message 2



Я хочу получить вот такие результаты

user1 unread message 2
user2 unread message 7
user3 unread message 4


мой ПМ таблице базы данных
id  from_id     to_id    msg               sent_date              read
1   2           3        hi how are you?   2019-12-05 04:14:20    1
2   3           2        fine              2019-12-05 05:15:58    0
3   2           3        hi                2019-12-05 03:20:34    1
4   5           2        hi                2019-12-05 08:30:40    0


Вот мой исходный код

 <?php
  if (isset($_SESSION['userid'])) {
     $session_id = $_SESSION['userid'];
  }


 $sql = "SELECT *,

(SELECT username FROM users WHERE userid=from_id) AS from_username,
(SELECT username FROM users WHERE userid=to_id) AS to_username,
(SELECT username FROM users WHERE userid=?) AS my_username,
(SELECT from_id, COUNT(*) unread FROM pm WHERE to_id=? AND read='0' GROUP BY from_id)


 FROM pm WHERE from_id = ? or to_id=?   ORDER BY id DESC";

 if ($stmt->prepare($sql)) {
    $stmt->bind_param('iiii', $session_id, $session_id,$session_id,$session_id);
    $stmt->execute();
    $result = $stmt->get_result();
    while ($row = $result->fetch_assoc()) {
       echo $row['from_username'] . " -> " . $row['to_username'] . "<br>";
       echo 'User ' . $row['from_id'] . ' - ' . $row['unread'];
    }
   }
 ?>


Что я уже пробовал:

(SELECT from_id, COUNT(*) unread FROM pm WHERE to_id=? AND read='0' GROUP BY from_id)

Пожалуйста, кто-нибудь может мне помочь, я много пытался создать это. спасибо.

Richard MacCutchan

Где находится линия 123?

2 Ответов

Рейтинг:
1

W∴ Balboos, GHB

Может быть, я не очень хорошо понимаю MySQL (хотя и использую его несколько), но ваше использование count() находится в ошибке: Функция MySQL COUNT() [^]

(SELECT from_id, COUNT(*) FROM pm WHERE to_id=? AND read='0' GROUP BY from_id)
Это должно быть больше похоже:
SELECT from_id, count(unread) from . . . group by from_id, unread.


Пропущенная запятая после count() была бы проблемой.
Отсутствие непрочитанного в группе-by вызывает совокупную проблему (ошибку).
Как и при использовании count(*) вместо count(одно из агрегированных значений).

Это только начало.


previned

я добавил вам скрипт но Fattel сообщение об ошибке дисплей

W∴ Balboos, GHB

Мой сценарий с " ... " не был сценарием. Это был пример, показывающий начало и конец запроса. Другими словами, она была неполной (вот что значит...).

Если ошибка была чем-то другим, то вы должны помнить, что если вы не опубликуете сообщение об ошибке, никто не сможет решить ваши проблемы.

previned

пожалуйста, помогите мне, я много пробовал

W∴ Balboos, GHB

В своем первоначальном ответе я дал вам ссылку на учебник, который делает его очень простым с примерами. Пожалуйста, пойдите туда и посмотрите, как это должно быть сделано, и тогда вы сможете поймите, почему ваш не работает.

previned

я не могу понять брат плз помоги мне я пробовал один месяц но все равно не смог этого сделать

Рейтинг:
1

tninis

Привет от моего нетребовательного, вы хотите проверить, сколько непрочитанных сообщений у пользователя в общей сложности, а не по каждому пользователю, с которым он общается.

для одного пользователя

SELECT u.username ,COUNT(*) unread FROM pm join Users u
on pm.to_id=u.Id
 WHERE pm.to_id=? isReaded=0 GROUP BY u.Firstname



для всех пользователей
SELECT u.username ,COUNT(*) unread FROM pm join Users u
on pm.to_id=u.Id
 WHERE isReaded=0 GROUP BY u.username 


previned

не работает отображение фатальной ошибки: вызов функции-члена get_result() на boolean in C:\xampp\htdocs\demo\npm\cons.php на линии 423

tninis

Проверить это
https://stackoverflow.com/questions/42177605/error-call-to-a-member-function-get-results

previned

теперь проблема один за другим пользователи непрочитанное сообщение не считая отображения одной и той же строки пример user1 непрочитанное 2,user2 непрочитанное 2, userid3 непрочитанное 2,

tninis

покажите мне точно запрос, который вы используете ,
я тестировал на тестовой базе данных и работал

previned

пожалуйста, помогите мне, я много пытался создать

previned

один за другим сообщения пользователей не считая отображения одной и той же строки

previned

я добавил примерно так $sql = "SELECT *,

(Выберите имя пользователя из пользователей, где userid=from_id) как from_username,
(Выберите имя пользователя из списка пользователей, где userid=to_id) как to_username,
(Выберите имя пользователя из списка пользователей, где userid=?) Как my_username,

(Выбрать количество(*) из непрочитанных ПМ присоединяйтесь к пользователям по ЛС.from_id=у.идентификатор пользователя, где to_id=? и pm.from_id=u.userid и read=0 group by from_id)как непрочитанные

Из ПМ где from_id = ? или to_id=? Заказа по ID по убыванию";

previned

когда я добавил сюда вот так SELECT u.username , он не работает fattal error message display

tninis

исходя из моего понимания и основываясь на схеме таблицы pm, чтобы получить непрочитанное сообщение пользователя, вы не должны выполнять вышеприведенный запрос, который вы опубликовали.
Пользователь из "to_id" получает сообщение, и у него есть непрочитанное сообщение, а не пользователь из "from_id" .
Вы сказали, что хотите получить такой результат, как :

пользователь1 непрочитанное сообщение 2
пользователь2 непрочитанное сообщение 7
пользователь3 непрочитанное сообщение 4

поэтому возьмите запрос "для всех пользователей" из решения, которое я представил, и протестируйте его, он покажет имена пользователей и общее количество непрочитанных сообщений для каждого пользователя.

previned

я проверил, но те же результаты фатальная ошибка: вызов функции-члена get_result() на boolean in C:\xampp\htdocs\demo\npm\cons.php на линии 417

previned

я проверил вот так $sql = "

Выберите у.имя пользователя ,функция count(*) непрочитанное ТЧ присоединиться пользователи
по ТЧ.to_id=у.ID пользователя
Где read=0 GROUP BY u.username )как непрочитанный

Из ПМ где from_id = ? или to_id=? Заказа по ID по убыванию";

previned

но те же результаты ошибка

tninis

попробовать это
Выберите у.имя пользователя,функция count(*) непрочитанное ТЧ присоединиться пользователи
по ТЧ.to_id=у.ID пользователя
Где from_id = ? или to_id=? и isReaded=0 группа по u.username

previned

не работает brother display like this Notice: Undefined index: from_id in C:\xampp\htdocs\demo\npm\cons.php на линии 423
Пользователь - 2

tninis

ладно покажи мне это cons.php на этой линии

previned

не считая

previned

можете ли вы соединить это как два состояния sql с одним sql1= и sql2= вот так

previned

можете ли вы добавить вот так
$sql1 = "SELECT from_id, COUNT(*) unread FROM pm WHERE to_id=? И read='0' GROUP BY from_id";

$sql2 = "SELECT *,

(Выберите имя пользователя из пользователей, где userid=from_id) как from_username,
(Выберите имя пользователя из списка пользователей, где userid=to_id) как to_username,
(Выберите имя пользователя из списка пользователей, где userid=?) Как my_username


Из ПМ где from_id = ? или to_id=? Заказа по ID по убыванию";