2016-09-20 188 views
0

在我的mysql数据库中,我将'email'字段设置为唯一约束。我不希望两个或更多用户拥有相同的电子邮件地址。我创建了这个函数来检查。如果不同的用户试图使用相同的地址,我只希望该函数能够运行。这是函数:引发QLSTATE的唯一约束[23000]:完整性约束违规:1062因为唯一约束而重复

<?php 

    function Email_gogo() { 

    if(!empty($_POST['email'])) 
    { 

    $mysql_hostname = '*****'; 
    $mysql_username = '*****'; 
    $mysql_password = '*****'; 
    $mysql_dbname = '*****'; 

    try { 
    $db= new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", `enter code here`$mysql_username, $mysql_password); 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } catch (PDOException $e) { 
    exit($e->getMessage()); 
     } 
     $query_email = " 
      SELECT 
      email 
      from users 
      where 
      email = :email 
     "; 

     $query_goes = array(

     ':email' => $_POST['email'] 

     ); 

     Try{ 
      $stmt = $db->prepare($query_email); 
      $stmt ->execute($query_goes); 
      while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 

      } 
     } 
     catch(PDOException $ex){ 
      echo 'ERROR: '. $ex->getMessage(); 
     } 
     if($stmt->rowCount() > 0){ 

      echo("That Email is already in use..."); 
     } 


    } 

    } 

    ?> 

此功能在脚本,让管理员检查用户的姓名,电子邮件和姓叫了起来。用户名不能更改。这是我更新的脚本。这是脚本:

<?php 


require("common.php"); 
require_once("gogo.php"); 

if(empty($_SESSION['user'])) 
{ 

    header("Location: ../hound/login.php"); 


    die("Redirecting to ../hound/login.php"); 
    } 

if(!empty($_POST)) 
{ 

if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) 
{ 

    die("Please enter a valid email address..."); 
} 

} 
    Email_gogo(); 

    $array_value = array(
     ':email' => $_POST['email'], 
     ':first_name' => $_POST['first_name'], 
     ':last_name' => $_POST['last_name'], 
     ':id' => $_POST['id'] 
    ); 



    $query = "UPDATE users 
     SET 
     email = :email, 
     first_name = :first_name, 
     last_name = :last_name 

     WHERE 
      id = :id 
    "; 


    try 
    { 

     $stmt = $db->prepare($query); 
     $result = $stmt->execute($array_value); 
    } 
    catch(PDOException $ex) 
    { 

     die("Ouch, failed to run query: " . $ex->getMessage()); 
    } 



    header("Location: users.php"); 


    die("Redirecting to users.php"); 

    ?> 

这是错误:该电子邮件已在使用中(从函数)。它确实检查电子邮件是否正在使用,但它会引发另一个错误:

Ouch, failed to run query: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicata du champ '[email protected]' pour la clef 'email'

(此错误来自脚本)。

我在脚本中间调用了函数。我的问题是我应该使用该函数,并让它只在用户尝试使用相同地址时运行。先谢谢你。

+0

看看http://stackoverflow.com/questions/18643648/mysql-insert-query-returns-error-1062-23000-duplicate-entry-2147483647-for – daremachine

回答

1

问题是你的函数实际上并没有返回任何东西,它只是显示一个错误消息,之后PHP将继续其正常执行。因此,无论电子邮件是否正在使用,您的“更新”查询都将被执行。这是你应该Email_gogo

function Email_gogo() 
{ 
    if(!empty($_POST['email'])) 
    { 
     $mysql_hostname = '*****'; 
     $mysql_username = '*****'; 
     $mysql_password = '*****'; 
     $mysql_dbname = '*****'; 

     try 
     { 
      $db= new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", `enter code here`$mysql_username, $mysql_password); 
      $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     } 
     catch (PDOException $e) 
     { 
      exit($e->getMessage()); 
     } 

     $query_email = " 
     SELECT 
     email 
     from users 
     where 
     email = :email 
     "; 

     $query_goes = array(

     ':email' => $_POST['email'] 

     ); 

     try 
     { 
      $stmt = $db->prepare($query_email); 
      $stmt ->execute($query_goes); 
     } 
     catch(PDOException $ex) 
     { 
      echo 'ERROR: '. $ex->getMessage(); 
     } 

     if($stmt->rowCount() > 0) 
      return false; 
     else 
      return true; 
    } 
} 

做什么然后当你一会儿再打吧:

if(Email_gogo()) 
{ 
    $array_value = array(
     ':email' => $_POST['email'], 
     ':first_name' => $_POST['first_name'], 
     ':last_name' => $_POST['last_name'], 
     ':id' => $_POST['id'] 
    ); 



    $query = "UPDATE users 
     SET 
     email = :email, 
     first_name = :first_name, 
     last_name = :last_name 

     WHERE 
      id = :id 
    "; 


    try 
    { 

     $stmt = $db->prepare($query); 
     $result = $stmt->execute($array_value); 
    } 
    catch(PDOException $ex) 
    { 

     die("Ouch, failed to run query: " . $ex->getMessage()); 
    } 



    header("Location: users.php"); 


    die("Redirecting to users.php"); 
} 
else 
    die("Email address already in use"); 

此外,“while”循环中的作用是完全不必要的。你可以删除它。方法rowCount()不需要遍历每条记录来知道有多少条记录。

编辑:添加完整的代码更好的清晰度。

+0

你的代码改进工作。我仍然收到1062错误。但是,我忘了提及。电子邮件是我的数据库中的一个索引,它被设置为唯一。这就是1062错误发生的原因。我如何避免1062错误,并让它回应电子邮件正在使用? – Grus

+0

检查我的编辑,我并入了完整的代码,而不是片段。也许这会有所帮助。 – Osuwariboy

+0

谢谢你的帮助。得到它为我工作。重写确实有帮助。再次感谢。 :) – Grus

相关问题