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->rowCount() > 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()
确实有效但另一方面
由于 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 - 检查电子邮件是不是已经存在的主要内容,如果未能解决你的问题,请参考以下文章