Kannste doch. Du musst nur für den Absender eine eigene Verlinkung in die Link-Tabelle speichern. Und dann kann er sie auch löschen. Die Nachricht darf dabei nur nicht ganz aus dem System verschwinden. Erst wenn alle Empfänger die Nachricht gelöscht haben, darf die Nachricht komplett verschwindenIch wollte schon einen Menüpunkt "Gesendet" machen, bei dem man gesendete Nachrichten löschen kann, aber das gibt's jetzt nicht mehr.
Wenn ein Absender seine Nachrichten nach dem senden bearbeiten oder löschen kann, dann kann er sich auch der Verantwortung/Haftung für den Inhalt entziehen.
Theoretisch machbar. Praktisch hat man dafür aber in der nicht-öffentlichen Kommunikation kaum einen wirklichen Nutzen.Grundsätzlich richtig, aber mit Einschränkungen. Meiner Meinung nach spricht nichts dagegen eine Nachricht bearbeiten oder löschen zu können, solange der Empfänger die Nachricht noch nicht gelesen hat. Im Prinzip bietet das bspw. auch Google Mail an, wenn ich mich recht erinnere. So kann man da in den ersten paar Sekunden nach dem man die Nachricht "gesendet" hat, diese widerrufen. Bei einer Mail geht das natürlich nur in einem gewissen Zeitfenster in dem man das Absenden verzögert. Schließlich kann man bei einer Mail nicht kontrollieren wann der Empfänger die Nachricht liest. Auch ist es prinzipiell unbedenklich eine Bearbeitungsfunktion einzuführen, solange für alle Beteiligten jede Bearbeitung nachvollziehbar ist. (nen bisschen so wie Facebook das momentan macht) Dazu bräuchte man dann neben der msg_id auch noch eine msg_version. Durch das Paar aus msg_id und msg_version wird die Nachricht eindeutig identifiziert. Sowohl Empfänger als auch Absender müssen jede Version der Nachricht sehen können. So kann bspw. standardmäßig die neuste Version der Nachricht angezeigt werden und nach Bedarf ältere Versionen geladen werden.
SELECT username FROM users WHERE username LIKE ?
SELECT u.username, g.group_name FROM users u LEFT JOIN groups g WHERE u.username LIKE ? OR g.group_name LIKE ?
Bestes Beispiel: Mein Post.Theoretisch machbar. Praktisch hat man dafür aber in der nicht-öffentlichen Kommunikation kaum einen wirklichen Nutzen.
Ich habe nochmal eine Frage abseits der Frage, wie es sich mit dem Löschen von Nachrichten verhält.
Ich möchte ja mit der Eingabe in ein Textfeld, Vorschläge bekommen, welche Benutzer oder Gruppen es gibt, je nachdem welche drei Buchstaben ich in das Textfeld eingetippt habe.
Dazu hatte ich folgende Query, welche nur für Benutzer funktionierte:
? wäre hier: "%benutzereingabe%"Code:SELECT username FROM users WHERE username LIKE ?
Für eine Query, welche Gruppen und Benutzer einschließt hatte ich folgende Idee:
Beide ? wären hier: "%benutzereingabe%"Code:SELECT u.username, g.group_name FROM users u LEFT JOIN groups g WHERE u.username LIKE ? OR g.group_name LIKE ?
Die letzte Query funktioniert nur leider nicht. Wie lässt sich das am besten realisieren?
Alles klar, hab jetzt einfach zwei Queries hintereinander. Gibt es eigentlich eine Möglichkeit einen Unique Key über zwei Tabellen zu verteilen? Ich würde gerne das eine Gruppe nicht den Namen eines Benutzers haben kann.
SELECT name FROM user WHERE name LIKE ? UNION SELECT name FROM groups WHERE name LIKE ?
Sie ist nicht nur "nicht elementar", sie ist auch in der "nicht-öffentlichen/privaten" Kommunikation nicht gewollt. Nachrichten/Messages sollen nach dem Absenden nicht änderbar sein. Da hilft einem eine Versionskontrolle auch nicht weiter. Der Inhalt ist geändert! Stell dir doch einmal vor hier auf dem Marktplatz verkauft einer etwas für 50 €. Der Käufer willigt ein und der Verkäufer ändert dann einfach den Preis nach der Einwilligung auf 100 €. Man ermöglicht so etwas garnicht erst. Dein Googlemail-Beispiel ist da anders. Die Mail wird erst nach einer gewissen Zeit verschickt (sie ist also noch nicht gesendet). Aber ein PN-System trägt nach dem Absenden die Nachricht in die Datenbank ein und der Empfänger greift darauf zu. Mann kann natürlich auch hier einen Zeitpuffer einbauen. Aber man kann es auch einfach lassen und die Nachricht nach dem Absenden stehen lassen.Bestes Beispiel: Mein Post.
Gepostet, dann noch editiert um es besser zu erklären, bzw. Punkte zu ergänzen. Und ich denke viele kennen es Nachrichten zu schicken und kurz darauf zu denken "Ach quatsch, hätt ich jetzt nicht senden müssen."
Aber klar, elementar ist so eine Funktion nicht. Kann aber ganz praktisch sein.
Array
(
[0] => Admins (Gruppe)
[1] => Benutzer (Gruppe)
[2] => testbenutzer
)
SELECT ug.user_id FROM users_groups ug LEFT JOIN groups g ON g.group_id = ug.group_id WHERE g.group_name = ?
Sie ist nicht nur "nicht elementar", sie ist auch in der "nicht-öffentlichen/privaten" Kommunikation nicht gewollt. Nachrichten/Messages sollen nach dem Absenden nicht änderbar sein. Da hilft einem eine Versionskontrolle auch nicht weiter. Der Inhalt ist geändert! Stell dir doch einmal vor hier auf dem Marktplatz verkauft einer etwas für 50 €. Der Käufer willigt ein und der Verkäufer ändert dann einfach den Preis nach der Einwilligung auf 100 €. Man ermöglicht so etwas garnicht erst.
Dein Googlemail-Beispiel ist da anders. Die Mail wird erst nach einer gewissen Zeit verschickt (sie ist also noch nicht gesendet). Aber ein PN-System trägt nach dem Absenden die Nachricht in die Datenbank ein und der Empfänger greift darauf zu. Mann kann natürlich auch hier einen Zeitpuffer einbauen. Aber man kann es auch einfach lassen und die Nachricht nach dem Absenden stehen lassen.
Dein Post ist in einem Forum (öffentliche Kommunikation). Hier kann man sich nicht nur auf den Text, sondern auch auf andere Teilnehmer, die das gesehen haben, berufen. Bei PN's, Instant Messaging, Privatchats, E-Mail, Brief und Co. geht das natürlich nicht. Und ich persönlich würde auch ein PN-System nicht nutzen wollen, wo man nachträglich die Nachrichten ändern kann. Solchen PN-Systemen, wo ich beschissen werden kann, traue ich grundsätzlich nicht
Hi,
Ich habe mich nun auch dazu entschieden, Gruppen und Benutzernamen voneinander zu trennen. Ich habe jetzt, wenn der Nutzer eine Gruppe auswählt hinter dem Gruppennamen in einer Klammer die Anmkerung "Gruppe". Das heißt, wenn der Nutzer eine Gruppe auswählt, sieht es so aus: "Gruppenname (Gruppe)".
Ich arbeite jetzt auch schon am Backend und habe die Benutzernamen sowie Gruppennamen schon in einem Array, das bisher so aussieht:
Code:Array ( [0] => Admins (Gruppe) [1] => Benutzer (Gruppe) [2] => testbenutzer )
//Variablen + Überprüfung dieser
if (isset($_POST["ajax_empfaenger"], $_POST["ajax_betreff"], $_POST["ajax_nachricht"])) {
$input_betreff = $_POST["ajax_betreff"];
$input_names = $_POST["ajax_empfaenger"];
$input_nachricht = $_POST["ajax_nachricht"];
} else {
echo 'Fehler: Es wurden keine Daten übertragen.';
exit;
}
if (empty($input_betreff) OR empty($input_names) OR empty($input_nachricht)) {
echo 'Fehler: Nicht alle Felder ausgefüllt.';
exit;
}
//Letztes Komma des Strings wird entfernt
$input_names2 = rtrim(trim($input_names), ',');
//String zu Array
$input_names3 = explode(', ', $input_names2);
//Array wird neu sortiert (wenn ein Name/Wert das Wort "(Gruppe)" enthält, wird der Wert zum Index ["gruppe"] gegeben, andernfalls kommt der Wert in den ["user"]-Index)
foreach ($input_names3 as $wert) {
if (strpos($wert,'(Gruppe)') !== false) {
$input_names4["groups"][] = str_replace(' (Gruppe)', '', $wert);
} else {
$input_names4["user"][] = $wert;
}
}
//Der "groups"-Index des Arrays wird in einen String konvertiert
$input_names5_groups = implode(', ', $input_names4["groups"]);
//SQL: Gruppen zu User-IDs
$sql_g2u = $db->prepare("SELECT ug.user_id FROM users_groups ug LEFT JOIN groups g ON g.group_id = ug.group_id WHERE g.group_name IN (?)");
$sql_g2u->bind_param('s', $input_names5_groups);
if ($sql_g2u->execute()) {
$sql_g2u->store_result();
$sql_g2u->bind_result($user_id);
while ($sql_g2u->fetch()) {
echo $user_id.', ';
}
} else {
echo 'Fehler: Es konnten keine Benutzer aus den Gruppen bestimmt werden.';
exit;
}
$sql_data_lastinsertid = $sql_data->insert_id;
$placeholders_empfaenger_ids = implode(', ', array_fill(0, count($empfaenger_ids2), "(?, ?, ?)"));
$sql_link_query = "INSERT INTO msg_link (to_id, msg_id, gelesen) VALUES ($placeholders_empfaenger_ids)";
$sql_link = $db->prepare($sql_link_query);
$type3 = str_repeat('iis', count($empfaenger_ids2));
foreach ($empfaenger_ids2 as $to_id) {
$values3[] = $to_id;
$values3[] = $sql_data_lastinsertid;
$values3[] = $null;
}
foreach ($values3 as $key3 => $value3) {
$value_references3[$key3] = &$values3[$key3];
}
call_user_func_array('mysqli_stmt_bind_param', array_merge(array($sql_link, $type3), $value_references3));
if ($sql_link->execute()) {
echo '<div id="ajax_response_css"><span class="green">Nachricht wurde erfolgreich an '.htmlentities($input_names2, ENT_QUOTES, 'UTF-8').' verschickt.</span></div>';
exit;
} else {
echo '<div id="ajax_response_css"><span class="red">Fehler: Nachricht konnte nicht verschickt werden. [Fehlercode: SQL-01a]</span></div>';
exit;
}
$sql_n2u_query = "SELECT user_id FROM users WHERE username IN ($placeholders_users)";
$stmt2 = $db->prepare($sql_n2u_query);
$type2 = str_repeat('s', count($input_names4["users"]));
foreach ($input_names4["users"] as $user_name) {
$values2[] = $user_name;
}
foreach ($values2 as $key2 => $value2) {
$value_references2[$key2] = &$values2[$key2];
}
call_user_func_array('mysqli_stmt_bind_param', array_merge(array($stmt2, $type2), $value_references2));
if ($stmt2->execute()) {
$stmt2->store_result();
$stmt2->bind_result($user_id2);
while ($stmt2->fetch()) {
$empfaenger_ids[] = $user_id2;
}
} else {
echo 'Fehler: Datenbankabfrage fehlgeschlagen.';
exit;
}
Array
(
[0] => 3
[1] => 5
)
Array
(
[0] => 3
[1] => 28
[2] => 0
[3] => 5
[4] => 28
[5] => 0
)