Javascript jQuery验证远程-检查电子邮件是否已存在

Javascript jQuery验证远程-检查电子邮件是否已存在,javascript,php,jquery,mysql,validation,Javascript,Php,Jquery,Mysql,Validation,让jQuery验证来检查mysql表中是否已经存在电子邮件地址有点问题 每次我提交表单时,它都会告诉我电子邮件已经存在,尽管我知道它不存在 以下是我的代码: validation.js $(document).ready(function () { $('#signup').validate({ errorLabelContainer: "#cs-error-note", wrapper: "li", rules: {

让jQuery验证来检查mysql表中是否已经存在电子邮件地址有点问题

每次我提交表单时,它都会告诉我电子邮件已经存在,尽管我知道它不存在

以下是我的代码:

validation.js

$(document).ready(function () {

    $('#signup').validate({ 
        errorLabelContainer: "#cs-error-note",
        wrapper: "li",
        rules: {
            email: {
                required: true,
                email: true,
                remote: {
                    url: "check-username.php",
                    type: "post"
                }
            }
        },
        messages: {
            email: {
                required: "Please enter your email address.",
                email: "Please enter a valid email address.",
                remote: "Email already in use!"
            }
        },
        submitHandler: function(form) {
            form.submit();
        }
    });

});
检查username.php

<?php
    require('../../private_html/db_connection/connection.php');

    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $query = $conn->prepare("SELECT * FROM 'user_accounts' WHERE email = '" . $_POST['email'] . "'");
    $query->execute();

    if( $query->rowCount() > 0 ){
        echo 'true';
    }
    else{
        echo 'false';
    }
?>

您必须更改查询中的行计数if/else条件

剧本

<script>
$(document).ready(function () {
    $('#signup').validate({ 
    errorLabelContainer: "#cs-error-note",
    wrapper: "li",
    rules: {
        email: {
            required: true,
            email: true,
                remote: {
                    url: "check-username.php",
                    type: "post"
                 }
        }
    },
    messages: {
        email: {
            required: "Please enter your email address.",
            email: "Please enter a valid email address.",
            remote: "Email already in use!"
        }
    },
    submitHandler: function(form) {
                        form.submit();
                     }
    });
});
</script>
编辑:因为@Jay Blanchard非常一致,并且非常确定上面的代码不会工作

  • rowCount()不适用于SELECT语句


  • 不,这不起作用,因为rowCount()不适用于SELECT语句。你一点也不知道行数

  • 尝试回显$query->rowCount(),您将看到问题

这让我想知道上面的代码是怎么写的,当它不应该的时候,我做了一些挖掘,发现了这个

如果关联PDO语句执行的最后一条SQL语句是SELECT语句,某些数据库可能会返回该语句返回的行数。但是,并非所有数据库都能保证这种行为,便携式应用程序也不应依赖这种行为

还有这个

对于大多数数据库,PDOStatement::rowCount()不返回受SELECT语句影响的行数。相反,请使用PDO::query()发出一个SELECT COUNT(*)语句,该语句的谓词与预期的SELECT语句相同,然后使用PDO语句::FETCHTCOLUMN()检索将返回的行数。然后,应用程序可以执行正确的操作

在上述两种语句中,某些数据库和大多数数据库的
rowCount()
确实有效,但另一方面

  • 不应依赖于便携式应用程序
  • 使用PDOStatement::fetchColumn()检索将显示的行数 被退回。然后,应用程序可以执行正确的操作
因为OP只需要行的计数,而不是所有行的所有数据,所以也可以这样做。归功于@Jay Blanchard

使用此代码示例

在PHP中做了一些更改,使用
isset
函数

<?php
    require('../../private_html/db_connection/connection.php');
    $conn = new PDO("mysql:host=$servername; dbname=$dbname", $username, $password);    
    if(isset($_POST['email'])) {
        $email = $_POST['email'];
        $query = $conn->prepare("SELECT email FROM user_accounts WHERE email = '$email'");
        $query->execute();
        $rows = $query->fetchAll();
        $total_rows = count($rows);
            if( $total_rows > 0 ){
                echo 'false';
            } else {
                echo 'true';
            }
    }
?>
在这种情况下不起作用。从文档中:

PDOStatement::rowCount()返回受相应PDOStatement对象执行的最后一个DELETE、INSERT或UPDATE语句影响的行数

请注意,它不会为SELECT语句返回任何内容。要获取代码中的行数,请执行以下操作:

if(isset($_POST['email'])) {
    $email = $_POST['email'];
    $query = $conn->prepare("SELECT email FROM user_accounts WHERE email = ?");
    $query->execute(array($email));
    $rows = $query->fetchAll();
    $num_rows = count($rows);
    if( $num_rows > 0 ){
        echo 'true - email exists';
    } else {
        echo 'false - email does not exist';
    }
}

为了避免我使用的可能性,在语句中发送一个数组(一个数组),其中包含要在查询中使用的值。

可能您应该返回布尔值true或false,因为
'false'
是一个可以计算为布尔值true的字符串。我认为返回值true意味着“允许插入”-所以你可以反过来试试:
if($query->rowCount()>0){echo'false';}else{echo'true';}
rowCount()对SELECT语句不起作用。@ThomasBaumgartner-谢谢,但这似乎有相反的效果,它告诉我所有的电子邮件地址都是有效的,即使我知道它们在数据库中。@JayBlanchard-谢谢Jay,我不知道这一点。您能够发布在这种情况下使用的代码吗?不,这将不起作用,因为rowCount()不适用于SELECT语句。你一点也不知道行数@CyrilWalrusTry回显$query->rowCount(),您将看到这个问题@CyrilWalrus@JayBlanchard,希望现在的答案会令人满意。感谢您更新您的答案@Shehary,现在好多了。周末我无法从手机上回答问题。大多数情况下,当高级用户和知名用户试图解决问题时,我不会插手,只是坐下来学习,但当我看到没有答案时,我想尝试一下,我很高兴我做到了,学到了一些我不知道的东西,真的感谢你@杰布兰查德
<?php
    require('../../private_html/db_connection/connection.php');
    $conn = new PDO("mysql:host=$servername; dbname=$dbname", $username, $password);    
    if(isset($_POST['email'])) {
        $email = $_POST['email'];
        $query = $conn->prepare("SELECT email FROM user_accounts WHERE email = '$email'");
        $query->execute();
        $rows = $query->fetchAll();
        $total_rows = count($rows);
            if( $total_rows > 0 ){
                echo 'false';
            } else {
                echo 'true';
            }
    }
?>
if(isset($_POST['email'])) {
    $email = $_POST['email'];
    $query = $conn->prepare("SELECT email FROM user_accounts WHERE email = ?");
    $query->execute(array($email));
    $rows = $query->fetchAll();
    $num_rows = count($rows);
    if( $num_rows > 0 ){
        echo 'true - email exists';
    } else {
        echo 'false - email does not exist';
    }
}