我有一个检查三个字段,姓名,有效的电子邮件和评论的电子邮件的形式。 但是,这样它的成立,现在,由于名称和注释功能于一体,首先检查名称,即使电子邮件是无效的,哪有那么它会检查,以田野我重新写评论。 另外,我想重新显示没有错误的领域,因此用户不必再次输入。 请帮忙。 谢谢
<?php
$myemail = "comments@myemail.com";
$yourname = check_input($_POST['yourname'], "Enter your name!");
$email = check_input($_POST['email']);
$phone = check_input($_POST['phone']);
$subject = check_input($_POST['subject']);
$comments = check_input($_POST['comments'], "Write your comments!");
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/", $email))
{
show_error("Enter a valid E-mail address!");
}
exit();
function check_input($data, $problem='')
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
if ($problem && strlen($data) == 0)
{
show_error($problem);
}
return $data;
}
function show_error($myError)
{
?>
<!doctype html>
<html>
<body>
<form action="myform.php" method="post">
<p style="color: red;"><b>Please correct the following error:</b><br />
<?php echo $myError; ?></p>
<p>Name: <input type="text" name="yourname" /></P>
<P>Email: <input type="text" name="email" /></p>
<P>Phone: <input type="text" name="phone" /></p><br />
<P>Subject: <input type="text" style="width:75%;" name="subject" /></p>
<p>Comments:<br />
<textarea name="comments" rows="10" cols="50" style="width: 100%;"></textarea></p>
<p><input type="submit" value="Submit"></p>
</form>
</body>
</html>
<?php
exit();
}
?>
首先,我建议您验证所有字段的一次,并在窗体上显示所有相应的错误消息。 主要的原因是,它可以是不好的用户体验,如果他们要提交表单一大堆的时间,因为他们在同一时间,以解决一个错误。 我宁愿改正我的电子邮件地址,密码,评论,并选择在一个尝试,而不是在一个时间固定一个刚透露下一个错误是什么。
这就是说,这里有像你想验证表单一些指点。 这通常是我如何对待一个形式做你想做的事。 这是假设你的HTML表单和表单处理器(PHP)一起在同一个文件中(这是你现在有什么)。 您可以分割了两下,但这样做的方法可以是一个有点不同。
- 有一个函数或代码块输出的形式,并且知道你的错误信息,并且可以访问以前的表单输入(如果有的话)。 通常情况下,这可以留下一个功能之外,可以是代码,你的PHP脚本的最后一个块。
- 设置了错误消息的阵列(例如
$errors = array()
当这个数组是空的,你知道有没有错误与提交 - 检查,看看是否形式靠近你的脚本的顶部之前提交的形式输出。
- 如果表单提交,验证每个字段中的一个在一个时间,如果字段包含一个错误,添加错误消息发送到
$errors
阵列(例如$errors['password'] = 'Passwords must be at least 8 characters long';
) - 要重新填充与前值的形式输入,您可以选择存储所输入的值的地方(你可以只用
$_POST
阵列,或消毒并指定$_POST
值将各个变量或数组。 - 一旦所有的处理完成后,你可以检查是否存在错误,决定是否表格可在此时进行处理,或从用户需要新的输入。
- 要做到这一点,我通常做这样的事情
if (sizeof($errors) > 0) { // show messages } else { // process form }
- 如果您要重新显示形式,你只需要一个添加
value=""
属性,每个表单元素和回声这是由用户提交的值。 它逃脱结果使用htmlspecialchars()或类似功能的输出是非常重要的
有了这些东西,这里是你的形式做一些重复的工作:
<?php
$myemail = "comments@myemail.com";
$errors = array();
$values = array();
$errmsg = '';
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
foreach($_POST as $key => $value) {
$values[$key] = trim(stripslashes($value)); // basic input filter
}
if (check_input($values['yourname']) == false) {
$errors['yourname'] = 'Enter your name!';
}
if (check_input($values['email']) == false) {
$errors['email'] = 'Please enter your email address.';
} else if (!preg_match('/([\w\-]+\@[\w\-]+\.[\w\-]+)/', $values['email'])) {
$errors['email'] = 'Invalid email address format.';
}
if (check_input($values['comments']) == false) {
$errors['comments'] = 'Write your comments!';
}
if (sizeof($errors) == 0) {
// you can process your for here and redirect or show a success message
$values = array(); // empty values array
echo "Form was OK! Good to process...<br />";
} else {
// one or more errors
foreach($errors as $error) {
$errmsg .= $error . '<br />';
}
}
}
function check_input($input) {
if (strlen($input) == 0) {
return false;
} else {
// TODO: other checks?
return true;
}
}
?>
<!doctype html>
<html>
<body>
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
<?php if ($errmsg != ''): ?>
<p style="color: red;"><b>Please correct the following errors:</b><br />
<?php echo $errmsg; ?>
</p>
<?php endif; ?>
<p>Name: <input type="text" name="yourname" value="<?php echo htmlspecialchars(@$values['yourname']) ?>" /></P>
<P>Email: <input type="text" name="email" value="<?php echo htmlspecialchars(@$values['email']) ?>" /></p>
<P>Phone: <input type="text" name="phone" value="<?php echo htmlspecialchars(@$values['phone']) ?>"/></p><br />
<P>Subject: <input type="text" style="width:75%;" name="subject" value="<?php echo htmlspecialchars(@$values['subject']) ?>" /></p>
<p>Comments:<br />
<textarea name="comments" rows="10" cols="50" style="width: 100%;"><?php echo htmlspecialchars(@$values['comments']) ?></textarea></p>
<p><input type="submit" value="Submit"></p>
</form>
</body>
</html>
我有一个更高级的例子,你可以看到这里 ,可能会给你一些指导为好。
希望帮助。
最简单的方法是使用表单验证库 。 PHP的过滤器扩展,例如,提供验证和消毒对于某些类型的,但它不是一个完整的解决方案。
如果你坚持自己实现它,有一个问题你必须要考虑的是作为订单什么罪名:表单元素或在用户输入的订单的订单$_POST
。 大多数浏览器,这些都应该是一样的,但没有标准强制执行此。 如果要熄灭的形式秩序的,你需要在一个地方定义表单结构,并利用这些信息做这样的事情发生或验证的形式(的结果不要重复自己 (DRY)原则)。 遍历合适的结构会给你你想要的顺序:遍历窗体给您形成订单,而遍历$_POST
为您提供了用户输入顺序。
它看起来像你想更不是简单地对数据进行验证; 你也想准备使用它,一个名为“消毒”过程。
当谈到消毒,定义不同类型消毒剂的,而不是单一的check_input
功能。 具体消毒剂可能是功能或对象与__invoke
方法。 创建地图表单字段以卫生洗涤剂(例如,输入名称的阵列,以卫生洗涤剂回调)。 在映射中的元素的顺序设置的卫生处理的顺序; 如果使用单个结构来定义的形式的信息,显示顺序和消毒以便因此将是相同的。
这里是一个非常广泛的概述:
# $fields could be form structure or user input
foreach ($fields as $name => $data) {
# sanitize dispatches to the appropriate sanitizer for the given field name
$form->sanitize($name, $data);
# or:
//sanitize($name, $data);
# or however you choose to structure your sanitization dispatch mechanism
}
作为用于将输入的值设定为用户提供的数据,输出元件时简单地输出的元素值。 如同所有的用户输入(真的,全部格式化输出),输出时,它正确转义数据。 对于HTML属性,这意味着使用(例如) htmlspecialchars
。 请注意,你应该只逃脱传出的数据。 这意味着你的杀毒功能不应该叫htmlspecialchars
。
您可以通过将每个错误旁相应的输入,增加一个“错误”类别的元素和造型的“错误”类,使它脱颖而出提高可用性。 通过包装提高可访问<label>
标签周围的文本元素。
使用脚本的这种结构:
<?php
$errors = array();
if (isset($_POST['send'])) {
// check data validity
if (!mailValid($_POST['email']))
$errors[] = 'Mail is not valid';
...
// send data by email
if (!$errors) {
// send mail and redirect
}
}
?>
<html>
...
<?php
if ($errors) {
// display errors
foreach ($errors as $error) {
echo "$error<br />";
}
}
?>
<form ...>
...
Email: <input type="text" name="email" value="<?php echo isset($_POST['email']) ? htmlspecialchars($_POST['email']) : '' ?>" />
...
</form>
...
</html>
你总是可以像这样做,使用filter_var和in_array检查:
<?php
$myemail = "comments@myemail.com";
//Pre made errors array
$errors=array('name'=>'Enter Your name',
'email'=>'Please enter valid email',
'phone'=>'Please enter valid phone number',
'subject'=>'Please enter valid subject, more then 10 chars',
'comment'=>'Please enter valid comment, more then 10 chars');
//Allowed post params and its validation type
$types = array('name'=>'string',
'email'=>'email',
'phone'=>'phone',
'subject'=>'string',
'comment'=>'string');
//A simple validation function using filter_var
function validate($value,$type){
switch ($type){
case "email":
return ((filter_var($value, FILTER_VALIDATE_EMAIL))?true:false);
break;
case "phone":
return ((preg_match("/^[0-9]{3}-[0-9]{4}-[0-9]{4}$/", $value))?true:false);
break;
case "string":
return ((strlen($value) >=10 )?true:false);
break;
default:
return false;
break;
}
}
//If forms been posted
if(!empty($_POST) && $_SERVER['REQUEST_METHOD'] == 'POST'){
//Assign true, if all is good then this will still be true
$cont=true;
$error=array();
foreach($_POST as $key=>$value){
//if key is in $types array
if(in_array($key,$types)){
//If validation true
if(validate($value, $types[$key])==true){
$$key=filter_var($value, FILTER_SANITIZE_STRING);
}else{
//Validation failed assign error and swithc cont to false
$error[$key]=$errors[$key];
$cont=false;
}
}
}
}
if($cont==true && empty($error)){
//Send mail / do insert ect
}else{
//Default to form
?>
<!doctype html>
<html>
<body>
<form action="" method="post">
<p>Name: <input type="text" name="name" value="<?=@htmlentities($name);?>"/> <?=@$error['name'];?></P>
<P>Email: <input type="text" name="email" value="<?=@htmlentities($email);?>" /> <?=@$error['email'];?></p>
<P>Phone: <input type="text" name="phone" value="<?=@htmlentities($phone);?>"/> <?=@$error['phone'];?></p><br />
<P>Subject: <input type="text" style="width:75%;" name="subject" /> <?=@$error['subject'];?></p>
<p>Comments: <?=@$error['comment'];?><br />
<textarea name="comment" rows="10" cols="50" style="width: 100%;"><?=@htmlentities($comment);?></textarea></p>
<p><input type="submit" value="Submit"></p>
</form>
</body>
</html>
<?php
}?>