Потому что бессмысленный говнокод.
У меня племянница трёхлетняя так дом строит: деревья, мишку плюшевого, колеса от грузовика - всё в дело идёт.
Но ей хотя бы ума хватает не класть сверху мороженое. А тут всё вперемешку - SQL кривой, prepare используется там где не нужно, и не используется где нужно, каким-то боком mysqli...
Переменные не пишут прямо в запрос. А передают отдельно. Потому что именно от этого все ошибки и происходят.
И как раз для этого и используют PDO, с pepare и execute
$options = [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::ATTR_EMULATE_PREPARES => false,
];
$dbh = new PDO('mysql:dbname=database;host=localhost;charset=$charset', 'usr', 'password', $options);
$stmt = $dbh->prepare("UPDATE posts SET content = ? WHERE id = ?");
$stmt->execute([$content,$id]);
echo "Пост - " . $id . PHP_EOL;