Перед тем как что-то куда-то добавлять надо сначала разобраться что ты делаешь.
В частности понять что браузер, веб-сервер, и база данных - это разные вещи, и
для каждой нужна своя обработка данных.
В-первых, POST запросом ничего добавить в базу нельзя.
База вообще ничего не знает про пост запросы. POST запросом можно отправить текст только в РНР.
А РНР уже будет добавлять в БД.
Про HTML база данных тоже ничего не знает. Поэтому "htmlspecialchars" к базе данных не имеет никакого отношения. И делать это для добавления в БД не нужно. Это функцию надо применять
при выводе данных
в браузер, а не при сохранении в базу данных.
Вот теперь, когда мы разобрались что у нас где, можно наконец ответить на твой вопрос
Для безопасного добавления данных в БД из РНР, надо
отправлять их отдельно от самого запроса. Это непреложное правило, которое надо соблюдать всегда.
И не важно - пользовательский у тебя текст, или какой-то другой, POST у тебя запрос, или вообще никакого запроса не было - все эти вещи к работе с БД из РНР не имеют никакого отношения. Важно только то, что данные всегда отправляются в БД отдельно от запроса.
Для этого надо
- Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
- Подготовить запрос к исполнению с помощью функции prepare(). Эта функция принимает строку запроса и возвращает экземпляр специального класса stmt, с которым в дальнейшем и производятся все манипуляции
- Привязать переменные к запросу.
- Выполнить подготовленный ранее запрос с помощью с помощью execute()
В mysqli это будет так
$sql = "INSERT INTO table (name, text, message, date, rating) VALUES (?,?,?,?)";
$stmt = $link->prepare($sql);
$stmt->bind_param("sssss", $name, $text, $message, $date);
$stmt->execute();
bind_param() принимает в качестве параметров все переменные, которые должны попасть в запрос, в том же самом порядке, в котором стоят плейсхолдеры в запросе. Но кроме того, сначала в этой функции должны быть указаны типы для всех переменных, в виде строки, где тип переменной обозначается одной буквой. То есть букв в этой строке должно быть ровно столько, сколько дальше будет переменных. К счастью, можно особо не париться с типами и для всех переменных указывать тип "s".
Но по-хорошему для работы с БД в РНР лучше использовать PDO, Тем более что там колупаться с bind_param не нужно, а можно сразу отправить все данные в execute
$sql = "INSERT INTO table (name, text, message, date, rating) VALUES (?,?,?,?)";
$stmt = $link->prepare($sql);
$stmt->execute([$name, $text, $message, $date]);
А дураков, которые сами не знают, как текст в базу сохранить, слушать не надо.