問題
我有一個問題,盡管關于PHP的背景關系$_POST和請求不同,但我在不同的背景關系中看到了類似的問題。$_GET一個典型的例子是PHP 將 POST 和 GET 請求混合到一個頁面
在我的實體中,GET 是從 URL 中的查詢字串中獲取的,并且在從頁面中洗掉影像組件(包含影像的容器)時,該功能開箱即用。
我遇到的問題是我正在使用 JavaScript fetch()API 進行此洗掉,以便頁面不會進行硬重繪 。當這個程序發生在 JavaScript 中時fetch(),影像組件會從頁面中移除,但是當您重繪 頁面時,影像組件會重新出現。
我在不同的頁面上使用幾乎相同的代碼,當發生此問題時,將 GET 請求移到 POST 請求下方解決了該問題。唉,這一次沒有發生(并且在另一個頁面上只有一個潛在的 POST 請求表單)。
所有使用的表單$_POST都在表單本身出現的同一頁面上處理(即不action使用屬性)。任何時候只發生一個 POST 請求。
問題
因此,我的問題是,如何在不使用可怕的$_REQUEST. 我注意到建議使用 GET 和 POST 的一般問題的答案之一,if($_SERVER['REQUEST_METHOD'] == 'POST') { ... }但這不是一個選項(我不認為),因為$_POST頁面上有三種潛在的表單,它們都有不同的功能和name屬性。
下面是 GET 和 POST 代碼塊,按它們出現的順序排列。
注意:我只包含用于“從板上洗掉影像”代碼塊的 PHP PDO,因為這是 JavaScript fetch() 的唯一方面,而且我知道這在沒有 JavaScript 的情況下可以正常作業。還有很多可能我可以分享的代碼,我很樂意這樣做,但我想我會先發布一個精簡版的代碼,以防有一個明顯的答案我完全錯過了。任何時候只執行一個 $_POST 請求。
每個 POST 塊中都有header()函式,盡管我不認為這是問題的根源?
此外,這對我來說都是全新的。
JavaScript
// the form iteself
const fetchForms = document.querySelectorAll('.js-fetch-form'),
// <figure> element that is deleted
removeableImageComponent = document.querySelectorAll('.removeable-image-component');
// URL details
let myURL = new URL(window.location.href),
pagePath = myURL.pathname
fetchForms.forEach((item) => {
item.addEventListener('submit', function (e) {
if (e.submitter && e.submitter.classList.contains('js-delete-button')) {
e.preventDefault();
var formData = new FormData(this);
formData.set(e.submitter.name, e.submitter.value);
fetch(
pagePath, {
method: 'post',
body: formData
})
.then(function(response) {
if (response.status === 200) {
if (e.submitter && e.submitter.classList.contains('js-delete-button')) {
e.submitter.closest('.removeable-image-component').remove();
}
}
return response.text();
}).catch(function(error) {
console.error(error);
})
}
})
})
HTML
<figure class="removable-image-component">
<form class="js-fetch-form" method="post">
<input type="hidden" name="user-id" value="03">
<img src="path/to/image.jpg">
<button class="js-delete-button" name="image-delete" value="52">Remove from board</button>
</form>
</figure>
PHP
// value from URL
if (isset($_GET['board-id']) ) {
$boardId = $_GET['board-id'];
} else {
header("Location: login.php");
exit;
}
// UPDATE BOARD NAME
if(isset($_POST['submit-new-board-name'])) {
// PDO updates to database
header("Location: {$wwwRoot}/board.php?board-id={$boardId}"); exit;
}
}
// ================
// DELETE THE BOARD
// ================
if (isset($_POST['delete-board'])) {
// PDO updates to database
header("Location: {$wwwRoot}/boards?id={$sessionId}"); exit;
}
// =======================
// REMOVE IMAGE FROM BOARD
// =======================
if(isset($_POST['image-delete'])) {
$imageId = $_POST['image-id'];
$stmt = $connection->prepare("DELETE FROM boards_images WHERE board_id = :board_id AND image_id = :image_id");
$stmt->execute([
':board_id'=>$dbBoardId,
':image_id'=>$imageId
]);
header("Location: {$wwwRoot}/board?board-id={$dbBoardId}"); exit;
}
uj5u.com熱心網友回復:
改變
fetch(
pagePath, {
method: 'post',
body: formData
})
至
fetch(
myURL, {
method: 'post',
body: formData
})
pagePath是沒有方案或查詢引數的 URL,所以?board-id=###缺少。為了模擬在您省略actionURL 時正常表單提交的作業方式,您應該提交到整個 URL。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/511396.html
