检查重复的数据库条目

时间:2012-06-02 18:14:22

标签: php mysql

我最近一直在制作表格。它工作正常。我只想添加一个调整,如果一个人注册了一个已在数据库中注册的电子邮件ID,就会显示错误。 这是我的整个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?>

5 个答案:

答案 0 :(得分: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行修改。

答案 1 :(得分:1)

首先,将您的电子邮件设为一个独特的:

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

或通过查询:

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

然后,你可以检查mysql_affected_rows为@sachleen上面说的:

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

答案 2 :(得分:0)

DDL:

ALTER TABLE employee ADD UNIQUE KEY idx_email (email);

QUERY:不会更改,请使用您的查询。

PHP LAYER:

$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错误。我们需要捕获它,因为它具有唯一的电子邮件字段,但也可能因为您破坏了主键或我们忽略存在的另一个唯一字段而引发了它。如果您认为在此查询期间某些其他唯一约束可能会中断,则必须调整此代码。

答案 3 :(得分:0)

所有答案都建议在表格中添加索引,但由于电子邮件是文本输入,因此根据您的数据库,索引可能会变得非常庞大。我会从一开始就添加一个类似于5个符号的索引,并查询特定的电子邮件(从而将检查单独移动到php端),而不是在整列上添加索引。

答案 4 :(得分:0)

首先,我不会在查询中直接使用$_POST['name']。这对sql injection attack开放。所以将它包装在mysql_escape_string中。 除非这是“播放代码”,否则不会在任何地方使用。

要进行唯一的电子邮件验证,请对电子邮件字段应用Unique约束,如前所述。但在插入新行之前,请执行以下查询:'select email from employee where email = '. mysql_escape_string($_POST['email'])。然后检查此查询是否返回了任何内容。如果返回的行数大于零,则此电子邮件已被占用。否则,我们可以根据您已有的插入查询插入新行。

另外,请将表单代码,验证和数据库代码分开。像添加函数Validate_form()一样,它将检查所有表单条目。如果有错误,请返回包含所述问题的字符串。如果没有错误,则返回null。 此validate_form可能包含用于检查现有电子邮件的代码,并提供错误文本以防电子邮件被删除。

因此,如果validate_form()没有检测到任何错误,那么请运行insert query。