У меня есть таблица сообщений:
mysql> describe messages;
+-----------+--------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+-------------------+-----------------------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user1_id | int(11) | NO | | NULL | |
| user1 | varchar(255) | NO | | NULL | |
| user2_id | int(11) | NO | | NULL | |
| user2 | varchar(255) | NO | | NULL | |
| message | text | YES | | NULL | |
| timestamp | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| user1read | varchar(3) | NO | | NULL | |
| user2read | varchar(3) | NO | | NULL | |
+-----------+--------------+------+-----+-------------------+-----------------------------+
9 rows in set (0.00 sec)
И тогда у меня есть заблокированная таблица:
mysql> describe blocked;
+-----------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------+------+-----+---------+-------+
| user_id | int(11) | NO | PRI | NULL | |
| blocked_user_id | int(11) | NO | PRI | NULL | |
+-----------------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
То, что я пытаюсь сделать, - это заставить все данные отображаться в отдельных элементах на странице. Этот скрипт вызывается каждую секунду. Запрос, который я закончил, дал все сообщения, независимо от статуса блокировки.
Итак, допустим, мой идентификатор равен 1, а заблокированный идентификатор пользователя равен 5, пользователь 5 не должен отображаться в списке. То же самое относится и к другому пользователю, если он вошел в систему.
Поработав некоторое время с этим запросом, я попытался выполнить второй запрос. Это было еще хуже, потому что ничего не появилось на странице, несмотря на то, что данные возвращались с записями SQL вручную, используя тот же запрос.
Файл довольно маленький, поэтому я просто опубликую все:
Редактировать: Первый запрос фактически отображает все сообщения, включая меня, как сообщение, что, очевидно, неправильно. Похоже, мои запросы разбиты больше, чем я думал.
<?php
session_start();
include '../../../config/DB.php';
$username = $_SESSION['logged_in']; //to use in queries
try {
$db = new DB(); //new DB object
} catch (Exception $e) {
$e->getMessage();
}
try {
$names = array(); //to store during foreach iterations
//get the id for the other query attempt
$id_result = $db->getRow('SELECT id FROM users WHERE username=?', [$username]);
$id = $id_result['id'];
foreach ($messages_result = $db->getRows('SELECT messages.user1, messages.user2, messages.timestamp, messages.message, messages.user2read, users.avatar
FROM messages
LEFT JOIN users ON messages.user1 = users.username
WHERE messages.user2 = ? AND
(users.id NOT IN (SELECT user_id FROM blocked))
OR (users.id NOT IN (SELECT blocked_user_id FROM blocked))
ORDER BY timestamp DESC', [$username]) as $result) {
$sender = $result['user1'];
$time = $result['timestamp'];
$message = $result['message'];
$avatar = $result['avatar'];
$user2read = $result['user2read'];
//Do this so users will only show once.
//One div per user, and when clicked
//all messages are shown elsewhere on a page.
if (!in_array($sender, $names)) {
$names[] = $sender;
//If the message is unread, show name in bold
//Else show regular text
//$avatar has been removed from the html for now
//It shows up in an <img> tag
if ($user2read === 'no') {
echo '<div id="single_message" data-sender="' . $sender . '"><p style="padding-left:8px;"><p><a class="link" style="font-weight:bold;font-size:16px;" href=' . $sender . '>' . $sender . '</a></strong></p><p style="white-space:pre-wrap;margin-left:8px;margin-right:8px;">' . $message . '</p><p style="padding-left:8px;border-bottom: 1px solid #ccc;">' . $time . '</p></div>';
} else {
echo '<div id="single_message" data-sender="' . $sender . '"><p style="padding-left:8px;"><p><a class="link" href=' . $sender . '>' . $sender . '</a></p><p style="white-space:pre-wrap;margin-left:8px;margin-right:8px;">' . $message . '</p><p style="padding-left:8px;border-bottom: 1px solid #ccc;">' . $time . '</p></div>';
}
} else {
continue;
}
}
} catch (Exception $e) {
}
Вот второй запрос, который я пробовал (я просто покажу foreach). Это тот, который ничего не показывает на странице.
foreach($messages_result = $db->getRows('SELECT * FROM messages m LEFT JOIN blocked b ON ((m.user1_id = b.user_id OR m.user2_id = b.user_id)
AND (m.user1_id = b.blocked_user_id OR m.user2_id = b.blocked_user_id))
WHERE (m.user1_id = 1 OR m.user2_id = 1) HAVING m.user_id IS NULL
ORDER BY timestamp DESC', [$id]) as $result) {
Я что-то здесь упускаю?