Nepoužíváte bind_param podle připraveného paradigmatu příkazu.
Ve vašem výběru:
$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();
A ve vaší aktualizaci:
$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();
Výše uvedené umožňuje vašemu připravenému příkazu přijímat parametry ve formátu parametrizovaného řetězce (pomocí „?“ k reprezentaci parametru) a přijímat parametry s informacemi o typu prostřednictvím metody bind_param().
To umožňuje enginu DB správně přetypovat a uniknout parametry před provedením vašeho dotazu.
Nemá smysl používat připravená prohlášení, pokud nezavazujete parametry, což je pravděpodobně důvod, proč dostáváte toto varování.
Na okraj, zřetězení dotazů (jak to děláte výše) je velmi špatný zvyk – otevírá vám to Vložení SQL
Další informace o připravených prohlášeních naleznete v dokumentaci:
http://php.net/manual/en/mysqli-stmt.prepare .php