JQUERY AJAX GET и POST доступ к различным файлам? - PullRequest
0 голосов
/ 03 января 2019

Я делаю проверку электронной почты на моем сайте.Когда пользователь отправляет форму, он запускает ajax post request, который отправляет электронное письмо в 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.log(callback.length);
          console.log(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.";   
}

}
?>

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Во-первых, я бы посоветовал очистить ваш 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.log(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.log(json);
      if (json.inUse){
        window.alert("Email is already in use");
      } else {
        window.alert("Email valid");
      }
    }
  });
}

Надеюсь, это поможет.

0 голосов
/ 04 января 2019

вам не хватает обработки GET Request Data.Если некоторые пытаются использовать 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";
 }
?>

Пожалуйста, попробуйте и оставьте свой отзыв.

0 голосов
/ 03 января 2019

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

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

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

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

отправка в iframe

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...