Не използвате bind_param, съгласно подготвената парадигма на изявлението.
В избраното от вас:
$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();
И във вашата актуализация:
$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();
Посоченото по-горе позволява на подготвената ви декларация да приема параметри в параметризирания формат на низ (използвайки „?“ за представяне на параметър) и да приема параметри с информация за типа чрез метода bind_param().
Това позволява на DB машината да прехвърля правилно и escape параметри преди да изпълни вашата заявка.
Няма смисъл да използвате подготвени оператори, ако не обвързвате параметри, което вероятно е причината да получавате това предупреждение.
От друга страна, конкатенацията на заявките (както правите по-горе) е много лош навик - отваря ви до SQL инжекция
Вижте документите за повече информация относно подготвените изявления:
http://php.net/manual/en/mysqli-stmt.prepare .php