У меня есть проблема с получением проверки 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'; } ?>
Ваша помощь очень ценится!
Вы должны изменить счетчик строк, если условие / 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()
работает, но с другой стороны
Поскольку 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()
.