Проверьте, существует ли электронная почта в базе данных

У меня есть викторина, связанная с моей базой данных, однако мне нужно предотвратить вставку повторяющихся вложений электронной почты. Я пробовал следующее:

//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; } } 

Solutions Collecting From Web of "Проверьте, существует ли электронная почта в базе данных"

Две проблемы:

  1. Вы никогда не вызываете checkEmail() чтобы она никогда не запускалась. Вы должны либо удалить этот код из функции, либо просто вызвать функцию, в которой она должна запускаться.
  2. В этой функции вы проверяете, нет ли электронной почты, которая буквально равна «$ email». PHP будет анализировать только переменные в двойных кавычках – измените эту строку, чтобы использовать where('email','=',"$email") .

Измените mysql_result на mysql_num_rows, как показано ниже, и попробуйте.

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

Ваша функция никогда не выполняется. Вам нужно будет определить функцию вне функции action_myquiz, а затем вызвать ее. Также в предложении «где» вы не правильно передаете адрес электронной почты, и вы можете просто использовать «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; } } 

Несколько дополнительных моментов:

  • Raj правильно, что блок Try / Catch может быть лучше
  • Убедитесь, что ваши данные удалены, прежде чем переходить к SQL-запросам, ваша инфраструктура может сделать это для вас.

В PHP вы не можете поместить функцию внутри другой функции. Поэтому вам нужно разместить его вне вашей функции action_myquiz . Вы также захотите изменить mysql_result на mysql_num_rows . Что-то вроде этого

 //Check for duplicate email addresses function checkEmail($email){ $sql = DB::select('email')->from('myquiz')->where('email','=',"$email")->execute(); $result = mysql_num_rows(mysql_query($sql),0) ; if( $result > 0 ){ return true; } return false; } //Now start your other function function checkEmail($email){ 

Затем внутри вашей функции action_myquiz вам нужно вызвать функцию checkEmail . подобно

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