Проверка формы на стороне сервера PHP. Пустые поля формы вставляются в базу данных

1

Я новичок в PHP и стараюсь сделать валидацию на стороне сервера. Есть два PHP файла Login.php и Form.php. Регистрация выполняется в Login.php и Validation в Form.php. Идея заключается в том, что Form.php будет обрабатывать данные формы, отправленные Login.php

Моя проблема: даже если поля form пустые, переменные все еще вставляются в базу данных.

Я не хочу вставлять, если он пуст. Скорее, он должен вернуться к Login.php с сообщениями об ошибках, хранящимися как переменная сеанса.

Я проверил поля Form с использованием !isset() и empty в Form.php используя предложение if..else. В if..else вы можете узнать, являются ли поля формы пустыми, и если да, то они должны перейти к предложению переменной сеанса (внутри условия if). Вместо этого он переходит в условие else и вставляет пустые значения в переменные ('$username','$password','$phone','$mailid','$city') в базу данных.

Я прочитал предыдущие вопросы по аналогичной проблеме здесь и даже проверил Youtube для проверки на стороне сервера. Что я сделал не так? Существует ли проблема с использованием переменных сеанса. Любезно помочь

login.php:

<!Doctype HTML>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href= "Form.css" />
<script src="Form.js" type="text/javascript"></script>
</head>
<body>

<?php
    session_start();
    $passworderr='';    
    if(isset($_SESSION["passworderr"])) {
        $passworderr=$_SESSION["passworderr"];
    }
?>

 <div id="Outer">
 <div id="left" >
  <form action="/DatabaseDrivenWebpage/Form.php" method="POST"     name="form">
 <p><label>Username</label> <input type="text" name="regusername"    placeholder="Your name"/> </p>
 <p><label>Password</label> <input type="text" name="regpassword" placeholder="Password"/> </p>
 <input type="Submit" value="Login" />
 </form>
 </div>

 <div id="right">
 <form action="/DatabaseDrivenWebpage/Form.php" method="POST" id="formm">
 <p>*Username <input required name="username" type="text" /><?php  //echo $usernameerr;?></p>
 <p>*Password <input name="password" type="password" /> <?php echo $passworderr;?></p> 
 <p>   *Phone <input name="phone" type="tel" /><?php //echo $phoneerr;?></p>
<p>  *MailId <input name="mailid" type="email" /><?php //echo $mailiderr;?></p>
<p>    *City <input name="city" type="text" /><?php //echo $cityerr;?></p>
  <input type="Submit" value="Signup" />
</form></div></div></body></html>

form.php:

<?php

session_start();

   $dbservername='localhost';$dbname='mani';$dbusername='root';$dbpassword='';

$dbconn=mysqli_connect($dbservername,$dbusername,$dbpassword);
 if(!$dbconn){
die("Connection failed:". mysqli_connect_error());
}

 if(!isset($_POST["username"])) {
     $_SESSION["usernameerr"]="UserName is required";
 }
 else{
     $username=mysqli_real_escape_string($dbconn,$_POST["username"]);
 }
 if(!isset($_POST["password"])) {
     $_SESSION["passworderr"]="Enter a password";
 }
 else{
     $password=mysqli_real_escape_string($dbconn,$_POST["password"]);
 }
 if(!isset($_POST["phone"])) {
     $_SESSION["phoneerr"]="Phone number is required";
 } 
 else{
     $phone=mysqli_real_escape_string($dbconn,$_POST["phone"]);
 }
 if(!isset($_POST["mailid"])) {
     $_SESSION["mailiderr"]="Enter a valid mail id";
 } 
 else{
     $mailid=mysqli_real_escape_string($dbconn,$_POST["mailid"]);
 }
 if(!isset($_POST["city"])) {
     $_SESSION["cityerr"]="Enter your resident city";
 } 
 else{
     $city=mysqli_real_escape_string($dbconn,$_POST["city"]);
 }

 $selected = mysqli_select_db($dbconn,"$dbname")
 or die("Could not select examples".mysqli_error($dbconn));

 if(isset($_POST["username"]) and isset($_POST["password"]) and isset($_POST["phone"]) and isset($_POST["mailid"]) and isset($_POST["city"]) )
 {
     $res=mysqli_query($dbconn,"Insert into   user(username,password,phone,mailid,city) values('$username','$password','$phone','$mailid','$city')");
     if($res)
     {
         header("location:Login.php");
     }
 }
 else
 {
 print "Problem in inserting";
 header("location:Login.php");
 } 

 mysqli_close($dbconn);
 ?>
