2015-06-24 72 views
0

我有一個基本的php聊天室。每個「房間」都有自己的桌子。在每個房間表內,都會發布單個消息,每條消息一行。列如下:PHP MYSQL:如何顯示基於忽略列表的聊天室消息

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>"; 
    }}}} 

回答

0

我們爲什麼不使用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 

警告......我還沒有測試尚未...

+0

謝謝。這將是幾個小時才能回家,並試試這個。但只要我嘗試它,我會讓你知道。我不知道我可以在mysql語句中使用數組。 – cjackson

+0

它不是一個數組,我使用implode來連接數組元素並將結果作爲字符串返回,以便在MySQL語句中使用它。更多在這裏[php implode](http://php.net/implode) – user1422758

+0

這半工作。我不得不修改它。它不會在查詢中使用($ where)返回有效的mysql結果。我必須這樣做 '$ 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「;' 以防萬一你想編輯你的答案 – cjackson