[mysql]jQuery 验证远程-检查是否有电子邮件已经存在

发布时间: 2017/4/9 23:19:54
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有一点问题得到 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';
    }
?>

非常感谢你的帮助 !

解决方法 1:

你有要更改行计数,如果其他条件查询中

脚本

<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 布兰查德非常一致和死肯定那上面的代码将不工作

  • rowCount() 不适合的 SELECT 语句。stackoverflow.com/a/31569733/1011527

  • 不,这将不工作,因为 rowCount() 不适合的 SELECT 语句。你根本没有得到一个行计数。

  • 试着呼应 $query->rowCount(),你会看到这一问题

让我不知道多少以上代码我活的服务器上工作时不应该是这样所以我做了一些挖掘,发现了这个;

如果执行由相关联的 PDOStatement 的最后一个 SQL 语句是 SELECT 语句,由该语句返回的某些数据库可能会返回的行数。然而,这种行为不能保证所有的数据库,不应认定为便携式应用。

与此

对于多数数据库,PDOStatement::rowCount() 不返回由 SELECT 语句影响的行数。相反,使用 PDO::query() 发表选择 COUNT(*) 声明来的相同的谓词作为您预期的 SELECT 语句,然后使用 PDOStatement::fetchColumn() 来检索的将返回的行数。您的应用程序可以继续执行了正确的行动。

以上语句 php.net 手册的来源

在两个以上语句,有些数据库大多数数据库 rowCount() 正常工作,但其他手上

  • 不能为便携式应用程序依赖
  • PDOStatement::fetchColumn() 用于检索的将返回的行数。您的应用程序可以继续执行了正确的行动。

OP 只想要的行的计数,并不是所有的数据的所有行所以可以还这样。归功于 @Jay 布兰查德

使用此代码示例

在 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';
            }
    }
?>

在行动中看到

赞助商