2017-03-02 81 views
0

这是我的HTML和PHP存储电子邮件。我能做些什么来确保一个人实际上键入一个电子邮件而不是随机字符。也许代码看它是否有。“extension”或“@”符号。另外我如何防止重复的电子邮件条目。另外,我希望它在提交时提醒网站访问者成功,我该如何实现这一点?如何过滤在html上输入表单的电子邮件?

任何帮助,将不胜感激!谢谢!

HTML:

<div class="row"> 
    <div class="col-md-12"> 
     <div class="call-to-action text-center"> 
      <form class="form-inline margin-clear"> 
       <div class="form-group has-feedback"> 
        <label class="sr-only" for="subscribe3">Email address</label> 
        <input type="email" class="form-control form-control-lg" id="subscribe3" placeholder="Enter email" name="subscribe3" required=""> 
        <i class="fa fa-envelope form-control-feedback"></i> 
       </div> 
       <button type="submit" class="btn btn-lg btn-gray-transparent btn-animated margin-clear">Subscribe <i class="fa fa-send"></i></button> 
      </form> 
     </div> 
    </div> 
</div> 

PHP:

<?php 
//checking if data has been entered 
if(isset($_POST['subscribe3']) && !empty($_POST['subscribe3'])) 
{ 
    $data = $_POST['subscribe3']; 
} else { 
    header('location: index.html'); 
    exit(); 
} 

//setting up mysql details 
$sql_server = 'localhost'; 
$sql_user = 'root'; 
$sql_pwd = '*PASSWORD*'; 
$sql_db = 'newsletter'; 

// USE A PREPARED STATEMENT LIKE SO FOR SAFETY 
$mysqli = new mysqli($sql_server, $sql_user, $sql_pwd, $sql_db) or die($mysqli->error); 

/* Make sure its an email */ 
if(filter_var($email, FILTER_VALIDATE_EMAIL)){ 
     $query = "INSERT IGNORE INTO email (emails) 
VALUES (?)"; 
$stmt = $conn->prepare($query); 
if($stmt){ 
    $stmt->bind_param("s=",$data); 
    $stmt->execute(); 
    $stmt->close(); 
    $successmessage = "successfully inserted email"; 
} 

    //closing mysqli connection 
    $mysqli->close(); 
    if(isset($_POST['submit'])){ 
    echo $successmessage; 
    } 

?> 
+1

**警告**:使用'mysqli'时,应该使用[参数化查询](http://php.net/manual/en/mysqli.quickstart.prepared -statements.php)和['bind_param'](http://php.net/manual/en/mysqli-stmt.bind-param.php)将用户数据添加到您的查询中。 **不要**使用字符串插值或连接来完成此操作,因为您创建了严重的[SQL注入漏洞](http://bobby-tables.com/)。 **不要**将'$ _POST','$ _GET'或**任何**用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。 – tadman

+0

@tadman我对此很新,我会说你说的一半是有道理的。无论如何,你可以告诉我如何实施/解决这个问题吗? – Binary111

+0

这就是为什么我在该评论中放置了一堆链接,每一个都在更详细的解释。 – tadman

回答

0

你可以做多件事情:

  1. pregmatch ...只是正则表达式快速的例子,使用类似rubular .com来测试它

    if(pregmatch('/^EXPRESSION $ /'){0} {

    echo“valid”;

    {

  2. 或使用内置的电子邮件过滤器的PHP

http://php.net/manual/en/filter.filters.validate.php

<?php 
    //checking if data has been entered 
    if(isset($_POST['subscribe3']) && !empty($_POST['subscribe3'])) 
    { 
     $data = $_POST['subscribe3']; 
    } else { 
     header('location: index.html'); 
     exit(); 
    } 

    //setting up mysql details 
    $sql_server = 'localhost'; 
    $sql_user = 'root'; 
    $sql_pwd = '*password*'; 
    $sql_db = 'newsletter'; 

    // USE A PREPARED STATEMENT LIKE SO FOR SAFETY 
    $mysqli = new mysqli($sql_server, $sql_user, $sql_pwd, $sql_db) or die($mysqli->error); 

    /* Make sure its an email */ 
    if(filter_var($email, FILTER_VALIDATE_EMAIL)){ 
      $query = "INSERT IGNORE INTO email (emails) 
    VALUES (?)"; 
    $stmt = $conn->prepare($query); 
    if($stmt){ 
     $stmt->bind_param("s=",$data); 
     $stmt->execute(); 
     $stmt->close(); 
     $successmessage = "successfully inserted email"; 
    } 
} 
    //closing mysqli connection 
    $mysqli->close(); 
    if(isset($_POST['submit'])){ 
    echo $successmessage; 
    } 

?> 

至于防止重复,INSERT IGNORE应停止只要你有一个很好的PK组。否则,您可以运行SELECT快速查询来检查是否存在任何行,然后对准备好的插入进行if测试,如if($ numRows == 0)然后插入。我发送的这个也会显示成功的提交信息

+0

我想我以前看过有关这些过滤器的一些东西,我如何将它们实现到我当前的php中? – Binary111

+0

我会尽快输入一些内容并在短时间内编辑我的帖子 – clearshot66

+0

这甚至不能*关闭*作为电子邮件验证器正则表达式。你测试过了吗?这甚至不会在'x @ gmail.com'上运行。 – tadman

相关问题