jQueryvalidation远程 – 检查电子邮件是否已存在

我有一个问题,让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(); } }); }); 

入住username.php

 prepare("SELECT * FROM 'user_accounts' WHERE email = '" . $_POST['email'] . "'"); $query->execute(); if( $query->rowCount() > 0 ){ echo 'true'; } else{ echo 'false'; } ?> 

非常感谢您的帮助!

如果查询中有/ else条件,则必须更改行计数

脚本

  

HTML

 

PHP

警告不要使用此PHP代码原因rowCount()可能无效,因此跳过它并跳转到答案底部的代码。

 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(),你会看到问题

并且让我想知道上面的代码是如何在我的实时服务器上工作的时候它不应该这样我做了一些挖掘并找到了这个;

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

还有这个

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

以上语句来源php.net手册

在上述两个语句中, 一些数据库大多数数据库 rowCount() 确实可以工作,但另一方面

  • 不应该依赖于便携式应用程序
  • 使用PDOStatement :: fetchColumn()来检索将返回的行数。 然后,您的应用程序可以执行正确的操作

由于OP只想要行数而不是所有行的所有数据,所以也可以这样做。 归功于@Jay Blanchard

使用此代码示例

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

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

见行动

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注入攻击的可能性,我使用一个预准备语句 ,在execute()语句中发送一个包含要在查询中使用的值的数组(一个)。