Как оформить вывод значений в PHP из разных строк БД без повторений?
Я пишу примитивный мессенджер на PHP, в нем есть вкладка сообщения, где я хочу выводить всех пользователей, с кем была начата переписка. Переписки я беру из таблицы MySQL такого типа:
Примерный вид таблицы
+----+-----------------+--------------------+---------------------------------------+---------------------+
| id | sender_username | recipient_username | message | time |
+----+-----------------+--------------------+---------------------------------------+---------------------+
| 1 | Admin | Test | Текст сообщения | 2022-12-03 02:12:31 |
| 2 | Admin | user2 | Текст сообщения | 2022-12-03 02:12:31 |
| 3 | Admin | user1 | Текст сообщения | 2022-12-03 02:12:31 |
| 4 | Test | Admin | Текст сообщения | 2022-12-03 02:12:31 |
| 5 | user2 | Admin | Текст сообщения | 2022-12-03 02:12:31 |
| 6 | Test | Admin | Текст сообщения | 2022-12-03 21:55:32 |
| 7 | Admin | Test | Текст сообщения | 2022-12-03 21:56:54 |
+----+-----------------+--------------------+---------------------------------------+---------------------+
В PHP я пробовал выводить это так:
Вывод
<?php foreach ($get_messages as $message) { if ($message['sender_username'] === $_COOKIE['username']) { echo '<li>'.$message['recipient_username'].'</li>'; } elseif ($message['recipient_username'] === $_COOKIE['username']) { echo '<li>'.$message['sender_username'].'</li>'; } } ?> |
<?php foreach ($get_messages as $message) { if ($message['sender_username'] === $_COOKIE['username']) { echo '<li>'.$message['recipient_username'].'</li>'; } elseif ($message['recipient_username'] === $_COOKIE['username']) { echo '<li>'.$message['sender_username'].'</li>'; } } ?>
$get_messages содержит следующую функцию:
Функция
function get_messages() { global $link; $sql = "SELECT * FROM messages"; $object = mysqli_query($link, $sql); $result = mysqli_fetch_all($object, MYSQLI_ASSOC); return $result; } $get_messages = get_messages(); |
function get_messages() { global $link; $sql = "SELECT * FROM messages"; $object = mysqli_query($link, $sql); $result = mysqli_fetch_all($object, MYSQLI_ASSOC); return $result; } $get_messages = get_messages();
Но таким образом получается, что мне выводятся имена пользователей каждого сообщения, появляются дубли. Через DISTINCT не получается, поскольку даже если значение столбца одинаковое, то строка универсальна.
Подскажите пожалуйста, может как-то по другому оформить структуру таблиц или выводить имена по другому принципу?
upd:
Чтобы было проще понять, закинул сделанную часть на хостинг:
URL
f0734496.xsph.ru
Дополнительно:
Ну-ну.. валим всё в кучу, перемешиваем, потом пробуем разобраться, что получилось...
Правильное обращение к данным - это одна задача.
Запрос, возвращающий нужные данные - вторая задача.
Форматирование результата запроса в требуемый html - третья задача.
Если решать их все сразу - ни одна не будет решена.
$username = $_COOKIE['username']; $sql = "SELECT sender_username users FROM messages WHERE recipient_username = '$username' UNION SELECT recipient_username FROM messages WHERE sender_username = '$username'"; |
$username = $_COOKIE['username']; $sql = "SELECT sender_username users FROM messages WHERE recipient_username = '$username' UNION SELECT recipient_username FROM messages WHERE sender_username = '$username'";
Ответы:
$sql = "SELECT DISTINCT(`recipient_username`) FROM `messages` WHERE sender_username = ".$_COOKIE['username']; |
$sql = "SELECT DISTINCT(`recipient_username`) FROM `messages` WHERE sender_username = ".$_COOKIE['username'];
- Это был хороший вариант, но получается, что если пользователю написал новый человек, то его юзернейм не выведется.
Решение было таким простым, что я решил перепройти свой курс sql:
sql запросSELECT sender_username users FROM messages WHERE recipient_username = '$username' UNION SELECT recipient_username FROM messages WHERE sender_username = '$username'
SELECT sender_username users FROM messages WHERE recipient_username = '$username' UNION SELECT recipient_username FROM messages WHERE sender_username = '$username'
Получается, что был выведен один столбец со всеми именами пользователей, с которыми пересекался $_COOKIE['username'], а UNION не только объединил, но и убрал дубли.
Это я все описал, если вдруг у кого-то возникнет подобный вопрос.
- Твой запрос выдает ровно то же самое что и в моем варианте. Не пойму почему ты решил, что если пользователю напишет новый человек то он не выведется? Если в таблице есть запись то она в любом случае выведется.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для вывода значений из разных строк базы данных без повторений в PHP, можно воспользоваться массивом для хранения уникальных значений и проверкой наличия каждого значения в этом массиве перед выводом.
Пример кода на PHP:
// Подключение к базе данных $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; $conn = new mysqli($servername, $username, $password, $dbname); // Проверка соединения if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // SQL запрос к базе данных $sql = "SELECT DISTINCT column_name FROM table_name"; $result = $conn->query($sql); if ($result->num_rows > 0) { // Создаем массив для хранения уникальных значений $unique_values = array(); // Выводим каждое уникальное значение while($row = $result->fetch_assoc()) { $value = $row["column_name"]; // Проверяем, есть ли значение в массиве if (!in_array($value, $unique_values)) { // Выводим значение echo $value . "<br>"; // Добавляем значение в массив array_push($unique_values, $value); } } } else { echo "0 results"; } $conn->close();
В данном примере кода мы выполняем SQL запрос к базе данных, выбирая уникальные значения из определенного столбца. Затем мы создаем массив для хранения уникальных значений и выводим каждое значение только в том случае, если оно еще не было добавлено в массив. Таким образом, мы избегаем повторений при выводе значений из разных строк базы данных.