2016-06-23 5 views
-4

電子メールがMySQLテーブル内で重複している場合、すでに登録済みであることをユーザーに伝えようとしています。 mysqli_connect_errno($ link)は '1062'を出力します。これは重複した主キーのコードです。いくつかのヒントが必要です。下のコードは「ありがとうございます!登録済みです!」電子メールアドレスが重複しているかどうかに関係なく、PHPのif ... elseif ....を設定して電子メールの登録を検証する

<?php 
$link = mysqli_connect("localhost", "mailpopper", "MAILpopPASSWORD", "mailpop"); 


// Ensure the connection is working 

if($link === false){ 
    die("Could not connect to database. Error: " . mysqli_connect_error()); 
} 


// Escape user inputs for security 

$first_name = mysqli_real_escape_string($link, $_POST['fname']); 
$last_name = mysqli_real_escape_string($link, $_POST['lname']); 
$org = mysqli_real_escape_string($link, $_POST['org']); 
$email_address = mysqli_real_escape_string($link, $_POST['email']); 

// attempt insert query execution 

$sql = "INSERT INTO mail (fname, lname, org, email) VALUES ('$first_name', '$last_name','$org', '$email_address')"; 

// HERE IS WHERE I NEED HELP 

$dupli = mysqli_errno($link); 

if($dupli = 1062){ 

    echo "Thanks! You're already registered!"; 
} 

elseif(mysqli_query($link, $sql)){ 

    echo "Success!"; 

} else{ 

    echo "Error: record was not updated. Unable to post. Please try again or contact site owner with error: " . mysqli_error($link); 

} 

// close connection 

mysqli_close($link); 

?> 

以下のコードは機能しますが、ユーザーが既に登録されている場合はカスタムメッセージは表示されません。ユーザーが既に登録されている場合は、 ""エラー:レコードが更新されていません。投稿できません。エラーで再試行するか、接触サイトの所有者ください:キー「PRIMARY」 の重複エントリー「[email protected]」 '

if(mysqli_query($link, $sql)){ 

    echo "Success!"; 

    else{ 

     echo "Error: record was not updated. Unable to post. Please try again or contact site owner with error: " . mysqli_error($link); 

    } 

    // close connection 

    mysqli_close($link); 

    ?> 
+2

*接続*エラーをチェックするのは何ですか? –

+0

あなたはそうです、私はmysqli_connection_errorをMysqli_errnoに変更しました。私はそれを働かせることができるかどうかを確かめるために物事を試していただけで何らかの理由でそれを切り替えた。 – Huntario

+0

少なくともdownvoting人々downvoting理由を教えてもいいですか? – Huntario

答えて

0
if($dupli = 1062){ 

あなたは比較演算子を使用していません。

if($dupli === 1062){ 

スニペットは少し混乱しますが、中間のものは使いたいものですか? SQLを実行する前にerrnoをチェックしていますか?

あなたがエラーを取得するために、間違った機能を使用している、この1 http://php.net/manual/en/mysqli.errno.php

を使用するには、あなたのコードを修正しようとしました:

$sql = "INSERT INTO mail (fname, lname, org, email) VALUES ('$first_name', '$last_name','$org', '$email_address')"; 
if(mysqli_query($link, $sql)){ 
    echo "Success!"; 
}else{ 
    $error = mysqli_errno($link); 
    $errorMessage = ""; 
    switch ($error) { 
     case 1062: 
      $errorMessage = "Thanks! You're already registered!"; 
      break; 
     default: 
      $errorMessage = "Error: record was not updated. Unable to post. Please try again or contact site owner with error: " . mysqli_error($link); 
      break; 
    } 
    echo $errorMessage; 
} 
  • をinsert文に

    • リターンを実行します真または偽
  • falseの場合、真、挿入は

  • を成功した場合:

    • は、error_code
    • をフェッチあなたが知っているいくつかのコードにそれを比較するために、スイッチ構造体に入れて、それに応じて
    • をメッセージを定義
    • (メッセージを簡単に追加)
    • 特にアドレス指定したくないエラーコードのデフォルトメッセージを定義します。
    • 表示メッセージ

編集:エラーが発生した場合にはデフォルトのメッセージとして@Your常識

で述べたように

は、あなたがエラーをご紹介するようにユーザーに尋ねます。

あなたがしたくない場合は、自分でログに記録しない限り、そのエラーについて知ることはできません。エラーログを処理する方法はいくつかあります。具体的には、error_log()を使用してメッセージをファイルに書き込んだり、あなたのアドレスでメールを送信したりすることができます。

私はコードに簡単な例を追加します:

switch ($error) { 
    case 1062: 
     $errorMessage = "Thanks! You're already registered!"; 
     break; 
    default: 
     $errorMessage = "Error: record was not updated. Unable to post. Please try again later, the site owner has been informed and will fix the problem."; 
     error_log('Error occured at date: ' . date('Y-m-d H:i:s') . ' in file: ' . __FILE__ . ' trying to insert into db' . PHP_EOL, 3, 'database_errors.txt'); 
     break; 
} 
echo $errorMessage; 

この道をあなたはそれが「database_errors.txt」に記録されます場合として指定しなかった最大エラーコードが来るたびに(ログファイルのパスと名前を選択します)、エラーが発生したファイルとその時期に関する情報が表示されます。

もちろん、他の情報をログに追加することもできます。たとえば、クエリを書くか、必要なものを書き込むことができます。

php.iniまたはini_set()でディレクティブを設定して、エラーを処理することもできます。 http://php.net/manual/en/ini.list.php

対処:

You have to just throw an error, and then let PHP report it according to site-wide settings. So in your else statement you should write trigger_error(mysqli_error($link)); and then let PHP decide whether to log or to display the error.

switch ($error) { 
    case 1062: 
     $errorMessage = "Thanks! You're already registered!"; 
     break; 
    default: 
     $errorMessage = "Error: record was not updated. Unable to post. Please try again later, the site owner has been informed and will fix the problem."; 
     break; 
} 
trigger_error(mysqli_error($link)); 
echo $errorMessage; 

このように、すべてのエラーは、設定(php.iniの、ini_set)に従って処理されるであろう。このスイッチを使用してエラーメッセージを選択し、何が起きているか/操作が失敗した理由についてユーザにフィードバックを与えます。

+0

それは動作します!それは本当にあなたがそれをやったかクールです。私はif..elseif ... elseとcaseのどちらを使うべきかを勉強する必要があると思います。あなたのやり方は本当にきれいです。 – Huntario

+1

ユーザーに管理者にエラーを報告するよう頼まれました。 –

+1

@YourCommonSenseこの部分を意味しますか? '$ errorMessage ="エラー:レコードが更新されていません。投稿できません。 mysqli_error($ link); '?私はerror_loggingを答えに編集しました – Philipp

関連する問題