PHP/MYSQL: Nachrichten-System

Vielen Dank für die ausführliche Erklärung für JSON und den Standard zum Löschen etc. von privaten Nachrichten!

Ich wollte schon einen Menüpunkt "Gesendet" machen, bei dem man gesendete Nachrichten löschen kann, aber das gibt's jetzt nicht mehr. :)
 
Ich wollte schon einen Menüpunkt "Gesendet" machen, bei dem man gesendete Nachrichten löschen kann, aber das gibt's jetzt nicht mehr. :)
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 verschwinden ;)

Dazu ein kleiner Tipp: Du kannst in die Linktabelle auch eine weitere Spalte für einen Ordner einfügen. Wenn eine Nachricht (egal ob Gruppe oder einzeln) versendet wird, bekommt jeder Empfänger den Ordner INBOX und der jenige, der sie gesendet hat bekommt die Nachricht in den Ordner SENT. Damit kannst du das einfacher realisieren ;)
 
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.

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. Bei einem selbstgeschrieben Nachrichtensystem in dem man erfasst wann jemand die Nachricht liest, ist es allerdings ohne Probleme möglich eine Funktion einzubauen um Nachricht zu löschen, solange sie der Empfänger noch nicht gelesen hat. 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.

Problematischer finde ich eher die "Gelesen" Funktion. Da hätte ich als Anwender wenig Bock drauf. ;)
 
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.
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:
Code:
SELECT username FROM users WHERE username LIKE ?
? wäre hier: "%benutzereingabe%"

Für eine Query, welche Gruppen und Benutzer einschließt hatte ich folgende Idee:
Code:
SELECT u.username, g.group_name FROM users u LEFT JOIN groups g WHERE u.username LIKE ? OR g.group_name LIKE ?
Beide ? wären hier: "%benutzereingabe%"

Die letzte Query funktioniert nur leider nicht. Wie lässt sich das am besten realisieren?
 
Theoretisch machbar. Praktisch hat man dafür aber in der nicht-öffentlichen Kommunikation kaum einen wirklichen Nutzen.
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. ;)
 
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:
Code:
SELECT username FROM users WHERE username LIKE ?
? wäre hier: "%benutzereingabe%"

Für eine Query, welche Gruppen und Benutzer einschließt hatte ich folgende Idee:
Code:
SELECT u.username, g.group_name FROM users u LEFT JOIN groups g WHERE u.username LIKE ? OR g.group_name LIKE ?
Beide ? wären hier: "%benutzereingabe%"

Die letzte Query funktioniert nur leider nicht. Wie lässt sich das am besten realisieren?

Kannst kein JOIN benutzen, wenn die Tabellen keinen Wert teilen... Also entweder eine Tabelle erstellen die User und Gruppen beinhaltet oder zwei Queries abfeuern.
 
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.
 
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.

Schreib doch einfach sowohl user als auch gruppen in eine Tabelle. Füg "group_id" als Wert hinzu. Ist der Wert NULL handelt es sich um einen User, hat er einen anderen Wert verweist dieser auf ne Group Tabelle in der Gruppen Usern zugeordnet wird.

Also bspw. Tabelle user:

user_id | name | group_id ( + was sonst noch so in die Tabelle muss.)

und Tabelle group:
group_id | user_id

Dann hast du a) nur ein Query wenn du nach Usern / Gruppen suchst und b) kannst du so auch einfach den Namen unique machen. Alles User kriegst du dann aus der Tabelle in dem du ein SELECT machst WHERE group_id == NULL

EDIT: Wenn du keine Lust hast mal wieder deine Datenbankstruktur zu ändern (könnt ich durchaus verstehen, ich hasse das. ;) ) Dann musst du vor dem Insert in die Gruppen Tabelle ein Select id FROM user WHER name = ? abfeuern. Wenn ein Ergebnis zurück kommt ist der Name schon in Verwendung. Unique über zwei Tabellen geht nicht.
 
Zuletzt bearbeitet:
Ich würde das Suchen nach Gruppen bzw. Usern in getrennten Inputs/Autocompletes machen. Dann weiß man als Nutzer wenigstens, nach was man da genau sucht. Und eine Benutzernamen <> Gruppennamen Kollision vermeiden ist auch nicht der richtige Weg. Stelle dir mal folgendes Szenario vor: 200.000 Benutzer sind registriert und 200.000 Gruppen sind registriert. Das würde bedeuten, das für neue Nutzer ganze 400.000 Benutzernamen nicht verwendet werden können, wobei jeder Benutzer trotzdem einwandfrei identifizierbar bleibt.

