У меня есть викторина, связанная с моей базой данных, однако мне нужно предотвратить вставку повторяющихся вложений электронной почты. Я пробовал следующее:
//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; } }
Две проблемы:
checkEmail()
чтобы она никогда не запускалась. Вы должны либо удалить этот код из функции, либо просто вызвать функцию, в которой она должна запускаться. 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; } }
Несколько дополнительных моментов:
В 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 }