Je gebruikt geen bind_param, volgens het paradigma van de voorbereide verklaring.
In uw keuze:
$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();
En in je 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();
Met het bovenstaande kan uw voorbereide instructie parameters accepteren in het geparametriseerde tekenreeksformaat (met behulp van "?" om een param weer te geven), en om params met type-informatie te accepteren, via de bind_param() methode.
Hierdoor kan de DB-engine params correct casten en escapen voordat uw query wordt uitgevoerd.
Het heeft geen zin om voorbereide verklaringen te gebruiken als je geen bindende parameters bent, en dat is waarschijnlijk de reden waarom je die waarschuwing krijgt.
Even terzijde, het aaneenschakelen van zoekopdrachten (zoals je hierboven doet) is een zeer slechte gewoonte - het opent je voor SQL-injectie
Zie de documenten voor meer informatie over voorbereide verklaringen:
http://php.net/manual/en/mysqli-stmt.prepare .php