【问题标题】: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 语句。stackoverflow.com/a/31569733/1011527
  • @ThomasBaumgartner - 谢谢,但这似乎有相反的影响,它告诉我所有电子邮件地址都是有效的,即使我知道它们在数据库中。
  • @JayBlanchard - 谢谢杰,我不知道这一点。您能否发布在这种情况下使用的代码?

标签: javascript php jquery mysql validation


【解决方案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 语句。 stackoverflow.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() 语句中要在查询中使用的值。

【讨论】:

    猜你喜欢
    • 2017-10-09
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多