jQuery Validate Remote - 检查电子邮件是不是已经存在

Posted

技术标签:

【中文标题】jQuery Validate Remote - 检查电子邮件是不是已经存在【英文标题】:jQuery Validate Remote - Check if email already existsjQuery Validate Remote - 检查电子邮件是否已经存在 【发布时间】:2015-12-09 04:52:38 【问题描述】:

我在获取 jQuery Validation 以检查 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();
        
    );

);

检查用户名.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';
    
?>

非常感谢您的帮助!

【问题讨论】:

也许您应该返回布尔值 true 或 false,因为 'false' 是一个可以被评估为布尔值 true 的搅拌器。 我认为返回值 true 意味着“允许插入” - 所以你可以反过来尝试:if( $query-&gt;rowCount() &gt; 0 ) echo 'false'; else echo 'true'; rowCount() 不适用于 SELECT 语句。***.com/a/31569733/1011527 @ThomasBaumgartner - 谢谢,但这似乎有相反的影响,它告诉我所有电子邮件地址都是有效的,即使我知道它们在数据库中。 @JayBlanchard - 谢谢杰,我不知道这一点。您能否发布在这种情况下使用的代码? 【参考方案1】:

您必须更改查询中的 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>

HTML

<form class="form-inline" role="form" id="signup">
    <div class="form-group">
    <label for="email">Email address:</label>
        <input type="email" class="form-control" name="email" id="email">
    </div>
</form>

PHP

警告不要使用这个 PHP 代码,因为 rowCount() 可能不起作用,所以跳过它并跳转到答案底部的代码。

<?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();
        if( $query->rowCount() > 0 )
            echo 'false';
         else 
            echo 'true';
        
    
?>

编辑:正如@Jay Blanchard 非常一致并且确定上述代码将无法正常工作

rowCount() 不适用于 SELECT 语句。 ***.com/a/31569733/1011527

不,这不起作用,因为 rowCount() 不适用于 SELECT 语句。你根本没有得到行数。

尝试回显 $query->rowCount() 你会看到问题

让我想知道上面的代码is working on my live server什么时候不应该所以我做了一些挖掘并找到了这个;

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

还有这个

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

Source of Above statements php.net manuals

在上述两个陈述中,一些数据库对于大多数数据库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';
            
    
?>

See in Action

【讨论】:

不,这不起作用,因为 rowCount() 不适用于 SELECT 语句。你根本没有得到行数。 @CyrilWalrus 尝试回显 $query->rowCount() 你会看到问题@CyrilWalrus @JayBlanchard,希望现在的答案是令人满意的。 感谢您更新您的答案@Shehary,现在好多了。周末我无法通过移动设备接听电话。 大多数情况下,当资深和知名用户试图解决问题时,我不会介入,只是坐下来学习,但当我看到没有答案时,我想试一试,我很高兴我做到了并学习一些我不知道的东西,非常感谢你。 @JayBlanchard【参考方案2】:

rowCount() 在这种情况下不起作用。来自文档:

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';
    

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

【讨论】:

以上是关于jQuery Validate Remote - 检查电子邮件是不是已经存在的主要内容,如果未能解决你的问题,请参考以下文章

JQuery.validate remote怎么没用啊?

jquery.validate.js的remote用法

怎么用jquery.validate.js 进行 remote 后台验证

Jquery validate remote方式是否有问题

validate中remote的用法

jquery.validate 远程验证remote使用详解