Du använder inte bind_param, enligt det förberedda satsparadigmet.
I ditt val:
$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();
Och i din uppdatering:
$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();
Ovanstående tillåter din förberedda sats att acceptera parametrar i det parametriserade strängformatet (med "?" för att representera en param) och att acceptera params med typinformation, via bind_param()-metoden.
Detta gör det möjligt för DB-motorn att korrekt casta och escape params innan du kör din fråga.
Det är ingen idé att använda förberedda uttalanden om du inte binder parametrar, vilket förmodligen är anledningen till att du får den varningen.
Som en sidoanteckning är sammanlänkning av frågor (som du gör ovan) en mycket dålig vana - det öppnar dig för SQL-injektion
Se dokumenten för mer information om förberedda uttalanden:
http://php.net/manual/en/mysqli-stmt.prepare .php