2016-09-20 9 views
0

私のmysqlデータベースでは、私は「電子メール」フィールドをユニーク制約として設定しました。 2人以上のユーザーが同じ電子メールアドレスを持つことは望ましくありません。私はそれを確認するためにこの関数を作成しました。別のユーザーが同じアドレスを使用しようとすると、その機能が実行されるだけです。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"); 

また、あなたの関数内のループが完全に不要である「ながら」。あなたはただそれを削除することができます。 rowCount()メソッドは、レコード数を知るために各レコードをループする必要はありません。

EDIT:より明確にするために完全なコードを追加しました。

+0

コードの改善が機能しました。私はまだ1062エラーが発生しています。しかし、私は言及するのを忘れた。電子メールは私のデータベースのインデックスであり、ユニークに設定されています。だからこそ1062エラーが発生しています。 1062エラーを回避するにはどうすればいいですか? – Grus

+0

私の編集をチェックしてください。スニペットの代わりに完全なコードを組み込みました。多分それが助けになるだろう。 – Osuwariboy

+0

ありがとうございます。それは私のために働くことができました。書き換えは本当に助けになりました。再度、感謝します。 :) – Grus

関連する問題