Sie verwenden bind_param nicht gemäß dem vorbereiteten Anweisungsparadigma.
In Ihrer Auswahl:
$sql = "SELECT id,msg,time,msg.from,msg.to
FROM msg
WHERE msg.from IN (?, ?)
AND msg.to IN (?, ?)
ORDER BY time";
$ex = $conn->prepare($sql);
$ex->bind_param("s", $_SESSION["username"]);
$ex->bind_param("s", $_SESSION["tousermessage"]);
$ex->bind_param("s", $_SESSION["username"]);
$ex->bind_param("s", $_SESSION["tousermessage"]);
$ex->execute();
Und in Ihrem Update:
$sql = "UPDATE msg
SET readmsg=1
WHERE id = ?
AND msg = ?";
$ex1 = $conn->prepare($sql);
$ex1->bind_param("i", $result['id']);
$ex1->bind_param("s", $result["msg"]);
$ex1->execute();
Das obige ermöglicht Ihrer vorbereiteten Anweisung, Parameter im parametrisierten Zeichenfolgenformat zu akzeptieren (unter Verwendung von „?“ zur Darstellung eines Parameters) und Parameter mit Typinformationen über die Methode bind_param() zu akzeptieren.
Dadurch kann die DB-Engine Parameter vor der Ausführung Ihrer Abfrage richtig umwandeln und maskieren.
Es macht keinen Sinn, vorbereitete Anweisungen zu verwenden, wenn Sie keine Parameter binden, weshalb Sie wahrscheinlich diese Warnung erhalten.
Nebenbei bemerkt, das Verketten von Abfragen (wie Sie es oben tun) ist eine sehr schlechte Angewohnheit - es öffnet Sie für SQL-Injection
Weitere Informationen zu vorbereiteten Anweisungen finden Sie in der Dokumentation:
http://php.net/manual/en/mysqli-stmt.prepare .php