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



我正在我的网站上进行电子邮件验证。当用户提交表单时,它启动ajax发布请求,将电子邮件发布到PHP,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.";   
}
}
?>

首先,我建议清理您的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: %sn", 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");
}
}
});
}

希望这能有所帮助。

通常您希望使用async:true。

此外,您不希望表单提交实际发生,因为这会破坏整个页面(如果没有完全导航到其他地方,则会重新加载整个内容)。所以事实上,你可能看到的空白可能是提交的表格吹走了你的页面。

如果您正在发送ajax请求,那么这些请求的触发器只需要是一个带有点击处理程序的按钮,而不是实际的提交(除非在提交输入中您执行了类似"onclick='doMyAjax();return false;"的操作,这样提交操作就不会实际发生)。

如果你真的在上传一个文件,出于你在这里展示的目的,天哪,请不要让客户通过他们系统上的文件来驱动该功能,上传帖子需要一个目标来发布到,这样它就不会进入你的页面。为此,经典的iframe嵌入仍然是一条路要走。啊。

张贴到iframe

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

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

希望这些能有所帮助。

您缺少处理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";
}
?>

请尝试并给出您的反馈。

最新更新