Отправка ошибок PHP обратно в индекс

#javascript #php #html #forms #security

#javascript #php #HTML #формы #Безопасность

Вопрос:

Итак, у меня есть index.php и r.php . R.php это часть регистрации. И index.php является фактической формой. Мой вопрос в том, как я могу r.php отправлять ошибки обратно index.php , если они существуют. Поэтому вместо отображения ошибок r.php я хочу, чтобы они были включены index.php и предотвращали продвижение формы.

Вот index.php

 <!DOCTYPE html>
<html>
    <body>
    <form method="post" action="r.php">
        <input type="text" name="name" placeholder="Name">
        <input type="submit">
    </form>
</body>
 

Все очень просто. Теперь вот r.php

 <?php
$name = $_POST['name'];

if ($name < 3){
    //display error
}
else {
    //proceed
}
?>
 

Должен ли я делать это с помощью JS? Или это лучший способ.

Комментарии:

1. Обычный способ — иметь r.php и index.php быть в том же файле. Это может упростить задачу

2. Я не очень хорошо знаком с Pear…. @pce

Ответ №1:

Один из способов — использовать сеансы:

 <?php session_start(); ?>
<!DOCTYPE html>
<html>
    <body>
    <?php echo isset($_SESSION['message']) ? $_SESSION['message'] : ''; ?>
    <form method="post" action="r.php">
        <input type="text" name="name" placeholder="Name">
        <input type="submit">
    </form>
</body>
 

 <?php
session_start();
unset($_SESSION['message']);
$name = $_POST['name'];

if ($name < 3){  // you probably want strlen($name) < 3
    $_SESSION['message'] = 'error';
    header('Location: index.php');
    exit;
}
else {
    //proceed
}
?>
 

Помимо сеансов, вы можете перенаправить обратно строку запроса и использовать это:

 header('Location: index.php?message=' . urlencode('some kind of error');
 

Затем:

 <?php echo isset($_GET['message']) ? $_GET['message'] : ''; ?>
 

Комментарии:

1. Кажется, все хорошо. Но когда я возвращаюсь после того, как ошибка все еще существует. Я пытался использовать unset($_SESSION['message']); after exit; , но он не работает. Есть идеи, куда я должен это вставить?

2. Не следует повторять переменные $ _GET без фильтрации, по крайней мере, используйте htmlspecialchars или htmlentities, потому что это уязвимо для XSS .

3. Я знаю о SQL-инъекциях и XSS. Я обязательно исправлю это после того, как пойму это. @pce

4. Просто пример. Я отредактировал с помощью unset($_SESSION['message']);

5. По-прежнему не сбрасывается. Я хочу, чтобы они отображались только один раз. Например, после того, как пользователь обновит страницу после получения сообщений, я не хочу, чтобы они были там. В противном случае хороший ответ.

Ответ №2:

Для этого было бы проще использовать один скрипт, просто поместите все это в один файл и проверьте, была ли отправлена форма. Если форма была отправлена, вы просто сразу включаете нужные переменные.

Это довольно грубо, но дает вам представление о том, куда вы можете пойти с этим:

 <?php

if (isset($_POST['name'])) {
    // Begin processing form stuff
    $name = $_POST['name'];

    // Initialise error variable
    $error = null;    

    if ($name < 3) {
        // Display error, for example:
        $error = 'Name is less than 3';
    } else {
        // Proceed
    }
}

?>
<!DOCTYPE html>
<html>
<body>
    <?php if ( ! empty($error)) { ?>
        <p><?php echo $error; ?></p>
    <?php } ?>
    <form method="post" action="r.php">
        <input type="text" name="name" placeholder="Name">
        <input type="submit">
    </form>
</body>
</html>
 

Комментарии:

1. Я знаю об этом. Но я пытаюсь сделать это с помощью 2 файлов.

2. Хорошо, тогда вы можете использовать перенаправление с r.php и задать некоторые GET переменные. Единственный по-настоящему надежный способ сделать это — действительно иметь передний контроллер.

Ответ №3:

 <!DOCTYPE html>
<html>
<?php

  $msg = '';

  if(isset($_GET['e'])
  {
    $msg = "Error! Input not valid.";
  }
?>
    <body>
    <?php
        if($msg!='')
        {
          echo "<font color='red'>".$msg."</font>";
        }
    ?>
     <form method="post" action="r.php">
      <input type="text" name="name" placeholder="Name">
      <input type="submit">
    </form>
</body>
 

Просто передайте переменную e с помощью запроса GET на страницу индекса, если обнаружена ошибка.

 <?php
$name = $_POST['name'];

if ($name < 3){
    header("Location: index.php?e=error");
}
else {
    //proceed
}
?>
 

Запрос GET отправит переменную e с использованием URL, и если будет обнаружено, что e имеет значение, это означает, что произошла ошибка в r.php

Ответ №4:

Используйте javascript для простой проверки формы. Если вам требуются какие-либо средства безопасности или базы данных, вы можете использовать сеанс / cookie или использовать функцию заголовка, чтобы вернуться назад.