我是PHP新手,我正在尝试进行服务器端表单验证。有两个PHP文件Login.php
和Form.php
。注册在Login.php
和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);
?>
答案 0 :(得分:2)
有很多方法可以做到这一点。服务器端存在空白表单字段,其值为空。因此,除了检查变量是否已设置之外,在您的情况下,您还要检查该值是否为非空。 一种方法是使用strlen函数。 所以你的一个例子是:
if(!isset($_POST["username"]) || strlen($_POST["username"]) == 0) {
注意:不要使用empty函数,因为字符串“0”被视为“空”。阅读其他此类案例的手册。
您可能需要考虑使用辅助函数来进行确定。基本上是这样的:
function DoesPostFormFieldHaveValue($formFieldName) {
return(
isset($_POST[$formFieldName])
&& strlen($_POST[$formFieldName]) > 0
);
}
答案 1 :(得分: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);
?>
答案 2 :(得分:0)
像这样检查:
if(!isset($_POST["username"]) && $_POST["username"]!="")
答案 3 :(得分:0)
您的PHP代码仅检查isset,我没有看到任何空检查。对于任何一个表单,isset将始终为true,因为表单字段正在提交 - 只有值为空。 要防止空插入,请在条件中添加!空检查。您的条件语句应如下所示 -
if(!isset($_POST['fieldname']) && !empty($_POST['fieldname']))
答案 4 :(得分:-1)
首先提出一些建议。如果你想开始一个新项目,我会建议你学习如何使用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 [&#39;错误&#39;] [&#39; cityerr&#39;]
之后,您可以在一个命令中清除特定的表单错误会话,如下所示:
unset($_SESSION['errors']);
希望它有所帮助;)
答案 5 :(得分:-1)
if(isset($_POST['field_name']))
{
$field_name=$_POST['field_name']
}else
{
unset($_POST['field_name'])
}