繁体   English   中英

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

[英]Check if email already exists in database

我有一个连接到我的数据库的测验表单,但我需要防止插入重复的电子邮件条目。 我尝试过以下方法:

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

两个问题:

  1. 你永远不会调用你的checkEmail()函数,所以它永远不会运行。 您应该从函数中删除该代码,或者只调用需要运行的函数。
  2. 在该功能中,您正在检查是否存在与“$ email”完全相同的电子邮件。 PHP只会用双引号解析变量 - 将该行改为使用where('email','=',"$email")

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

$result = mysql_num_rows(mysql_query($sql),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;
    }
}

还有几点要点:

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

暂无
暂无

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

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