No está utilizando bind_param, según el paradigma de declaración preparada.
En su selección:
$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();
Y en tu actualización:
$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();
Lo anterior permite que su declaración preparada acepte parámetros en el formato de cadena parametrizada (usando "?" para representar un parámetro) y acepte parámetros con información de tipo, a través del método bind_param().
Esto permite que el motor de la base de datos emita y escape correctamente los parámetros antes de ejecutar su consulta.
No tiene sentido usar declaraciones preparadas si no está vinculando parámetros, que es probablemente la razón por la que recibe esa advertencia.
En una nota al margen, la concatenación de consultas (como lo está haciendo arriba) es un hábito muy malo:lo abre a Inyección SQL
Consulte los documentos para obtener más información sobre declaraciones preparadas:
http://php.net/manual/en/mysqli-stmt.prepare .php