操作方法:Post-Redirect-Get:AJAX 无表单操作
How-To: Post-Redirect-Get: AJAX with no form action
我想停止在用户个人资料页面刷新时重新提交表单,他们可以在其中更新一些基本个人资料信息并使用 ajax 请求进行查询。请求工作正常,一切都很好,但如果他们刷新,他们会收到经典的表单重新提交警告,我想在这种情况下避免这种情况。我知道这样做你可以使用 post-redirect-get 但我遇到了麻烦,因为我的表单没有 "action",当点击提交按钮时,它只是重新加载个人资料页面(当前页面)使用数据库中更新的用户信息。
我尝试使用:
if(isset($_POST)) {
unset($_POST);
header('Location: profile.php');
}
之前在当前页面的最顶部,但它导致了重定向循环。 在我的情况下有简单的方法吗? 下面是表单、ajax 请求和从 ajax 请求执行的脚本。
形式:
<form id="info-form" method="post">
<div class="form-group">
<label for="location">From:</label>
<input type="text" class="form-control" name="location" id="fromVal" value="<?php if(isset($location)) echo $location; ?>">
</div>
<div class="form-group">
<label for="gender">Gender:</label>
<input type="text" class="form-control" name="gender" id="genderVal" value="<?php if(isset($gender)) echo ucwords($gender); ?>">
</div>
<div class="form-group">
<label for="email">Email:</label>
<input type="text" class="form-control" name="email" id="emailVal" value="<?php if(isset($email)) echo $email; ?>" >
</div
<div class="buttonHolder">
<button id="update" name="submit" type="submit" >Update</button>
<button type="button" class="action" id="update-cancel" data-dialog-close>Cancel</button>
</div>
</form>
AJAX:
$('#update').click(function(){
var emailVal = $("#emailVal").val();
var genderVal = $("#genderVal").val();
var locVal = $("#fromVal").val();
$.ajax({
url: 'updateProfile.php',
type: 'POST', // GET or POST
data: { email: emailVal, location : locVal, gender : genderVal }, // will be in $_POST on PHP side
success: function(data) { // data is the response from your php script
// This function is called if AJAX query was successful
},
error: function() {
// This callback is called if AJAX query has failed
}
});
});
updateProfile.php
<?php
require_once 'config.php';
try {
$mysqli= new mysqli($host, $username, $password, $dbname);
if ($mysqli->connect_error) {
die('Connect Error (' . $mysqli->connect_errno . ') '
. $mysqli->connect_error);
}
} catch (mysqli_sql_exception $e) {
throw $e;
}
$stmt = $mysqli->prepare( "UPDATE users SET email=?,location=?,gender=? WHERE fbuid = ?");
session_start();
$stmt->bind_param("sssi", $email, $location, $gender, $_SESSION['fbuid']);
$email = $_POST['email'];
$location = $_POST['location'];
$gender = $_POST['gender'];
$stmt->execute();
$stmt->free_result();
$stmt->close();
$mysqli->close();
?>
$_POST
将始终在页面加载时设置(即使它不是 POST 请求)。
取消设置不会有帮助,因为当您重定向时,您会加载一个新页面并重新设置它。
Test to see if it is an actual POST request 或测试$_POST
.
中是否存在特定的表单数据
我想停止在用户个人资料页面刷新时重新提交表单,他们可以在其中更新一些基本个人资料信息并使用 ajax 请求进行查询。请求工作正常,一切都很好,但如果他们刷新,他们会收到经典的表单重新提交警告,我想在这种情况下避免这种情况。我知道这样做你可以使用 post-redirect-get 但我遇到了麻烦,因为我的表单没有 "action",当点击提交按钮时,它只是重新加载个人资料页面(当前页面)使用数据库中更新的用户信息。
我尝试使用:
if(isset($_POST)) {
unset($_POST);
header('Location: profile.php');
}
之前在当前页面的最顶部,但它导致了重定向循环。 在我的情况下有简单的方法吗? 下面是表单、ajax 请求和从 ajax 请求执行的脚本。
形式:
<form id="info-form" method="post">
<div class="form-group">
<label for="location">From:</label>
<input type="text" class="form-control" name="location" id="fromVal" value="<?php if(isset($location)) echo $location; ?>">
</div>
<div class="form-group">
<label for="gender">Gender:</label>
<input type="text" class="form-control" name="gender" id="genderVal" value="<?php if(isset($gender)) echo ucwords($gender); ?>">
</div>
<div class="form-group">
<label for="email">Email:</label>
<input type="text" class="form-control" name="email" id="emailVal" value="<?php if(isset($email)) echo $email; ?>" >
</div
<div class="buttonHolder">
<button id="update" name="submit" type="submit" >Update</button>
<button type="button" class="action" id="update-cancel" data-dialog-close>Cancel</button>
</div>
</form>
AJAX:
$('#update').click(function(){
var emailVal = $("#emailVal").val();
var genderVal = $("#genderVal").val();
var locVal = $("#fromVal").val();
$.ajax({
url: 'updateProfile.php',
type: 'POST', // GET or POST
data: { email: emailVal, location : locVal, gender : genderVal }, // will be in $_POST on PHP side
success: function(data) { // data is the response from your php script
// This function is called if AJAX query was successful
},
error: function() {
// This callback is called if AJAX query has failed
}
});
});
updateProfile.php
<?php
require_once 'config.php';
try {
$mysqli= new mysqli($host, $username, $password, $dbname);
if ($mysqli->connect_error) {
die('Connect Error (' . $mysqli->connect_errno . ') '
. $mysqli->connect_error);
}
} catch (mysqli_sql_exception $e) {
throw $e;
}
$stmt = $mysqli->prepare( "UPDATE users SET email=?,location=?,gender=? WHERE fbuid = ?");
session_start();
$stmt->bind_param("sssi", $email, $location, $gender, $_SESSION['fbuid']);
$email = $_POST['email'];
$location = $_POST['location'];
$gender = $_POST['gender'];
$stmt->execute();
$stmt->free_result();
$stmt->close();
$mysqli->close();
?>
$_POST
将始终在页面加载时设置(即使它不是 POST 请求)。
取消设置不会有帮助,因为当您重定向时,您会加载一个新页面并重新设置它。
Test to see if it is an actual POST request 或测试$_POST
.