Теги:

7 ответов

2

Есть несколько способов сделать это. Пустое поле формы присутствует на стороне сервера с пустым значением. Поэтому в дополнение к проверке, задана ли переменная, в вашем случае вы хотите проверить, не является ли значение непустым. Один из способов сделать это - использовать функцию strlen. Итак, пример для вас:

if(!isset($_POST["username"]) || strlen($_POST["username"]) == 0) {

ПРИМЕЧАНИЕ. Не используйте пустую функцию, так как строка "0" считается "пустой". Прочтите руководство для других подобных случаев.

Вы можете захотеть использовать вспомогательную функцию для определения. В основном что-то вроде этого:

function DoesPostFormFieldHaveValue($formFieldName) {
   return(
         isset($_POST[$formFieldName])
      && strlen($_POST[$formFieldName]) > 0
   );
}
1

Прежде всего, session_start всегда должна быть первой строкой php-страницы, в которой вам нужно использовать сеансы.

Кроме того, я не уверен, почему вы используете столько переменных сеанса для хранения ошибок. Вместо этого используйте одну переменную сеанса, объявите ее как массив и сохраните все ошибки в ней.

Здесь ваша обновленная форма: -

<?php
    session_start();
    if((isset($_SESSION['errors']))) //check if we have errors set by the form.php page
    {
        echo "Please fix the following errors";
        foreach($_SESSION['errors'] as $error) //loop through the array
        {
            echo $error;
        }
    }
?>

<!Doctype HTML>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href= "Form.css" />
<script src="Form.js" type="text/javascript"></script>
</head>
<body>



 <div id="Outer">
 <div id="left" >
  <form action="/DatabaseDrivenWebpage/Form.php" method="POST"     name="form">
 <p><label>Username</label> <input type="text" name="regusername"    placeholder="Your name"/> </p>
 <p><label>Password</label> <input type="text" name="regpassword" placeholder="Password"/> </p>
 <input type="Submit" value="Login" />
 </form>
 </div>

 <div id="right">
 <form action="/DatabaseDrivenWebpage/Form.php" method="POST" id="formm">
 <p>*Username <input required name="username" type="text" /><?php  //echo $usernameerr;?></p>
 <p>*Password <input name="password" type="password" /> <?php echo $passworderr;?></p> 
 <p>   *Phone <input name="phone" type="tel" /><?php //echo $phoneerr;?></p>
<p>  *MailId <input name="mailid" type="email" /><?php //echo $mailiderr;?></p>
<p>    *City <input name="city" type="text" /><?php //echo $cityerr;?></p>
  <input type="Submit" value="Signup" />
</form></div></div></body></html>

Файл обработки бэкэнда: -

<?php
session_start();
$_SESSION['errors'] = array(); //declare an array
   $dbservername='localhost';$dbname='mani';$dbusername='root';$dbpassword='';

$dbconn=mysqli_connect($dbservername,$dbusername,$dbpassword);
 if(!$dbconn){
die("Connection failed:". mysqli_connect_error());
}

 if((!isset($_POST["username"])) || (empty($_POST['username']))) {
     $_SESSION["errors"][]="UserName is required"; //push error message to array if $_POST['username'] is empty or is not set
 }
 else{
     $username=mysqli_real_escape_string($dbconn,$_POST["username"]);
 }
 if((!isset($_POST["password"])) || (empty($_POST['password']))) {
     $_SESSION["errors"][]="Enter a password";
 }
 else{
     $password=mysqli_real_escape_string($dbconn,$_POST["password"]);
 }
 if((!isset($_POST["phone"])) || (empty($_POST['phone']))) {
     $_SESSION["errors"][]="Phone number is required";
 } 
 else{
     $phone=mysqli_real_escape_string($dbconn,$_POST["phone"]);
 }
 if((!isset($_POST["mailid"])) || (empty($_POST['mailid']))) {
     $_SESSION["errors"][]="Enter a valid mail id";
 } 
 else{
     $mailid=mysqli_real_escape_string($dbconn,$_POST["mailid"]);
 }
 if((!isset($_POST["city"])) || (empty($_POST['city']))) {
     $_SESSION["errors"][]="Enter your resident city";
 } 
 else{
     $city=mysqli_real_escape_string($dbconn,$_POST["city"]);
 }

 $selected = mysqli_select_db($dbconn,"$dbname")
 or die("Could not select examples".mysqli_error($dbconn));

 if(count($_SESSION['errors']) < 1) //check if the the $_SESSION['errors'] count is less than 1 (0), this means there are no errors.
 {
     $res=mysqli_query($dbconn,"Insert into   user(username,password,phone,mailid,city) values('$username','$password','$phone','$mailid','$city')");
     if($res)
     {
         header("location:Login.php");
     }
 }
 else
 {
 print "Problem in inserting";
 header("location:Login.php");
 } 

 mysqli_close($dbconn);
 ?>
  • 0
    Они используют mysqli, который не считается устаревшим.
  • 0
    @JohnConde К сожалению, я пропустил I
Показать ещё 1 комментарий
1

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

Теперь решение состоит в том, чтобы изменить все ваши isset() на empty() и это должно решить вашу проблему!


[Примечание] Нет необходимости использовать и isset() и empty() следующим образом:

if(!isset($_POST['fieldname']) && !empty($_POST['fieldname']))

потому что empty() делает все, что делает isset().

  • 1
    Спасибо за разделение различий между isset и empty. Я буду работать над своим кодом
  • 0
    Возможно, мои навыки объяснения оставили желать лучшего, но относительно того, почему нет необходимости использовать isset() вместе с !empty , обратитесь к этой ссылке на stackoverflow - stackoverflow.com/questions/4559925/…
Показать ещё 1 комментарий
0

Ваш PHP-код проверяет только isset, я не вижу никакой пустой проверки. isset всегда будет иметь значение true в вашем случае для любой из форм, поскольку поля формы отправляются - только значения пустые. Чтобы предотвратить пустые вставки, добавьте в свои условия проверку! Ваши условные утверждения должны выглядеть так:

if(!isset($_POST['fieldname']) && !empty($_POST['fieldname'])) 
0

прежде всего небольшой совет. Если вы хотите начать новый проект, я бы посоветовал вам узнать, как использовать PDO-соединение с базами данных MySQL, а не MySQLi. Поскольку PDO намного лучший метод и обеспечен (особенно при использовании подготовленных операторов).

В любом случае, поскольку я вижу, что вы храните ошибки в нескольких переменных $_SESISON, но после того, как вы закончите проверки валидации, вы не выполняете правильную инструкцию if.

Вместо этого: if(isset($_POST["username"]) and isset($_POST["password"]) and isset($_POST["phone"]) and isset($_POST["mailid"]) and isset($_POST["city"]) )

Сделайте что-то вроде этого: if(!isset($_SESSION['usernameerr']) && !isset($_SESSION['passworderr']) && !isset($_SESSION['phoneerr'] && !isset($_SESSION['mailiderr'] && !isset($_SESSION['cityerr'])))

Должно сработать.

Другая мысль, о которой я советую, заключается в том, чтобы unset сеансы ошибок, в вашем случае я сделаю это в конце страницы Login.php. На всякий случай, поэтому никаких проблем не возникнет, если вы исправите входные данные и отправьте их снова.

Другое дело, основываясь на unset идее. Если вы сделаете это, было бы гораздо более чистым способом изменить настройку сеансов ошибок, а не: $_SESSION['cityerr'] до: $ _SESSION ['errors'] ['cityerr']

Поэтому после этого вы можете очистить конкретный сеанс ошибки формы в одной команде, например: unset($_SESSION['errors']);

Надеюсь, это помогло;)

  • 0
    Хотя обычно рекомендуется PDO, с MySQLi все в порядке. Пока они не используют mysql_ *, нет причин указывать на это.
  • 0
    @ Нет Да, мне нужно сбросить, но позвольте мне сначала закончить с этой ошибкой. Большое спасибо
Показать ещё 3 комментария
0

проверьте следующее:

if(!isset($_POST["username"]) && $_POST["username"]!="")
  • 0
    Вы должны использовать empty() вместо проверки пустой строки.
  • 0
    Пожалуйста, объясните, почему это работает с ОП.
-2
if(isset($_POST['field_name']))
{
$field_name=$_POST['field_name']

}else
{
 unset($_POST['field_name'])
}
  • 0
    Это совершенно неправильно. В PHP нет is_set() . Это isset() и они уже используют это.
  • 0
    ооо, я ошибся там, пожалуйста, используйте функцию isset ()
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню