2016-07-29 3 views
0

ich eine Tabelle in MySQL mit folgenden Spalten erstellt haben:Gruppe Messaging in php mysql

id - from_id - to_id - datetime - message

Mein PHP-Code ist:

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

Ich kann alle Nachrichten an den Benutzer geschickt bekommen . Aber ich bekomme auch Nachrichten von demselben Benutzer in verschiedenen Zeilen. Wenn beispielsweise Benutzer2 Benutzer1 4 Nachrichten gesendet hat, sind alle 4 Nachrichten in dieser Liste aufgeführt. Ich möchte nur eine Zeile für den Benutzer2 und wenn ich auf die Zeile klicke, sehe ich alle Nachrichten von diesem Benutzer. Aber auf dieser Seite möchte ich nur 1 Zeile mit der letzten Nachricht sehen.

Wie kann ich das erreichen?

+1

Haben Sie 'group by' aus_id versucht? – Tamil

+0

Bitte zeigen Sie uns einige Beispieldaten und Ihr gewünschtes Ergebnis. – Blank

+2

** WARNUNG **: Wenn Sie 'mysqli' verwenden, sollten Sie [parametrisierte Abfragen] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) und [' bind_param'] (http://php.net/manual/en/mysqli-stmt.bind-param.php), um Benutzerdaten zu Ihrer Abfrage hinzuzufügen. ** Verwenden Sie NICHT ** String-Interpolation oder Verkettung, um dies zu erreichen, weil Sie einen schwerwiegenden [SQL injection bug] erstellt haben (http://bobby-tables.com/). ** NIEMALS ** $ _POST 'oder' $ _GET' Daten direkt in eine Abfrage einfügen, es kann sehr schädlich sein, wenn jemand versucht, Ihren Fehler auszunutzen. – tadman

Antwort

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

Inner Abfrage wird die Datensätze von datetime ersten letzter Datensatz zu machen.
Äußere Abfrage gruppiert Datensätze und gibt Ihnen den ersten Datensatz, der vom jeweiligen Benutzer erstellt wurde.

Dies wird Ihnen eine Zeile mit der neuesten Nachricht vom jeweiligen Benutzer geben. Wenn Sie auf Zeile klicken, möchten Sie alle Datensätze von diesem Benutzer abrufen. Dies muss separat implementiert werden. In diesem Umfang nicht berücksichtigt.

+0

Wie löst dies das eigentliche Problem der Markierung von from_id, die mehr als eine Nachricht haben? Auch dies ist ungültig sql und vertraut auf zufälliges Verhalten von mysql. – Philipp

+0

@Philipp: Auf welches zufällige Verhalten beziehen Sie sich? Kannst du bitte etwas ausarbeiten? Ich stelle mir vor, dass dies das Problem vollständig löst. Ich würde sicherlich gerne Ihre Kommentare hören. –

+0

Sie geben nicht an, welche 'Nachricht' zu holen ist, wenn die gleiche from_id mehrfach da ist. Sie überlassen es mysql, zu entscheiden. Dann beziehen Sie sich in keiner Weise auf "echo" Mehr als 1 Nachricht von ". $ From;" Das war das eigentliche Problem – Philipp

-1

Erste: How can I prevent SQL injection in PHP? Ihr Skript ist gefährlich, verwenden Sie vorbereitete Anweisungen für den Zugriff auf die Datenbank mit userdata.

In php könnten Sie es so machen, könnte gut sein, wenn Sie einige andere Dinge mit den Nachrichten planen.

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

es testen:

$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>'; 

Jetzt sollten Sie die $from_id als Attribut in den <tr> von Datensatz mit mehreren Nachrichten hinzufügen möchten, dann können Sie einen Eventlistener auf dem Click-Ereignis dieser Zeile gesetzt, das Senden die ID zu Ihrem Backend und die Nachrichten zurückgeben.