JQUERY AJAX GET и POST для доступа к разным файлам?

Я проверяю электронную почту на своем веб-сайте. Когда пользователь отправляет форму, он запускает почтовый запрос 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.";   
}

}
?>

Почему вы не проверяете действительный адрес электронной почты как часть ответа POST?

Diodeus - James MacFarlane 03.01.2019 19:46

Добро пожаловать в Stack Overflow. Во-первых, ваш PHP-код уязвим для внедрения SLQ. Посоветовал бы обратиться к этому в первую очередь. Запрос GET будет содержать дополнительные данные, но это не повлияет на его использование, если он правильно вызывает EmailDuplication.php. Дополнительные данные просто гарантируют, что они не будут считываться из кэшированной версии. Поскольку вы вызываете один и тот же сценарий, но с разными командами, он должен работать должным образом.

Twisty 03.01.2019 20:04

^^ "SQL" не SLQ, извините. См.: php.net/manual/en/security.database.sql-injection.php

Twisty 03.01.2019 20:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
64
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Обычно вы хотите использовать async: true.

Кроме того, вы не хотите, чтобы форма отправлялась на самом деле, так как это сдувает всю вашу страницу (перезагружает все, если не полностью перемещается в другое место). Так что на самом деле пустой get, который вы могли видеть, может быть отправкой формы, сдувающей вашу страницу.

Если вы отправляете запросы ajax, триггером для них просто должна быть кнопка с обработчиком кликов, а не фактическая отправка (если в этом вводе отправки вы не делаете что-то вроде «onclick = 'doMyAjax (); return false;'», поэтому что действие отправки на самом деле не происходит).

Если вы на самом деле загружаете файл, который, похоже, демонстрирует здесь доброе дело, пожалуйста, не позволяйте клиенту управлять этой функцией через файлы в своей системе, для сообщения загрузки нужна цель для отправки, поэтому он не попал на вашу страницу. Для этого по-прежнему можно использовать классическое встраивание iframe. Фу.

публикация в iframe

Я понятия не имею, почему нужно отправить два запроса для выполнения работы. Вероятно, это должен быть только один POST (при условии, что конечный результат здесь заключается в том, что вы хотите отправить электронное письмо, если это действительное электронное письмо), и сервер проверяет электронную почту, а затем выполняет отправку, если она действительна.

И не используйте GET и POST, чтобы различать, что сервер должен делать (например, проверять электронное письмо или отправлять его) - сам запрос или URL-адрес, например, включают "action = verifyEmail" в передаваемые данные вашей формы, чтобы сообщить сервер, что делать, а не предполагать только потому, что это POST.

Надеюсь, что-то из этого будет полезно.

Большое спасибо за комментарий. Предупреждения по-прежнему остаются пустыми, если я устанавливаю return false, поэтому меня не перенаправляют. Я использую запрос POST для отправки электронного письма пользователя на PHP. PHP проверяет, есть ли электронное письмо в базе данных. Затем GET-запрос получает ответ и, если его нет, переходит к процессу регистрации. Как я уже сказал, это работает, если я получаю предупреждения на странице PHP, но это не то, что меня интересует. Мне нужны предупреждения, чтобы показать, что электронная почта уже используется или электронная почта действительна, если все в порядке. Но я получаю действительный адрес электронной почты все время :( попробовал то, что вы мне посоветовали, но без изменений. Есть идеи?

klacek139 03.01.2019 20:22

Что ж, согласно вашему PHP-коду, с одной стороны, если это не POST, ничего не делается. ("if (isset ($ _ POST)) {...."), и кажется, что в конце вашего PHP-кода есть лишнее}.

John Fantastico 03.01.2019 20:27

GET не может получить ответ POST. Ответ возвращается в почтовом ответе или теряется (представьте себе, что сервер выполняет один запрос, а затем вешает трубку).

John Fantastico 03.01.2019 20:33
Ответ принят как подходящий

Во-первых, я бы посоветовал очистить ваш 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";
 }
?>

Пожалуйста, попробуйте и поделитесь своим мнением.

Другие вопросы по теме