PHP电话号码验证


PHP phone number validation

如果用户输入了错误的英国电话号码格式或不是号码,但错误消息不起作用,我会尝试向用户显示错误消息。

HTML

<input type="text" name="phone" class="form-control" value="<?php echo $phone;?>" placeholder="Mobile Number "> 

<span class="error"><?php echo $phoneErr;?></span>

PHP

    $phoneErr = "";  
    $phone = "";
  if (empty($_POST["phone"])) {
     $phone = "";
   } else if(!preg_match( $phone, '/^(?:'('+?44')'s?|'+?44 ?)?(?:0|'(0'))?'s?(?:(?:1'd{3}|7[1-9]'d{2}|20's?[78])'s?'d's?'d{2}[ -]?'d{3}|2'd{2}'s?'d{3}[ -]?'d{4}) $/')) 
   {
       $phoneErr = "Invalid phone number"; 
   }else {
       $phone = test_input($_POST["phone"]);
   }
test_input($data) {
   $data = trim($data);
   $data = stripslashes($data);
   $data = htmlspecialchars($data);
   return $data;
}

如果不是数字,则不会向数据库中插入任何内容,但如果我键入的数字9223372036854775807将被插入,则该值不是我输入的值。我做了一些研究,我认为这个值意味着无效字符串。

我表格的其他部分都很好,只是电话号码不好,我不知道为什么。

首先:您的正则表达式(甚至被最后一个空格清除)与9223372036854775807不匹配。

并没有显示如何在数据库中插入值,但若上面的代码用于检查电话号码,那个么除非插入$_POST['phone'],否则如何插入任何电话号码都是个谜。但是,如果您之前尝试在$phone中转换$_POST['phone'],为什么要插入它?

我说"试试",因为事实上$phone = test_input($_POST["phone"])这条线从来没有发生过。

如果$_POST['phone']为空,则将$phone设置为空字符串(这是不必要的:$phone已经是空字符串,但这不是问题),否则将测试正则表达式,但在$phone(空字符串)上测试,而不是在$_POST['phone']上测试;此外,您反转了preg_match参数,因此实际上您测试了一个空模式是否与字符串/^(?:'('+?44')'s?|' ...匹配。

你必须用这样的方式重写你的检查程序:

$phoneErr = False;  
$phone    = "";
if( ! empty( $_POST["phone"] ) ) 
{
    $pattern = '/^(?:'('+?44')'s?|'+?44 ?)?(?:0|'(0'))?'s?(?:(?:1'd{3}|7[1-9]'d{2}|20's?[78])'s?'d's?'d{2}[ -]?'d{3}|2'd{2}'s?'d{3}[ -]?'d{4})$/';
    if( !preg_match( $pattern, $phone ) )
    {
        $phoneErr = "Invalid phone number"; 
    }
    else 
    {
        $phone = test_input($_POST["phone"]);
    }
}
(...)
if( $phoneErr )
{
    // Your error routine here
}
elseif( $phone )
{
    // Insert $phone (not $_POST['phone']) to database
}

关于正则表达式,在使用之前,请在regex101.com上使用多个英国有效数字对其进行检查。或者,您可以尝试注释中引用的有问题的正则表达式。

已解决

<?php
 require_once('connect.php');
    if(isset($_POST['submit']))
    {
        $name= strip_tags($_POST['name']);  
        $phone = strip_tags($_POST['phone']);   
        if($name=="")   {
            $error[] = "Please enter name.";    
        }
        else if(!preg_match('/^[a-zA-Z ]*$/', $name)) 
        {
            // check if name only contains letters and whitespace
           $error[] = "Only letters and white space allowed for name"; 
        }
    else
    {
        if( !empty($phone) ) 
        {
            $pattern = '/^(?:'('+?44')'s?|'+?44 ?)?(?:0|'(0'))?'s?(?:(?:1'd{3}|7[1-9]'d{2}|20's?[78])'s?'d's?'d{2}[ -]?'d{3}|2'd{2}'s?'d{3}[ -]?'d{4})$/';
            if(!preg_match($pattern, $phone)){
                $error[] = 'Please enter a valid phone number!';
            }else{

         try {
             $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
             $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);     
             $stmt =$conn->prepare( "INSERT INTO contact (name,phone)
                  VALUES( :name, :phone)");
              $stmt->bindparam(':name', $name); 
              $stmt->bindparam(':phone', $phone);   
              $stmt->execute(); 
            }catch(PDOException $e) {
             echo "Error: " . $e->getMessage();
             die();
            }
            }
        }
        }
}
?>