使用 php 验证 html 页面上的字段

Posted

技术标签:

【中文标题】使用 php 验证 html 页面上的字段【英文标题】:Validate fields on html page with php 【发布时间】:2015-12-18 04:03:32 【问题描述】:

请查找 index.html 和 submit.php 文件的代码。在loopo 的帮助下,两者都运行良好。我正在努力将验证代码放在哪里(在 index.html 文件或 submit.php 文件中)。我在 html 文件中使用 html5 输入类型,但我不知道在 submit.php 文件中究竟必须在哪里进行验证。我有多种形式,我按照建议制作了validations.php。我也不明白错误消息会显示在哪里?

您能否在 submit.php 文件中建议一个位置,我应该通过编辑 submit.php 文件来添加这些验证? 电子邮件正则表达式 ('/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]2,3)$/') 电话正则表达式 (^(?:(?:\+|00,2)91(\s*[\-]\s*)?|[0]?)?[789]\d9$)

index.html 文件

<form method="post" action="submit.php">
    <div class="box">
        <div class="cl"><input type="text" name="name" placeholder="Name" /></div>
        <div class="cl"><input type="text" name="city" placeholder="City" /></div>
        <div class="cl"><input type="text" name="mobile" placeholder="Mobile" /></div>
        <div class="cl"><input type="email" name="email" placeholder="Email" /></div>
        <div class="cl"><input type="text" name="sub" placeholder="Want 3 m Free Subscription (Yes/No)?"></textarea></div>
        <div class="cl"><input type="text" name="slogan" placeholder="Suggest a slogan for 6 m subscription"></textarea></div>
    </div>
    <div class="srow">
        <div class="cl1">
            <ul class="action">
                <li><input type="submit" value="Submit" /></li>
            </ul>
        </div>
    </div>
</form>

提交.php 文件

<?php
include 'config.php'; // store your configuration in a seperate file so 
                      // you only need to update it once when your environment changes

$errors = false;
$output = '';
$nl = '<br>'.PHP_EOL;
$redirect_url = 'index.html';

if (!$con = new mysqli(DBHOST,DBUSER,DBPASS,DBNAME))
    $errors = true;
    $output .= "ERROR Can't connect to DB".$nl;
;   


if (!$errors)
   //should validate/clean $_POST before using in query
   $name = $con->escape_string($_POST['name']);
   $city = $con->escape_string($_POST['city']);
   $email = $con->escape_string($_POST['email']);
   $mobile = $con->escape_string($_POST['mobile']);
   $sub = $con->escape_string($_POST['sub']);
   $slogan = $con->escape_string($_POST['slogan']);

   $sql="INSERT INTO members 
            (sName, sCity, sMobile, sEmail, sSub, sSlogan)
         VALUES ('$name', '$city', '$mobile', '$email',
                '$sub','$slogan')";

   if (!$con->query($sql)) //forgot a parenthesis here earlier
      $output .= 'ERROR: DB said: ('.$con->errno.') '.$con->error.$nl;
      $output .= 'Query was:'.$sql.$nl;
      $errors = true;
   else
     $output .= "1 record added".$nl;
   


if (!$errors)
   //if there are no errors redirect to index.html;
   header('refresh: 2; URL='.$redirect_url);
   $output .= '...Redirecting...'.$nl;
else
   //show the errors and allow display a link to go back/try again
   $output .= '<a href="'.$redirect_url.'">Try again</a>'.$nl;

echo $output;
?>

loopo 建议的验证,但不知道放置它的确切位置。我创建了一个validations.php 文件并包含在submit.php 中,但可能是我的语法错误,因此它不起作用。

function validate_name($input)
    // fairly naive rule:
    // upper and lower case latin characters and space
    // at least three character long
    // you may want to look at allowing other characters such as é ö etc.
    $input = trim($input); //get rid of spaces at either end
    if (preg_match('/^[a-zA-Z ]3,$/',$input) == 1)
        return $input;
    else
        return false;
    


  if (!empty($_POST['name'])
    if (!$name = $con->escape_string(validate_name($_POST['name']))
        $error = true;
        $output .= 'ERROR: Invalid Name: '.$_POST['name'].$nl;
    
  else
    $error = true;
    $output .= 'ERROR: No name specified'.$nl;
  

【问题讨论】:

所以您要做的就是对电子邮件和电话进行验证?如果是这样,最好将它们放在html中,首先不要给用户机会。 谢谢。实际上记录没有被添加到数据库中。它给出了一个空白页。我认为validations.php文件中的底部代码应该放在submit.php中,但它不起作用。 【参考方案1】:

可以通过直接向 php 文件发送请求来绕过 html 验证,因此在服务器端验证信息是一个不错的选择。

我建议你最好使用php的内置函数filter_var,为了干净的代码和准确/安全的结果,试试这个:

function validateEmail($email)
    if(filter_var($email,FILTER_VALIDATE_EMAIL))
        return true;
    


function validatePhonenb($nb)
    if(filter_var($nb,FILTER_VALIDATE_REGEXP,array("options"=>array("regexp"=>"/^(?:(?:\+|00,2)91(\s*[\-]\s*)?|[0]?)?[789]\d9$/")))
        return true;
    

由于没有验证电话号码,我使用了你的正则表达式,顺便说一句,你可以在继续之前使用 var_filter sanitize电话号码而不是验证它

我有多个表单,我按照建议制作了validations.php。我是 也不明白错误消息将显示在哪里

错误消息将显示在页面底部,因为它们在代码末尾被回显

echo $output;
?>

如果它们没有被移位,则更改回显包含错误的输出的位置并在其后执行die(),以便脚本在显示错误后停止执行

【讨论】:

谢谢。我把这段代码放在哪里,在 submit.php 或 validations.php 中。如果submit.php,应该放在什么位置? 你应该有php知识来处理php,无论如何这必须在validations.php中并从submit.php调用 我同意...我正在练习 php.. 你能给我从 submit.php 调用函数的语法吗?谢谢 if(validateEmail("email@here.com")) 此处代码 if(validatePhonenb("0011234567890")) 此处代码 谢谢。我也理解了为什么它不起作用的代码问题。我在 if (!empty($_POST['name']) 行和以下行中缺少括号。也不是 $error = true; 它应该是 $errors = true; 错过了字母 s。我想要问一件事。当显示错误以防它未被验证时,它会提供一个链接重试,但输入的数据会消失。我该如何取回它?

以上是关于使用 php 验证 html 页面上的字段的主要内容,如果未能解决你的问题,请参考以下文章

我们可以使用 jquery 验证不包含表单标签的 html 页面字段吗?

在内容页面上验证母版页登录表单时,内容页面字段也得到验证

整个页面上的 jQuery 验证

PHP 表单验证 - 必填字段

21PHP 表单验证

php之表单-2(表单验证)