jQuery Validate Remote – проверьте, существует ли электронная почта

У меня есть проблема с получением проверки 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'; } ?> 

Ваша помощь очень ценится!

Solutions Collecting From Web of "jQuery Validate Remote – проверьте, существует ли электронная почта"

Вы должны изменить счетчик строк, если условие / 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 (), и вы увидите проблему

и заставляет меня задаться вопросом, как этот код работает на моем живом сервере, когда он не должен, поэтому я сделал кое-что, и нашел это;

Если последний оператор SQL, выполняемый связанным с ним PDOStatement, был оператором SELECT, некоторые базы данных могут возвращать количество строк, возвращаемых этим оператором. Однако это поведение не гарантируется для всех баз данных и не должно полагаться на переносные приложения.

и это

Для большинства баз данных PDOStatement :: rowCount () не возвращает количество строк, на которые влияет инструкция SELECT. Вместо этого используйте PDO :: query () для выдачи оператора SELECT COUNT (*) с теми же предикатами, что и ваш запрошенный оператор SELECT, а затем используйте PDOStatement :: fetchColumn (), чтобы получить количество строк, которое будет возвращено. Затем ваше приложение может выполнить правильное действие.

Исходные данные инструкций php.net

В обоих вышеприведенных утверждениях некоторые базы данных и для большинства баз данных 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'; } } ?> 

См. В действии

rowCount() не будет работать в ситуации. Из документов:

PDOStatement :: rowCount () возвращает количество строк, затронутых последним оператором DELETE, INSERT или UPDATE, выполняемым соответствующим объектом PDOStatement.

Обратите внимание, что он ничего не возвращает для оператора 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, я использую подготовленный оператор , отправляя массив (один), содержащий значения, которые будут использоваться в запросе в инструкции execute() .