1

最近フォームを作っています。それは正常に動作します。データベースに既に登録されている電子メールIDを登録するとエラーが表示されるように、1つ微調整を追加したいだけです。これが私のPHPコード全体です::

<?php
      //include the connection file

      require_once("validation.php");

if( isset($_POST['send']) && (!validateName($_POST['name']) || !validateEmail($_POST['email']) || !validatePasswords($_POST['pass1'], $_POST['pass2']) || !validateContact($_POST['contact']) || !validateAge($_POST['age'])) ):?>
            <div id="error">    
                <ul>
                    <? if(!validateName($_POST['name'])):?>
                        <li><strong>Invalid Name:</strong> We want names with more than 3 letters.</li>
                    <? endif?>
                    <? if(!validateEmail($_POST['email'])):?>
                        <li><strong>Invalid E-mail:</strong> Type a valid e-mail please.</li>
                    <? endif?>
                    <? if(!validatePasswords($_POST['pass1'], $_POST['pass2'])):?>
                        <li><strong>Passwords are invalid:</strong> Passwords doesnt match or are invalid!</li>
                    <? endif?>
                    <? if(!validateContact($_POST['contact'])):?>
                        <li><strong>Please enter a valid number.</strong></li>
                    <? endif?>
                    <? if(!validateAge($_POST['age'])):?>
                        <li><strong>Please enter a valid age</strong></li>
                    <? endif?>
                    <? if(!validateWork($_POST['work'])):?>
                        <li><strong>Please enter work</strong></li>
                    <? endif?>
                    </ul>
            </div>
        <?php elseif(isset($_POST['send'])):?>
            <div id="error" class="valid">
                <ul>
                <?php
                require_once('connection.php'); 
                $query = "INSERT INTO employee (name, password, email, contact, age, gender, location, skill, work) VALUES ";                           
                $query .= "('".$_POST['name']."', '".$_POST['pass1']."', '".$_POST['email']."','".$_POST['contact']."','".$_POST['age']."','".$_POST['gender']."','".$_POST['location']."','".$_POST['skill']."','".$_POST['work']."')";
                // run the query
                mysql_query($query);?>
                <li><strong>Congratulations!</strong> You have been successfully registered!</li>
                </ul>
            </div>
    <?php endif?>
4

5 に答える 5

2

重複がないように、電子メール フィールドにUNIQUE制約を与えることができます。その場合、INSERTクエリは失敗し、クエリは を返しfalseます。

if (!mysql_query($query)) {
    // Error, email already exists, no data was inserted
} else {
    // Successfully inserted row, print success message.
}

INSERTクエリは実際には失敗、変更された 0 行を返すだけではありません。

于 2012-06-02T18:17:47.843 に答える
1

まず、メールを一意のものにします。

CREATE TABLE employee { ..., UNIQUE KEY theemail (email) }   # in create table

またはクエリ経由:

ALTER TABLE employee ADD UNIQUE KEY theemail (email);   # via console etc. phpmyadmin

次に、@ sachleen が上記で述べたように、mysql_affected_rows を確認するだけです。

$query = "INSERT INTO employee (name, password, email, contact, age, gender, location, skill, work) VALUES ";                           
$query .= "('".$_POST['name']."', '".$_POST['pass1']."', '".$_POST['email']."','".$_POST['contact']."','".$_POST['age']."','".$_POST['gender']."','".$_POST['location']."','".$_POST['skill']."','".$_POST['work']."')";
$result = mysql_query($query);
$affected_rows = ($result ? mysql_affected_rows($result) : 0);
if ($affected_rows==0) {
   // fail
}

もっと簡単に:

$result = mysql_query($query);
if (!$result) {
   // fail
}
于 2012-06-02T18:35:09.637 に答える
0

DDL:

ALTER TABLE employee ADD UNIQUE KEY idx_email (email);

クエリ: 変更されません。クエリを使用してください。

PHP層:

$query = "...";
try {
    mysql_query($query);
} catch(Exception $ex) {
    if (mysql_errno() == 1062) {
        throw new Exception('The email you used exists already');
    } else {
        throw $ex;
    }
}

1062 エラーは、一意のキーが破損するたびに発生します。一意の電子メール フィールドのためにそれをキャッチする必要がありますが、存在を無視する主キーまたは別の一意のフィールドを壊したために発生する可能性もあります。このクエリ中に他の一意の制約が壊れる可能性があると思われる場合に備えて、このコードを調整する必要があります。

于 2012-06-02T19:34:18.093 に答える
0

すべての回答はテーブルにインデックスを追加することを提案していますが、メールはテキスト入力であるため、データベースによってはインデックスが非常に大きくなる可能性があります。列全体にインデックスを追加するのではなく、最初から5つのシンボルのようなインデックスを追加し、特定の電子メールを照会します(したがって、一意のチェックをphp側に移動します)。

于 2012-06-02T19:40:06.783 に答える
0

まず$_POST['name']、クエリでは直接使用しません。これは、 SQL インジェクション攻撃に対してオープンです。したがって、それをmysql_escape_stringでラップします。これがどこにも使用されない「コードで遊ぶ」場合を除きます。

独自の電子メール検証を行うには、Unique既に述べたように、電子メール フィールドに制約を適用してください。ただし、改行を挿入する前に、次のようなクエリを実行してください'select email from employee where email = '. mysql_escape_string($_POST['email'])。次に、このクエリによって何かが返されたかどうかを確認します。ゼロより大きい行数が返された場合、このメールは既に取得されています。それ以外の場合は、既にある挿入クエリに従って、新しい行を挿入できます。

もう1つ、フォームコード、検証、およびDBコードを分離してください。同様に、すべてのフォームエントリをチェックする関数 Validate_form() を追加します。エラーがある場合は、説明されているすべての問題を含む文字列を返します。エラーがない場合は、null を返します。この validate_form には、既存の電子メールをチェックするためのコードが含まれている場合があり、電子メールが既に取得されている場合に備えてエラー テキストを提供します。

したがって、validate_form() でエラーが検出されない場合は、挿入クエリを実行してください。

于 2012-06-02T19:53:51.350 に答える