Для начала надо посмотреть, действительно ли POST запрос пришел?
if ($_SERVER['REQUEST_METHOD'] !== 'POST'{
die('error');
}
Перебирать все содержимое глобального массива тоже не есть хорошо.
Вместо
foreach ($_POST as $key => $value){
Должен быть у вас список нужных ключей, которые вы будете в дальнейшем использовать. Например, если проверяется только 1 поле и ключ его 'id', то можно использовать функцию array_key_exists или filter_has_var:
if ($_SERVER['REQUEST_METHOD'] === 'POST'{
if (array_key_exists('id',$_POST)){
// очистка входной переменной
}
}
также вы должно знать что за тип данных будет числиться под конкретным ключом входного массива, число, строка, массив и тд. Для их валидации можно использовать функцию filter_input:
filter_input(INPUT_POST,'id', FILTER_SANITIZE_NUMBER_INT);
либо простое приведение типов, если это число:
$id = (int) $_POST['id'];
$id = intval( $_POST['id']);
либо регулярные выражения, например вот так:
$id = 0; // значение по умолчанию
if (!preg_match("/^[1-9]\d+{1,9}$/")){
die('ошибка');
}else{
$id = $_POST['id'];
В вашем случае, вы хотите немного сократить труды пользователя, чтобы он не вводил данные еще раз.
для этого обычно используются функции htmlspecialchars, htmlentities. Можно также регулярными выражениями почистить, либо чем нибудь еще, вариантов много.
Напоследок приведу функцию, которая применяется для защиты строк в yii2,
function encode($content, $doubleEncode = true){
return htmlspecialchars($content, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8', $doubleEncode);
}
тогда ваш код примет вид:
<input type="text" name="firstname" value="<?=encode($_POST['firstname']) ?>" required>