Я проверяю электронную почту на своем веб-сайте. Когда пользователь отправляет форму, он запускает почтовый запрос ajax, который отправляет электронное письмо в PHP, который сравнивает его с базой данных.
Чем еще находится процесс проверки формы, у меня есть запрос ajax GET, который должен возвращаться из того же файла PHP, независимо от того, использовалось ли уже электронное письмо.
Но. Когда я перехожу к PHP, все работает нормально, но запрос GET всегда остается пустым. URL-адрес POST-запроса - EmailDuplication.php, а URL-адрес GET - EmailDuplication?_=somerandomnumbers. Может быть, в этом проблема?
Я в этом не разбираюсь, буду рад любой помощи.
Вот коды
JavaScript
function EmailSendForDupe()
{
$.ajax({ url: '/files/EmailDuplication.php',
type: 'post',
async: false,
cache: false,
timeout: 30000,
data: {email: email.toString},
success: function (){
window.alert("email sent");
}
});
}
function EmailDuplication()
{
$.ajax({ url: '/files/EmailDuplication.php',
type: 'get',
async: false,
cache: false,
timeout: 30000,
success: function (callback){
console.info(callback.length);
console.info(callback);
if (callback.length !== 0){
window.alert("Email is already in use");
return false;
}
else {
window.alert("Email valid");
return true;
}
}
});
}
PHP
<?php
$servername = "*";
$username = "*";
$password = "*";
$dbname = "*";
try{
$conn = mysqli_connect($servername, $username,$password,$dbname);
}catch(MySQLi_Sql_Exception $ex){
echo("error in connection");
}
if (isset($_POST)){
$email = $_POST['email'];
echo "AHOJ";
$Emailquery = "SELECT * FROM Members WHERE email='$email' ";
$Emailresult = mysqli_query($conn,$Emailquery);
$Emailcount = mysqli_num_rows($Emailresult);
if ($Emailcount == 0) {
}
else {
echo "User Email is already in use.";
}
}
?>
Добро пожаловать в Stack Overflow. Во-первых, ваш PHP-код уязвим для внедрения SLQ. Посоветовал бы обратиться к этому в первую очередь. Запрос GET будет содержать дополнительные данные, но это не повлияет на его использование, если он правильно вызывает EmailDuplication.php. Дополнительные данные просто гарантируют, что они не будут считываться из кэшированной версии. Поскольку вы вызываете один и тот же сценарий, но с разными командами, он должен работать должным образом.
^^ "SQL" не SLQ, извините. См.: php.net/manual/en/security.database.sql-injection.php






