简体   繁体   English

检查数据库中是否已存在电子邮件

[英]Check if email already exists in database

I have a quiz form that is connected to my database, however I need to prevent duplicate email entries being inserted. 我有一个连接到我的数据库的测验表单,但我需要防止插入重复的电子邮件条目。 I have tried the following: 我尝试过以下方法:

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

But I 'm still getting duplicate entries, here is all my code (may be I'm not running this in the correct place?) 但是我仍然会收到重复的条目,这里是我的所有代码(可能是我没有在正确的位置运行它?)

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

Two problems: 两个问题:

  1. You're never calling your checkEmail() function so it's never running. 你永远不会调用你的checkEmail()函数,所以它永远不会运行。 You should either remove that code from the function or just call the function where it needs to run. 您应该从函数中删除该代码,或者只调用需要运行的函数。
  2. In that function you're checking that no email exists that literally equals "$email". 在该功能中,您正在检查是否存在与“$ email”完全相同的电子邮件。 PHP will only parse variables in double quotes - change that line to use where('email','=',"$email") instead. PHP只会用双引号解析变量 - 将该行改为使用where('email','=',"$email")

将mysql_result更改为mysql_num_rows,如下面的第一个函数,然后尝试。

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

Your function is never executed. 您的功能永远不会执行。 You will need to define the function outside the action_myquiz function and then call it. 您需要在action_myquiz函数之外定义函数,然后调用它。 Also in the 'where' clause your not passing the email address in correctly and you can just use 'mysql_num_rows' to return the number of rows. 同样在'where'子句中你没有正确传递电子邮件地址,你可以使用'mysql_num_rows'来返回行数。

Try this: 尝试这个:

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

A couple of additional points: 还有几点要点:

  • Raj is correct that a Try/Catch block might be better Raj是正确的,Try / Catch块可能更好
  • Ensure your data is escaped before passing into SQL queries, your framework might be doing this for you. 确保在传递到SQL查询之前对数据进行转义,您的框架可能正在为您执行此操作。

In PHP you can't place a function inside another function. 在PHP中,您不能将函数放在另一个函数中。 So you need to place it outside your action_myquiz function. 所以你需要将它放在action_myquiz函数之外。 You'll also want to change mysql_result to mysql_num_rows . 您还需要将mysql_result更改为mysql_num_rows Something like this 像这样的东西

//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){

Then inside your action_myquiz function you need to call your checkEmail function. 然后在action_myquiz函数中,你需要调用你的checkEmail函数。 Like 喜欢

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM