JQUERY AJAX GET和POST访问不同的文件?

时间:2019-01-03 18:44:25

标签: php jquery ajax

我正在我的网站上进行电子邮件验证。当用户提交表单时,它将启动ajax发布请求,该请求将电子邮件发布到PHP,并将其与日期库进行比较。

与表单验证过程相比,我还有ajax GET请求,无论是否已使用电子邮件,该请求都应从同一PHP文件返回。 但。当我继续使用PHP时,一切正常,但是GET请求始终为空。 POST请求的URL为EmailDuplication.php,但GET的URL为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 :(得分:0)

通常,您要使用async:true。

此外,您也不想让表单提交实际发生,因为这样会使整个页面不堪重负(如果没有完全导航到其他地方,则会重新加载整个页面)。因此,实际上,您可能会看到的空白可能是表单提交使您的页面消失。

如果您要发送ajax请求,则这些触发器仅需要带有单击处理程序的按钮,而不是实际的提交(除非在该提交输入中,您必须执行类似“ onclick ='doMyAjax(); return false; '”,以使提交操作实际上不会发生)。

如果您实际上正在上传文件(出于您似乎在此处显示此文件的目的),请不要让客户端通过其系统上的文件来驱动该功能,上传帖子需要有一个目标发布到,因此它不会打到您的页面。为此,iframe的经典嵌入仍然是要走的路。啊。

posting to an iframe

我不知道为什么需要发送两个请求来完成这项工作。它可能应该只是一个POST(假设最终结果是如果您要发送的是有效电子邮件,则要发送一封电子邮件),然后服务器会检查该电子邮件,如果有效则进行发送。

也不要使用GET与POST来区分服务器应该做什么(例如,验证电子邮件与发送电子邮件)-请求本身或网址,例如,要传递的表单数据中包括“ action = verifyEmail” ,告诉服务器该怎么做,而不是仅仅因为它是POST就假设它。

希望其中一些有用。

答案 1 :(得分:0)

首先,我建议清理您的PHP,并确保它不容易受到SQL注入的攻击。<​​/ p>

<?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");
      }
    }
  });
}

希望这会有所帮助。

答案 2 :(得分:0)

您缺少处理GET请求数据的方法。如果有人尝试使用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";
 }
?>

请尝试并提供您的反馈。