Обычно вы хотите использовать async: true.
Кроме того, вы не хотите, чтобы форма отправлялась на самом деле, так как это сдувает всю вашу страницу (перезагружает все, если не полностью перемещается в другое место). Так что на самом деле пустой get, который вы могли видеть, может быть отправкой формы, сдувающей вашу страницу.
Если вы отправляете запросы ajax, триггером для них просто должна быть кнопка с обработчиком кликов, а не фактическая отправка (если в этом вводе отправки вы не делаете что-то вроде «onclick = 'doMyAjax (); return false;'», поэтому что действие отправки на самом деле не происходит).
Если вы на самом деле загружаете файл, который, похоже, демонстрирует здесь доброе дело, пожалуйста, не позволяйте клиенту управлять этой функцией через файлы в своей системе, для сообщения загрузки нужна цель для отправки, поэтому он не попал на вашу страницу. Для этого по-прежнему можно использовать классическое встраивание iframe. Фу.
Я понятия не имею, почему нужно отправить два запроса для выполнения работы. Вероятно, это должен быть только один POST (при условии, что конечный результат здесь заключается в том, что вы хотите отправить электронное письмо, если это действительное электронное письмо), и сервер проверяет электронную почту, а затем выполняет отправку, если она действительна.
И не используйте GET и POST, чтобы различать, что сервер должен делать (например, проверять электронное письмо или отправлять его) - сам запрос или URL-адрес, например, включают "action = verifyEmail" в передаваемые данные вашей формы, чтобы сообщить сервер, что делать, а не предполагать только потому, что это POST.
Надеюсь, что-то из этого будет полезно.
Большое спасибо за комментарий. Предупреждения по-прежнему остаются пустыми, если я устанавливаю return false, поэтому меня не перенаправляют. Я использую запрос POST для отправки электронного письма пользователя на PHP. PHP проверяет, есть ли электронное письмо в базе данных. Затем GET-запрос получает ответ и, если его нет, переходит к процессу регистрации. Как я уже сказал, это работает, если я получаю предупреждения на странице PHP, но это не то, что меня интересует. Мне нужны предупреждения, чтобы показать, что электронная почта уже используется или электронная почта действительна, если все в порядке. Но я получаю действительный адрес электронной почты все время :( попробовал то, что вы мне посоветовали, но без изменений. Есть идеи?
Что ж, согласно вашему PHP-коду, с одной стороны, если это не POST, ничего не делается. ("if (isset ($ _ POST)) {...."), и кажется, что в конце вашего PHP-кода есть лишнее}.
GET не может получить ответ POST. Ответ возвращается в почтовом ответе или теряется (представьте себе, что сервер выполняет один запрос, а затем вешает трубку).
Во-первых, я бы посоветовал очистить ваш PHP и убедиться, что он не уязвим для SQL-инъекций.
<?php
$servername = "*";
$username = "*";
$password = "*";
$dbname = "*";
$returnData = new array();
$conn = mysqli_connect($servername, $username,$password,$dbname);
if (mysqli_connect_errno()) {
$returnData['SQL Error'] = "Connect failed: %s\n", mysqli_connect_error();
header('Content-Type: application/json');
echo json_encode($returnData);
exit();
}
if (isset($_POST['email'])){
// POST
$email = mysqli_real_escape_string($conn, $_POST['email']);
$resultData["AHOJ"] = true;
$Emailquery = "SELECT * FROM Members WHERE email='$email' LIMIT 1;";
$Emailresult = mysqli_query($conn,$Emailquery);
$Emailcount = mysqli_num_rows($Emailresult);
if ($Emailcount == 0) {
$resultData['inUse'] = false;
$resultData['email'] = $_POST['email'];
} else {
$resultData['inUse'] = true;
}
} else {
// GET
$resultData["AHOJ"] = false;
$resultData['inUse'] = true;
}
mysqli_close($conn);
header('Content-Type: application/json');
echo json_encode($returnData);
die();
?>
Это вернет данные JSON обратно в ваш сценарий jQuery и может быть более полезным, чем простой текст.
Я также использую mysqli_real_escape_string(), чтобы избежать любых потенциальных попыток инъекции. Я бы посоветовал перейти на Готовые выписки: http://php.net/manual/en/mysqli-stmt.prepare.php
В свой JavaScript вы тоже захотите внести несколько изменений.
function EmailSendForDupe(email){
$.ajax({
url: '/files/EmailDuplication.php',
type: 'post',
cache: false,
timeout: 30000,
data: {
email: email.toString()
},
dataType: "json",
success: function (json){
console.info(json);
if (json.inUse == false){
alert("Email Sent to " + json.email);
} else {
alert("There may have been an error: " + json.error);
}
}
});
}
function EmailDuplication(email){
$.ajax({ url: '/files/EmailDuplication.php',
type: 'get',
data: {
email: email.toString()
},
dataType: "json",
cache: false,
timeout: 30000,
success: function (json){
console.info(json);
if (json.inUse){
window.alert("Email is already in use");
} else {
window.alert("Email valid");
}
}
});
}
Надеюсь это поможет.
вам не хватает обработки данных запроса GET. если некоторые пытаются использовать URL-адрес получения, ваш код не имеет никаких условий для его обработки. проверьте измененный код.
<?php
$servername = "*";
$username = "*";
$password = "*";
$dbname = "*";
try{
$conn = mysqli_connect($servername, $username,$password,$dbname);
}catch(MySQLi_Sql_Exception $ex){
echo("error in connection");
}
if (isset($_POST)){
$email = $_POST['email'];
echo "AHOJ";
$Emailquery = "SELECT * FROM Members WHERE email='$email' ";
$Emailresult = mysqli_query($conn,$Emailquery);
$Emailcount = mysqli_num_rows($Emailresult);
if ($Emailcount == 0) {
}else {
echo "User Email is already in use.";
}
}else{
echo " Get Method Data";
}
?>
Пожалуйста, попробуйте и поделитесь своим мнением.
Почему вы не проверяете действительный адрес электронной почты как часть ответа POST?