プリペアドステートメントのパラダイムに従って、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エンジンは、クエリを実行する前にパラメータを適切にキャストおよびエスケープできます。
パラメータをバインドしていない場合は、プリペアドステートメントを使用しても意味がありません。これが、おそらくその警告が表示される理由です。
ちなみに、クエリの連結は(上記で行っているように)非常に悪い習慣です。これにより、SQLインジェクション
プリペアドステートメントの詳細については、ドキュメントを参照してください:
http://php.net/manual/en/mysqli-stmt.prepare .php