1

我最近一直在做一个表格。它工作正常。我只想向它添加一个调整,如果一个人注册了一个已经在数据库中注册的电子邮件 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?>
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);

QUERY:不变,使用您的查询。

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']). 然后检查此查询是否返回任何内容。如果返回的行数大于零,则此电子邮件已被占用。否则,我们可以根据您已有的插入查询插入新行。

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

因此,如果 validate_form() 没有检测到任何错误,则运行插入查询。

于 2012-06-02T19:53:51.350 回答