Wenn du es aber nicht trennen willst, dann müsstest du mit 2 Querries arbeiten. Denn MySQL erlaubt die Abfrage mehrerer Tabellen in einem Query nur über eine Beziehung. Diese kannst du aber natürlich mit UNION verknüpfen:
Code:
SELECT name FROM user WHERE name LIKE ? UNION SELECT name FROM groups WHERE name LIKE ?
Damit sollte es klappen. Aber ich persönlich bin nicht begeistert von der Gleichstellung Benutzername und Gruppenname. Aber das musst du selbst wissen. Du kannst im Autocomplete Gruppen ja hervorheben (andere Farbe, Fettdruck ... wie auch immer). Da halte ich es eher für unnötig, Gruppen und Benutzer Vom Namen her gleichzusetzen. Aber ist wie gesagt deine Entscheidung.

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. ;)
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
)

Jetzt bin ich nur am überlegen, wie man das Array sortieren könnte, dass es beispielsweise einen Index ["user"] und einen Index ["groups"] gibt.

Nur wie müsste ich dann die ganzen Benutzer-IDs der Benutzer in den Gruppen rauskriegen?

Ich hätte jetzt spontan an das gedacht: SELECT ug.user_id FROM users_groups ug LEFT JOIN groups g ON g.group_id = ug.group_id WHERE g.group_name IN ?
Das ? wäre dann: $arraay["groups"] (Aber geht das überhaupt?)
 
Ein passender Query könnte so aussehen:
Code:
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.

Wo ist da das Problem? Man kann doch jede Änderung nachvollziehen. Der Verkäufer kann den Preis nachträglich gerne ändern, es bringt ihm nur nichts, weil man immer noch jede Version die er vorher geschrieben hat lesen kann inklusive Zeitangabe. D.h. Verkäufer stellt Angebot für 50€ um 15:00 Uhr rein. Käufer stimmt um 16:00 Uhr zu. Verkäufer akzeptiert, ändert aber den Preis um 17:00 Uhr auf 100€. Der Käufer sieht zwar standardmäßig die Version von 17:00 Uhr, ist aber nicht dumm, klickt auf "Bearbeitet" und sieht dann jegliche vorherigen Versionen, auch die von 15:00 Uhr mit dem Preis von 50€ und kann die dem Verkäufer um die Ohren hauen. Es gibt kein Nachteil in diesem System. Nur mehr comfort.

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.

Du brauchst in einem selbst geschriebenen Nachrichtensystem keinen "Zeitpuffer" wenn du erfassen kannst, wann die Nachricht gelesen wird... Solange der Empfänger die Nachricht noch nicht gelesen hat, macht es für den Empfänger keinen Unterschied ob du die Nachricht nachträglich löschst oder nicht. Wobei es hier zugegebener maßen ein wenig auf den Einsatzzweck ankommt. Unter Umständen gibt es hier gesetzliche Auflagen, so dass grundsätzlich eine Kopie der Nachricht archiviert werden muss. Mit einem Zeitpuffer umgeht man das Problem natürlich, denn eine Nachricht die "nie" abgesendet wurde brauch man natürlich auch nicht archivieren... Für ein privates Forum seh ich da aber keine Bedenken.

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 ;)

Ich versteh immer noch nicht, wo du hier beschissen werden kannst... Nochmal: Bearbeitete Nachrichten verschwinden ja nicht, sondern existieren weiterhin und sind weiterhin abrufbar. Ein System was Bearbeitung von Nachrichten zu lässt muss (oder besser darf) nicht die ursprüngliche Nachricht ersetzen, sondern erstellt praktisch eine neue Nachricht... Du benutzt kein Facebook, oder? Falls doch, schau dir doch mal an wie die das gelöst haben... Meiner Meinung nach ein guter Ansatz.
 
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
)

Moment. Bring nicht Rechte und Gruppen durcheinander. Was sollen die Gruppen bei dir genau machen? Ich dachte bei Gruppen eher an "php Programmierer" oder "Witcher 3 Fans". Benutzer und Admin sind ja erstmal bestimmte Rechte die ein User hat. Es kann dann zwar zusätzlich noch eine Gruppe Admins geben, aber ne Gruppe "Benutzer" scheint mir wenig sinnvoll... Besonders wenn man dann Nachrichten an alle Benutzer schicken kann schreit das nach SPAM....

Was dein Beispiel mit dem Array angeht... Du könntest ein $temp = explode("(", $array[$i]) machen für jeden Eintrag im Array. Gibt es ein $temp[1] ist es eine Gruppe und du schreibst trim($temp[0]) in ein neues GruppenArray. Existiert kein $temp[1] ist ein User und $temp[0] kommt in ein neues UserArray. Dann müsstest du allerdings vorher festlegen, das keine "(" im Namen vorkommen dürfen... Alles eher suboptimal...

