2016-07-29 34 views
0

我创建MySQL中的表下列:集团消息在PHP MySQL的

id - from_id - to_id - datetime - message

我的PHP代码:

$user = $_SESSION['user']; 

$sql= "SELECT * FROM messages where to_id=".$user; 

$result = $conn->query($sql); 

echo "<table><tr><td>FROM</td><td>MESSAGE</td></tr>"; 

while($row=mysqli_fetch_assoc($result)){ 
    $from = $row['from_id']; 
    $message = $row['message']; 

    if(count($from) >1){ 
     echo "More than 1 message from ".$from; 
    } 

    echo "<tr><td>".$from."</td><td>".$message."</td></tr>"; 

} 
echo "</table>"; 

我可以得到所有发送到用户的消息。但我也得到消息发送来自同一用户在不同的行。例如,如果user2发送了user1 4条消息,则列表中将列出所有4条消息。我只需要一行user2,当我点击行时,我会看到来自该用户的所有消息。但在这个页面上,我想看到最新的消息只有1行。

我该如何做到这一点?

+1

您是否尝试过''from' from_id? – Tamil

+0

请向我们展示一些样品数据和您想要的结果。 – Blank

+2

**警告**:使用'mysqli'时,应该使用[参数化查询](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)和['bind_param']( http://php.net/manual/en/mysqli-stmt.bind-param.php)将用户数据添加到您的查询中。 **不要**使用字符串插值或连接来完成此操作,因为您创建了严重的[SQL注入漏洞](http://bobby-tables.com/)。 **绝不**将'$ _POST'或'$ _GET'数据直接放入查询中,如果有人试图利用您的错误,这会非常有害。 – tadman

回答

1
SELECT * FROM (
    SELECT * FROM messages 
    ORDER BY datetime DESC 
) as temp_messages 
GROUP BY from_id 

内部查询通过datetime对记录进行排序,使最后记录在第一位。
外部查询组记录并为您提供第一条记录,这是相应用户的最新记录。

这将给你单行与来自各个用户的最新消息。点击行后,您想从该用户获取所有记录。这必须分开实施。不在此范围内考虑。

+0

这是如何解决具有多条消息的标记from_id的实际问题?此外,这是无效的SQL,信任的随机行为的MySQL。 – Philipp

+0

@Philipp:你指的是什么随机行为?你能否详细说明一下?我想这完全解决了这个问题。我一定希望听到你的意见。 –

+0

如果同一个from_id出现多次,你没有指定要获取哪个'message',你将它留给mysql来决定。那么你绝对不是指'echo“来自”。$ from“的多于1条消息,这是实际的问题 – Philipp

-1

第一张:How can I prevent SQL injection in PHP?您的脚本很危险,请使用准备好的语句以userdata访问数据库。

在php中,你可以这样做,如果你正在计划一些其他的消息,可能会很好。

$messages = array(); 
while($row = mysqli_fetch_assoc($result)){ 
    $messages[$row['from_id']][] = $row['message']; 
} 
foreach ($messages as $key => $messagesByFrom) { 
    if(count($messagesByFrom) >1){ 
     echo "<tr><td>More than 1 message from " . $key. "</td><td></td></tr>"; 
    } else { 
     echo "<tr><td>".$key ."</td><td>".$messagesByFrom[0]."</td></tr>"; 
    } 
} 

为了测试它:

$messages = array(
    '1' => array('hello', 'world'), 
    '2' => array('whaddup'), 
); 
echo '<table>'; 
foreach ($messages as $key => $messagesByFrom) { 
    if(count($messagesByFrom) >1){ 
     echo "<tr><td>More than 1 message from " . $key . "</td><td></td></tr>"; 
    } else { 
     echo "<tr><td>".$key."</td><td>".$messagesByFrom[0]."</td></tr>"; 
    } 
} 
echo '</table>'; 

现在,你应该为属性添加的$from_id与多个消息数据集的<tr>,则可以设置在该行的单击事件的事件监听,发送将该id添加到您的后端并返回消息。