我正在我的网站上进行电子邮件验证。当用户提交表单时,它将启动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.";
}
}
?>
答案 0 :(得分:0)
通常,您要使用async:true。
此外,您也不想让表单提交实际发生,因为这样会使整个页面不堪重负(如果没有完全导航到其他地方,则会重新加载整个页面)。因此,实际上,您可能会看到的空白可能是表单提交使您的页面消失。
如果您要发送ajax请求,则这些触发器仅需要带有单击处理程序的按钮,而不是实际的提交(除非在该提交输入中,您必须执行类似“ onclick ='doMyAjax(); return false; '”,以使提交操作实际上不会发生)。
如果您实际上正在上传文件(出于您似乎在此处显示此文件的目的),请不要让客户端通过其系统上的文件来驱动该功能,上传帖子需要有一个目标发布到,因此它不会打到您的页面。为此,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";
}
?>
请尝试并提供您的反馈。