Ich würde dann eher versuchen Gruppen und User mehr zu trennen. Entweder du hast zwei Input-Felder "Gruppen" und "User" bei einer neuen Nachricht, oder du erstellst für jeden Empfänger dynamisch ein neues Input-Feld, wie bei einer E-Mail. (D.h. wenn du einen Namen eingegeben hast, der auch gefunden wurde im Ajax Result, erstellst du dynamisch ein neues Input-Feld für den nächsten Empfänger. Nach jeder Eingabe lässt du den Namen mit dem Ajax Result gegen deine bekannten Gruppen und User laufen, identifizierst ob es ein User oder eine Gruppe ist und verpasst dem Input Feld dann per javascript das passende name attribut (bspw. name="group[]") Allerdings brauchst du dann natürlich zwei Ajax Requests, einen um die User zu holen, einen um die Gruppen zu holen.

Dabei muss man aber natürlich aufpassen. Ich kenne aus Foren auch "Geheime" Gruppen. Die Fliegen bei so einem Ajax Request natürlich schnell auf... Dann müsstest du bei der Suche und Auslieferung der Gruppen immer noch berücksichtigen welche Rechte der User eigentlich hat und ob er die Gruppe überhaupt sehen darf... etc.

Wie du siehst, Gruppen können die Angelegenheit schon etwas komplizierter machen. ;)
 
Zuletzt bearbeitet:
Hi,

ich habe die Rechte nicht an Gruppen gebunden. Das wird mit einer Extra-Spalte in der User-Tabelle geregelt, die ist dann entweder "user" oder "admin". Zu der Spam-Problematik: Die Benutzer-Gruppe besteht derzeit nur zu Testzwecken ;)

Ich bin bisher soweit:

Der User gibt beispielsweise folgenden String (-> Empfänger) an die PHP-Datei: "Admins (Gruppe), Benutzer (Gruppe), testbenutzer"

So wird der String dann in der PHP-Datei verarbeitet:
PHP:
//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;
}

Nur werden mir hier keine Benutzer-IDs ausgegeben. Es liegt aber am SQL-Teil, denn die wenn ich mir die Variable $input_names5_groups ausgeben lasse, bekomme ich: "Admins, Benutzer"

Wo liegt hier der Fehler?
 
Ups, peinlich. Hab gar nicht an strpos und str_replace gedacht... Haste schön gelöst. :)

Das Problem ist, das SQL "Admins, Benutzer" als ein String betrachtet. Und den gibt es nunmal nicht. Du müsstest für jede Variable ein eigenes Fragezeichen einbauen. In deinem Beispiel wäre das also "... IN (?,?)" mit bind_param("Admins", "Benutzer").

Mit call_user_func_array() kannst du ein Array an das bind_param übergeben. Die "?" im IN musst du dynamisch erzeugen und an die länge deines Arrays anpassen.
 
Zuletzt bearbeitet:
Hi,

ich setze mich nun gerade daran die Verlinkungen in die Tabelle msg_link einzutragen.

Das ist mein Code:
PS: Vor dem Eintragen der Verlinkungen, wurde bereits die Nachricht an sich in msg_data eingetragen (daher kommt auch $sql_data->insert_id)
PHP:
$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;
}

Dieser Code gibt mir allerdings folgende Fehlermeldung:
Warning: mysqli_stmt_bind_param() expects parameter 1 to be mysqli_stmt, boolean given
Fatal error: Call to a member function execute() on a non-object
 
Dann bekomme ich folgende Fehlermeldung: Parse error: syntax error, unexpected T_OBJECT_OPERATOR, expecting ')

Diese Codeschnipsel funktionieren mit diesem System:
PHP:
$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;
}

Zum ursprünglichen Code habe ich mal ein paar Variablen ausgeben lassen:

$empfaenger_ids2 (Array):
Code:
Array
(
    [0] => 3
    [1] => 5
)

$sql_link_query (Wichtig hierbei: Ich habe bei den Empfängern die Admin-Gruppe (1 Mitglied) + textbenutzer (anderes Mitglied) ausgewählt):
INSERT INTO msg_link (to_id, msg_id, gelesen) VALUES ((?, ?, ?), (?, ?, ?))

$values_references3 (Array):
Code:
Array
(
    [0] => 3
    [1] => 28
    [2] => 0
    [3] => 5
    [4] => 28
    [5] => 0
)
 
Zuletzt bearbeitet:
Habs nochmal editiert... Versuchs mal ohne $this-> also einfach nur array($sql_link, 'bind_param')

Hm... Andererseits... Du benutzt doch PDO oder? Kann man da nicht einfach im execute die Values übergeben? Ich merk gerade, meine letzten PHP Projekte sind doch schon ne Zeitlang her... :D Ap0ll0XT kann dir vermutlich besser helfen als ich.
 
Zuletzt bearbeitet:
Zurück