2014-03-31 223 views
0

我有一個連接到我的數據庫的測驗表單,但是我需要防止插入重複的電子郵件條目。 我曾嘗試以下:檢查數據庫中是否已存在電子郵件

//Check for duplicate email addresses 
      function checkEmail($email){ 
       $sql = DB::select('email')->from('myquiz')->where('email','=','$email')->execute(); 

       $result = mysql_result(mysql_query($sql),0) ; 

       if($result > 0){ 
       die("There is already a user with that email!") ; 
       }//end if 
      } 

但我仍然得到重複的條目,這是我所有代碼(可能是我沒有在正確的位置上運行嗎?)

public function action_myquiz() { 
    $this->template->styles['assets/css/myquiz.css'] = 'screen'; 
    $this->template->jscripts[] = 'assets/scripts/myquiz.js'; 
    $this->template->content = View::factory('quiz/myquiz'); 
     $this->template->content->thanks = false; 
     if ($this->request->post('entry')) { 
      $post = $this->request->post('entry'); 

      //Check for duplicate email addresses 
      function checkEmail($email){ 
       $sql = DB::select('email')->from('myquiz')->where('email','=','$email')->execute(); 

       $result = mysql_result(mysql_query($sql),0) ; 

       if($result > 0){ 
       die("There is already a user with that email!") ; 
       }//end if 
      } 

      // save participant's info 
      $stmt = DB::query(Database::INSERT, 'INSERT INTO `myquiz` (`first_name`, `last_name`, `email`, `confirm_email`) 
                     VALUES (:first_name, :last_name, :email, :confirm_email)');              
      $stmt->param(':first_name', $post['first_name']); 
      $stmt->param(':last_name', $post['last_name']); 
      $stmt->param(':email', $post['email']); 
      $stmt->param(':confirm_email', $post['confirm_email']); 
      try { 
       $stmt->execute(); 
      // var_dump($post); 
      } catch (Exception $e) { 
       FB::error($e); 
      } 

      $this->template->content->thanks = true; 
     } 
    } 
+2

而不是檢查電子郵件是否存在之前插入我會建議嘗試添加一個try/catch塊。捕獲重複的關鍵異常,然後指出該電子郵件是重複的。 – Raj

+1

或使電子郵件字段UNIQUE,然後嘗試趕上像拉吉說 –

+3

也確保你用雙引號包裝變量''$ email''應該是'''$ email'「'或只是'$ email'。你不能在單引號內解析變量 – mic

回答

2

兩個問題:

  1. 你永遠不會打電話給你的checkEmail()函數,所以它永遠不會運行。您應該從函數中刪除該代碼,或者只是在需要運行的地方調用該函數。
  2. 在那個函數中,你檢查沒有電子郵件存在,字面上等於「$ email」。 PHP將只使用雙引號解析變量 - 將該行更改爲使用where('email','=',"$email")
0

將mysql_result更改爲mysql_num_rows,如下面的第一個函數,並嘗試。

$result = mysql_num_rows(mysql_query($sql),0) ; 
0

您的功能從未執行。您需要在action_myquiz函數之外定義函數,然後調用它。另外在'where'子句中,您沒有正確傳遞電子郵件地址,您只需使用'mysql_num_rows'返回行數。

試試這個:

//Check for duplicate email addresses 
private function checkEmail($email) 
{ 
    $sql = DB::select('email')->from('myquiz')->where('email', '=', $email)->execute(); 

    $result = mysql_num_rows(mysql_query($sql),0) ; 

    if($result > 0) 
    { 
     die("There is already a user with that email!") ; 
    } 
} 

public function action_myquiz() 
{ 
    $this->template->styles['assets/css/myquiz.css'] = 'screen'; 
    $this->template->jscripts[] = 'assets/scripts/myquiz.js'; 
    $this->template->content = View::factory('quiz/myquiz'); 
    $this->template->content->thanks = false; 
    if ($this->request->post('entry')) { 
     $post = $this->request->post('entry'); 

     // Check if email exists 
     $this->checkEmail($_POST['email']); 

     // save participant's info 
     $stmt = DB::query(Database::INSERT, 'INSERT INTO `myquiz` (`first_name`, `last_name`, `email`, `confirm_email`) 
                    VALUES (:first_name, :last_name, :email, :confirm_email)');              
     $stmt->param(':first_name', $post['first_name']); 
     $stmt->param(':last_name', $post['last_name']); 
     $stmt->param(':email', $post['email']); 
     $stmt->param(':confirm_email', $post['confirm_email']); 
     try { 
      $stmt->execute(); 
     // var_dump($post); 
     } catch (Exception $e) { 
      FB::error($e); 
     } 

     $this->template->content->thanks = true; 
    } 
} 

一對夫婦的附加分:

  • 拉吉是正確的,一個try/catch塊可能會傳遞到SQL之前更好
  • 確保您的數據逃脫查詢,你的框架可能會爲你做這件事。
0

在PHP中,你不能在另一個函數中放置一個函數。所以你需要把它放在你的action_myquiz函數之外。您還需要將mysql_result更改爲mysql_num_rows。這樣

​​

東西然後你action_myquiz功能裏面你需要打電話給你checkEmail功能。像

if(checkEmail($email) === false) { 
    //Proceed with insert 
} else { 
    //Don't do insert 
} 
相關問題