2017-03-02 49 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

相關問題