我有一个问题是获取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
<?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';
}
?>
非常感谢您的帮助!
答案 0 :(得分:7)
如果查询中的/ 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-&gt; rowCount(),您就会看到问题
让我想知道上面的代码is working on my live server是什么时候不应该这样做,所以我做了一些挖掘并找到了这个;
如果关联的PDOStatement执行的最后一条SQL语句是SELECT语句,某些数据库可能会返回该语句返回的行数。但是,并不保证所有数据库都有这种行为,不应依赖于便携式应用程序。
和这个
对于大多数数据库,PDOStatement :: rowCount()不返回受SELECT语句影响的行数。相反,使用PDO :: query()发出带有与预期SELECT语句相同的谓词的SELECT COUNT(*)语句,然后使用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';
}
}
?>
答案 1 :(得分:1)
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()
语句中发送一个包含要在查询中使用的值的数组(一个)。 / p>