我正在尝试验证表单字段,然后将表单数据插入到数据库中。在所有字段值都正确后,单击提交按钮两次后,我的表单会提交。实际上,通过单击提交按钮一次验证表单字段并更改操作。设置操作后,单击“提交”按钮将提交表单。
任何人都可以通过只点击一次提交按钮告诉我如何提交。
这是我在相同文件上使用验证php脚本的html代码
<html>
<head>
<title></title>
<style> .error {color:#ff0000;} </style>
</head>
<body>
<?php
$companyNameErr = $addressErr = $emailErr = $contactErr = "";
$companyName = $address = $email = $contact = $description = "";
function test_data($data)
{
$data=trim($data);
$data=stripslashes($data);
$data=htmlspecialchars($data);
return $data;
}
$errors = array();
$valid=0;
if ( $_SERVER["REQUEST_METHOD"] =="POST" )
{
$companyName=$_POST["companyName"];
if( empty($companyName) )
{
$companyNameErr = "Please Enter Company Name";
$errors[]= $companyNameErr ;
}
else
{
if( !preg_match("/^[a-zA-Z ]*$/",$companyName) )
{
$companyNameErr = "Invalid Company Name";
$errors[]= $companyNameErr ;
}
else
{
$companyName=test_data($companyName);
$valid++;
}
}
$address=$_POST["address"];
if( empty($address) )
{
$addressErr = "Please Enter Address";
$errors[]= $addressErr ;
}
else
{
$address=test_data($address);
$valid++;
}
$email=$_POST["email"];
if( empty($email) )
{
$emailErr = "Please Enter Email";
$errors[]= $emailErr ;
}
else
{
if( !filter_var($email, FILTER_VALIDATE_EMAIL) )
{
$emailErr = "Invalid Email";
$errors[]= $emailErr ;
}
else
{
$email=test_data($email);
$valid++;
}
}
$contact=$_POST["contact"];
if( empty($contact) )
{
$contactErr = "Please Enter Contact Number";
$errors[]= $contactErr ;
}
else
{
if( !preg_match("/^[0-9]*$/",$contact ) )
{
$contactErr = "Invalid Contact";
$errors[]= $contactErr ;
}
else
{
$contact=test_data($contact);
$valid++;
}
}
}
if($valid==4)
{
}
?>
<form name="myform" method="post" action="<?php if($valid < 4){ echo $_SERVER["PHP_SELF"]; }else{ echo "validate1.php"; }?>" >
<table>
<tr>
<td>Company Name</td>
<td><input type="text" name="companyName" value ="<?php if(isset($_POST['companyName']) && empty($companyNameErr)){ echo $_POST['companyName'];} else {echo '';}?>" required ><span class="error"><sup>*</sup><?php echo $companyNameErr; ?></span></td>
</tr>
<tr>
<td>Address</td>
<td><input type="text" name="address" value ="<?php if(isset($_POST['address']) && empty($addressErr)){ echo $_POST['address'];} else {echo '';}?>" required><span class="error"><sup>*</sup><?php echo $addressErr; ?></span></td>
</tr>
<tr>
<td>Email</td>
<td><input type="text" name="email" value ="<?php if(isset($_POST['email']) && empty($emailErr)){ echo $_POST['email'];} else {echo '';}?>" required><span class="error"><sup>*</sup><?php echo $emailErr; ?></span></td>
</tr>
<tr>
<td>Contact</td>
<td>+91-<input type="text" name="contact" value ="<?php if(isset($_POST['contact']) && empty($contactErr)){ echo $_POST['contact'];} else {echo '';}?>" required maxlength="10" minlength="10"><span class="error"><sup>*</sup><?php echo $contactErr; ?></span></td>
</tr>
<tr>
<td>Description</td>
<td><textarea name="description" cols="60" rows="3"></textarea></td>
</tr>
</table>
<input type="submit" name="submit" value="next>>">
</form>
</body>
指定连接,然后将值插入数据库的php代码在另一个文件中
<html>
<head>
<title></title>
</head>
<body>
<?php
$servername="localhost";
$username="root";
$password="";
$conn = new mysqli($servername, $username, $password, 'mydatabase');
if ($conn->connect_error)
{
die("Connection failed: " . $conn->connect_error);
}
$conn->query("CREATE DATABASE IF NOT EXISTS `MyDataBase`");
$conn->query("CREATE TABLE IF NOT EXISTS MyDataBase.company_details( `comp_id` INT AUTO_INCREMENT PRIMARY KEY,`company_name` VARCHAR(50) NOT NULL,`address` VARCHAR(70) NOT NULL,`email` VARCHAR(30) NOT NULL,`contact` INT(13) NOT NULL,`description` VARCHAR(150))");
$conn->query("INSERT INTO company_details (company_name, address, email, contact, description ) VALUES ( '".$_POST['companyName']."', '".$_POST['address']."', '".$_POST['email']."', '".$_POST['contact']."', '".$_POST['description']."')");
$conn->close();
?>
</body>
答案 0 :(得分:1)
有很多很好的框架,为什么你想要用很多年前没有oop的旧方式自己创建验证的东西。 mvc很不错。
返回主题
你的$ valid在第一次调用时将为0 .. 在实际提交数据时,你只有$ _POST 表单操作是validate1.php php_sef是同一页面,所以我不知道你想要做什么,如果有的话。它将是alsways validate1.php。 你在哪里实际插入数据库。为什么数据库插入未经过验证。在输出数据之前插入数据之前,需要进行验证。 不要忘记未经过滤的php_self是不安全的并允许xss
数据流:
阻止表单是没用的,因为每个人都可以重新加载页面并再次提交。只输出错误并再给他一次机会。如果你想要禁用它,你需要有一些访问控制。如果您只想轻松禁用并向用户显示,请将提交设置为已禁用或将操作设置为#
答案 1 :(得分:0)
问题在于你正在做什么的顺序。
问题是,在3到4之间,用户可以更改数据,绕过验证并提交不同的数据。
验证应始终在与数据库查询相同的脚本中完成(是的,即使对于选择查询也是如此)。
将数据库查询放入验证(如果有效),或者将验证检查放入数据库查询中。然后删除表单的任何条件操作,并让它提交。
答案 2 :(得分:0)
您确切地描述了问题中的问题。当您的页面首次呈现时,操作为PHP_SELF
。然后,您必须单击提交按钮(1次)以根据$valid
的值更改操作。完成后再次单击“提交”(2次),即可成功提交。
要解决此问题,您无需停止表单提交至validate1.php
。所以这样做:
<html>
<head>
<title></title>
<style> .error {color:#ff0000;} </style>
</head>
<body>
<form name="myform" method="post" action="validate1.php" >
<table>
<tr>
<td>Company Name</td>
<td><input type="text" name="companyName" value ="<?php if(isset($_POST['companyName']) && empty($companyNameErr)){ echo $_POST['companyName'];} else {echo '';}?>" required ><span class="error"><sup>*</sup><?php echo $companyNameErr; ?></span></td>
</tr>
<tr>
<td>Address</td>
<td><input type="text" name="address" value ="<?php if(isset($_POST['address']) && empty($addressErr)){ echo $_POST['address'];} else {echo '';}?>" required><span class="error"><sup>*</sup><?php echo $addressErr; ?></span></td>
</tr>
<tr>
<td>Email</td>
<td><input type="text" name="email" value ="<?php if(isset($_POST['email']) && empty($emailErr)){ echo $_POST['email'];} else {echo '';}?>" required><span class="error"><sup>*</sup><?php echo $emailErr; ?></span></td>
</tr>
<tr>
<td>Contact</td>
<td>+91-<input type="text" name="contact" value ="<?php if(isset($_POST['contact']) && empty($contactErr)){ echo $_POST['contact'];} else {echo '';}?>" required maxlength="10" minlength="10"><span class="error"><sup>*</sup><?php echo $contactErr; ?></span></td>
</tr>
<tr>
<td>Description</td>
<td><textarea name="description" cols="60" rows="3"></textarea></td>
</tr>
</table>
<input type="submit" name="submit" value="next>>">
</form>
</body>
现在您已提交到validate1.php
,并且可以像之前在表单顶部所做的那样进行验证。如果表单是干净的,请将其提交给数据库,否则重新呈现表单,并将数据和错误消息提交回validate1.php
再试一次。