PHP MYSQL: как отображать сообщения чата на основе списка игнорирования

У меня есть базовый чат php. В каждой «комнате» есть свой стол. в каждой таблице комнаты публикуются отдельные сообщения, по одной строке на одно сообщение. столбцы следующие:

id, sender, message

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

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

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

Вот функция, которая отображает мои сообщения в чате:

function showroom($room, $len, $link){
  $query3 = "SELECT * FROM(SELECT `message`, `id`, `sender` FROM `$room` ORDER BY `id` DESC LIMIT $len) AS `id` ORDER BY `id` ASC";
  $result3 = mysqli_query($link, $query3); // execute the query
  if (mysqli_num_rows($result3) > 0) {
    while($row = mysqli_fetch_assoc($result3)) {
      $showmsg = htmlspecialchars_decode($row["message"]);
      echo "$showmsg<br>";
    }}}

Как я могу использовать таблицу списка игнорирования, чтобы каким-то образом получать сообщения из указанной выше функции, но исключать любое количество людей, которые появляются в списке игнорирования?

для дальнейшего справки... таблица списка игнорирования просто представляет собой одну большую таблицу для всех пользователей. каждый раз, когда пользователь добавляет кого-то в свой список игнорирования, он вставляет строку в таблицу ignore_list со столбцами:
id, person_being_ignored, name_of_ignore_list_owner

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

query = "SELECT * FROM `ignore_lists` WHERE `ignore_owner`='$id' ORDER BY `person_being_ignored` ASC";
$result = mysqli_query($link, $query); // execute the query

if (mysqli_num_rows($result) > 0) {

  while($mrow = mysqli_fetch_array($result)) {

    $ignoree_name = $mrow['name_of_ignored'];

    $query3 = "SELECT * FROM `$room` WHERE sender <> '$ignoree_name'";
    // $query3 = "SELECT * FROM(SELECT `message`, `id`, `timestamp`, `color` FROM `$room` WHERE sender <> '$ignoree_name' ORDER BY `id` DESC LIMIT $len) AS `id` ORDER BY `id` ASC";
    $result3 = mysqli_query($link, $query3); // execute the query
  }
  while($row = mysqli_fetch_array($result3)) {
    $showmsg = htmlspecialchars_decode($row["message"]);
    echo "$showmsg<br>";
  }

} elseif(mysqli_num_rows($result) < 1) {

  $query3 = "SELECT * FROM(SELECT `message`, `id`, `timestamp`, `color` FROM `$room` ORDER BY `id` DESC LIMIT $len) AS `id` ORDER BY `id` ASC";
  $result3 = mysqli_query($link, $query3); // execute the query

  if (mysqli_num_rows($result3) > 0) {
    while($row = mysqli_fetch_assoc($result3)) {
      $showmsg = htmlspecialchars_decode($row["message"]);
      echo "$showmsg<br>";
    }}}}

person cjackson    schedule 24.06.2015    source источник


Ответы (1)


Почему бы нам не использовать инструкции WHERE NOT IN SQL...

$ignoree_name = [];
while($mrow = mysqli_fetch_array($result)) {
    $ignoree_name[] = $mrow['name_of_ignored'];
}
$query3 = "SELECT * FROM(SELECT message, id, timestamp, color FROM $room WHERE sender NOT IN ( '" . implode($ignoree_name, "', '") . "' ) ORDER BY id DESC LIMIT 99) AS id ORDER BY id ASC";
$result3 = mysqli_query($link, $query3); // execute the query

Предупреждение... Я еще не проверял...

person user1422758    schedule 24.06.2015
comment
благодарю вас. Это будет через пару часов, прежде чем я смогу вернуться домой и попробовать это. но я дам вам знать, как только я попробую. я не знал, что могу использовать массив в выражении mysql. - person cjackson; 24.06.2015
comment
Это не массив, я использовал implode для объединения элементов массива и возврата результата в виде строки, чтобы его можно было использовать в операторе MySQL. Подробнее здесь php implode - person user1422758; 25.06.2015
comment
этот полу работал. Я должен был изменить это все же. он не вернется с допустимым результатом mysql, используя ($wherein) в запросе. мне пришлось сделать это так $query3 = "SELECT * FROM(SELECT message, id, timestamp, color FROM $room WHERE sender NOT IN ( '" . implode($ignoree_name, "', '") . "' ) ORDER BY id DESC LIMIT 99) AS id ORDER BY id ASC"; на случай, если вы захотите отредактировать свой ответ - person cjackson; 25.06.2015
comment
Да, я забыл цитату. - person user1422758; 25.06.2015