【问题标题】:How can I properly validate for a unique email address?如何正确验证唯一的电子邮件地址?
【发布时间】:2015-01-03 21:50:45
【问题描述】:

我试图让我的表单验证电子邮件地址 onblur 或 onkeyup,以检查电子邮件地址是否已存在于我的数据库中。

不确定我是否几乎可以使用此代码,但有些东西不起作用。现在,只要我开始在该字段中输入,电子邮件的输入框就会根据我希望它的标记方式进行标记,如果电子邮件地址已经在我的数据库中输入的话。 AJAX 中的 else 语句不起作用,如果我仍然提交表单,我会从我创建的错误框中收到一条消息,指出语法错误。

另外,我的部分 php 正在使用 mysqli 和 mysql,这与尝试验证此输入字段有什么不同吗?

输入id为email,名称为Email;我认为我的代码是正确的,但并不完全确定。

PHP:

define('DB_NAME', 'database');
define('DB_USER', 'user');
define('DB_PASSWORD', 'password');
define('DB_HOST', 'host');

$first = Trim(stripslashes($_POST['First']));
$last = Trim(stripslashes($_POST['Last']));
$city = Trim(stripslashes($_POST['City']));
$state = Trim(stripslashes($_POST['State']));
$country = Trim(stripslashes($_POST['Country']));
$email = Trim(stripslashes($_POST['Email']));
$tempt = $_POST['tempt'];
$tempt2 = $_POST['tempt2'];


$link = mysqli_connect('host','user','password','members') or die("Error " . mysqli_error($link)); 
$stmt = mysqli_prepare($link, 'SELECT count(*) FROM members WHERE email =?');
mysqli_stmt_bind_param($stmt, 's', $_POST['Email']);
mysqli_stmt_execute($stmt);
/* bind result variables */
mysqli_stmt_bind_result($stmt, $count);
/* fetch value */
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);

if ($count == 0) {
    echo 'true';
}else{
    echo 'false';
}


if ($tempt == 'http://' && empty($tempt2)) {

    $error_message = '';
    $reg_exp = "/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9­-]+\.[a-zA-Z.]{2,5}$/";

    if(!preg_match($reg_exp, $email)) {

        $error_message .= "<p>A valid email address is required.</p>";
    }
    if (empty($first)) {
        $error_message .= "<p>Please provide your first name.</p>";
    }
    if (empty($last)) {
        $error_message .= "<p>Please provide your last name.</p>";
    }

AJAX:

$(function() {
    if (valid != '') {
    $('form #response2').removeClass().addClass('error2')
        .html('' +valid).fadeIn('fast');
}

    var valid = '';

    $('#email').keyup(function() {
        $.post('script.php', { 'Email' : $(this).val() }, function(data) {
             if(data !== 'true') {
                $('#email').css('border','2px solid #ff0000');
                $('#email').css('background-color','#ffcece');
                valid += '<p>This email has already subscribed.</p>';
             }else{
                $('#email').css('background-color','green');
             }
        });
    });
});

【问题讨论】:

  • 您的 php 页面上的数据库连接在哪里?
  • 它在我的页面底部
  • 但是您正在查询它以返回正确的电子邮件匹配?可以发一下吗?
  • 我刚刚定义了它。
  • 哦,是的,那你需要做一个查询,见@amit_183。

标签: php ajax


【解决方案1】:
$(function() {
    $('#txt_email').blur(function() {
        $.post('location/to/script.php', { 'txt_email' : $(this).val() }, function(data) {
             if(data !== 'true') {
                $('#txt_email').css('background', 'red');
             }else{
                $('#txt_email').css('background', 'white');
             }
        });
    });
});

【讨论】:

  • 欢迎来到 Stack Overflow!虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性 cmets 挤满你的代码,因为这会降低代码和解释的可读性!
【解决方案2】:

您无需获取所有电子邮件即可检查已发布的电子邮件是否已存在。 你可以做一个简单的计数和测试记录的数量。如果它为 0,则电子邮件不在数据库中

这样的东西应该可以工作(未经测试):

HTML

<input type="text" name="txt_email" id="txt_email" />

jQuery

$(function() {
    $('#txt_email').blur(function() {
        $.post('location/to/script.php', { 'txt_email' : $(this).val() }, function(data) {
             if(data !== 'true') {
                $('#txt_email').css('background', 'red');
             }else{
                $('#txt_email').css('background', 'white');
             }
        });
    });
});

脚本.php

$link = mysqli_connect("myhost","myuser","mypassw","mybd") or die("Error " . mysqli_error($link)); 
$stmt = mysqli_prepare($link, 'SELECT count(*) FROM user WHERE email =?');
mysqli_stmt_bind_param($stmt, 's', $_POST['txt_email']);
mysqli_stmt_execute($stmt);
/* bind result variables */
mysqli_stmt_bind_result($stmt, $count);
/* fetch value */
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);

if ($count == 0) {
    echo 'true';
}else{
    echo 'false';
}

【讨论】:

  • mybd 的引用是什么?
  • 在你的情况下它是:mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
  • 我现在在电子邮件字段中输入的任何电子邮件都会被标记为无效的样式。无论如何,当我提交表单时,页面上会出现语法错误。
  • 我已经更改了脚本。我在 php 脚本中有一个错误。除此之外,这个小sn-p似乎有效。使用任何电子邮件查看darkbee.be/web/test.php,并使用test@example.comto 标记进行测试。你仍然需要在你的 PHP 后端再次测试电子邮件:)
  • 这一行 mysqli_stmt_bind_param($stmt, 's', $_POST['txt_email']); txt_email 应该是我的电子邮件 ID 还是姓名?
猜你喜欢
  • 2014-05-23
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多