Prevent resubmission when reload, how in wp?

[ad_1]

I have made a simple page for my housing cooperative. It’s a single wordpress page with divi theme and custom template. The page consist of two forms with two submit buttons to submit the info into database. If I reload the page or click on one of the other buttons the information will be resubmitted and dublicates will appear in the database.

I have read about PRG and tried to implement what I have found, but seems to get problem with wordpress errors.

” Cannot modify header information – headers already sent ” when I try to implement PRG in anyway..

Someone have a simple idea for this? Posting both complete template and functions.php.

The template:

<?php
/*
Template Name: Template 2
*/

wp_nonce_field(‘remove_entry’);
get_header();

global $wpdb;

// Remove entries whose end date and time have passed
$current_timestamp = current_time(‘timestamp’);
$entries_to_remove = $wpdb->get_results(“SELECT * FROM entries WHERE end_date < CURDATE() OR (end_date = CURDATE() AND end_time <= CURTIME())”);
foreach ($entries_to_remove as $entry) {
$wpdb->delete(“entries”, array(“id” => $entry->id));
$wpdb->insert(“removed_entries”, (array)$entry);
}

$removed_entries_to_remove = $wpdb->get_results(“SELECT * FROM removed_entries WHERE end_date < CURDATE() OR (end_date = CURDATE() AND end_time <= CURTIME())”);
foreach ($removed_entries_to_remove as $entry) {
$wpdb->delete(“removed_entries”, array(“id” => $entry->id));
}

$asked_entries_to_remove = $wpdb->get_results(“SELECT * FROM asked_entries WHERE end_date < CURDATE() OR (end_date = CURDATE() AND end_time <= CURTIME())”);
foreach ($asked_entries_to_remove as $entry) {
$wpdb->delete(“asked_entries”, array(“id” => $entry->id));
}

if (isset($_POST[‘form1_submit’])) {
// Store form data in variables
$start_date = $_POST[‘start_date’];
$start_time = $_POST[‘start_time’];
$end_date = $_POST[‘end_date’];
$end_time = $_POST[‘end_time’];
$random_number = $_POST[‘random_number’];
$garage = isset($_POST[‘garage’]) ? 1 : 0;

// Insert form data into database
$wpdb->insert(
‘entries’,
array(
‘start_date’ => $start_date,
‘start_time’ => $start_time,
‘end_date’ => $end_date,
‘end_time’ => $end_time,
‘random_number’ => $random_number,
‘garage’ => $garage
)
);
}

if (isset($_POST[‘form2_submit’])) {
// Store form data in variables
$ask_start_date = $_POST[‘ask_start_date’];
$ask_start_time = $_POST[‘ask_start_time’];
$ask_end_date = $_POST[‘ask_end_date’];
$ask_end_time = $_POST[‘ask_end_time’];
$ask_email = $_POST[‘ask_email’];
$ask_name = $_POST[‘ask_name’];

// Insert form data into database
$wpdb->insert(
‘asked_entries’,
array(
‘start_date’ => $ask_start_date,
‘start_time’ => $ask_start_time,
‘end_date’ => $ask_end_date,
‘end_time’ => $ask_end_time,
’email’ => $ask_email,
‘name’ => $ask_name
)
);
}

?>
<div class=”container”>
<div class=”row”>
<div class=”col-md-6″>
<h2>Dela din parkering</h2>
<form id=”form1″ method=”post”>

<label for=”start_date”>Tillgänglig från:</label>
<input type=”date” id=”start_date” name=”start_date” required value=”<?php echo date(‘Y-m-d’); ?>”>
<br><br>
<label for=”start_time”>klockan:</label>
<input type=”time” id=”start_time” name=”start_time” required value=”<?php echo date(‘H:i’); ?>”>
<br><br>
<label for=”end_date”>tills:</label>
<input type=”date” id=”end_date” name=”end_date” required value=”<?php echo date(‘Y-m-d’, strtotime(‘+1 day’)); ?>”>
<br><br>
<label for=”end_time”>klockan:</label>
<input type=”time” id=”end_time” name=”end_time”>
<br><br>
<label for=”random_number”>Parkeringsplats:</label>
<input type=”number” id=”random_number” name=”random_number” required>
<br><br>
<input type=”checkbox” id=”garage” name=”garage”>
<label for=”garage”>I Garaget</label>
<br><br>
<input type=”submit” name=”form1_submit” value=”Dela”>

</form>
</div>

<div class=”col-md-6″>
<h2>Sök parkering</h2>
<form id=”form2″ method=”post” action=”<?php echo get_permalink(); ?>”>

<label for=”ask_start_date”>Låna från:</label>
<input type=”date” id=”ask_start_date” name=”ask_start_date” required value=”<?php echo date(‘Y-m-d’); ?>”>
<br><br>
<label for=”ask_start_time”>klockan:</label>
<input type=”time” id=”ask_start_time” name=”ask_start_time” required value=”<?php echo date(‘H:i’); ?>”>
<br><br>
<label for=”ask_date”>tills:</label>
<input type=”date” id=”ask_end_date” name=”ask_end_date” required value=”<?php echo date(‘Y-m-d’, strtotime(‘+1 day’)); ?>”>
<br><br>
<label for=”ask_end_time”>klockan:</label>
<input type=”time” id=”ask_end_time” name=”ask_end_time” required>
<br><br>
<label for=”ask_email”>Email för notis:</label>
<input type=”email” id=”ask_email” name=”ask_email” required>
<br><br>
<label for=”ask_name”>Namn:</label>
<input type=”text” id=”ask_name” name=”ask_name” required>
<br><br>
<input type=”submit” name=”form2_submit” value=”Sök”>

</form>
</div>

<br><br>
<div class=”col-md-12″>
<h2>Tillgängliga parkeringar</h2>
<table>
<tr>
<th>Tillgänglig från</th>
<th>klockan</th>
<th>Tills</th>
<th>klockan</th>
<th>Parkeringsplats #</th>
<th></th>
</tr>
<?php
$entries = $wpdb->get_results(“SELECT * FROM entries ORDER BY start_date, start_time”);
foreach ($entries as $entry) {
echo ‘<tr>’;
echo ‘<td>’ . $entry->start_date . ‘</td>’;
echo ‘<td>’ . date(“H:i”, strtotime($entry->start_time)) . ‘</td>’;
echo ‘<td>’ . $entry->end_date . ‘</td>’;
echo ‘<td>’ . date(“H:i”, strtotime($entry->end_time)) . ‘</td>’;
echo ‘<td>’ . $entry->random_number . ($entry->garage ? ‘ garage’ : ‘ utomhus’) .'</td>’;
echo ‘<td>’;
echo ‘<button onclick=”removeEntry(‘ . $entry->id . ‘)”>Låna</button>’;
echo ‘</td>’;
echo ‘</tr>’;
}
?>
</table>
<br><br>
<h2>Efterfrågade parkeringar</h2>
<table>
<tr>
<th>Önskas från</th>
<th>klockan</th>
<th>Tills</th>
<th>klockan</th>
<th>Söks av</th>
<th></th>
</tr>
<?php
$asked_entries = $wpdb->get_results(“SELECT * FROM asked_entries ORDER BY start_date, start_time”);
foreach ($asked_entries as $entry) {
echo ‘<tr>’;
echo ‘<td>’ . $entry->start_date . ‘</td>’;
echo ‘<td>’ . date(“H:i”, strtotime($entry->start_time)) . ‘</td>’;
echo ‘<td>’ . $entry->end_date . ‘</td>’;
echo ‘<td>’ . date(“H:i”, strtotime($entry->end_time)) . ‘</td>’;
echo ‘<td>’ . $entry->name . ‘</td>’;
echo ‘<td>’;
echo ‘<button onclick=”removeAskedEntry(‘ . $entry->id . ‘)”>Låna ut</button>’;
echo ‘</td>’;
echo ‘</tr>’;
}
?>
</table>
<br><br>
<h2>Utlånade parkeringar</h2>
<table>
<tr>
<th>Tillgänglig från</th>
<th>klockan</th>
<th>Tills</th>
<th>klockan</th>
<th>Parkeringsplats #</th>
<th>Utlånad till</th>
</tr>
<?php
$removed_entries = $wpdb->get_results(“SELECT * FROM removed_entries ORDER BY start_date, start_time”);
foreach ($removed_entries as $entry) {
echo ‘<tr>’;
echo ‘<td>’ . $entry->start_date . ‘</td>’;
echo ‘<td>’ . date(“H:i”, strtotime($entry->start_time)) . ‘</td>’;
echo ‘<td>’ . $entry->end_date . ‘</td>’;
echo ‘<td>’ . date(“H:i”, strtotime($entry->end_time)) . ‘</td>’;
echo ‘<td>’ . $entry->random_number . ($entry->garage ? ‘ garage’ : ‘ utomhus’) .'</td>’;
echo ‘<td>’ . $entry->name . ‘</td>’;
echo ‘</tr>’;
}
?>
</table><br><br>
<script>
function removeEntry(id) {
var name = prompt(“Fyll i ditt namn för att låna parkeringen:”);
if (name !== null) {
var xhr = new XMLHttpRequest();
xhr.open(‘POST’, ‘<?php echo admin_url(‘admin-ajax.php’); ?>’);
xhr.setRequestHeader(‘Content-Type’, ‘application/x-www-form-urlencoded’);
xhr.onload = function() {
if (xhr.status === 200) {
location.reload();
} else {
console.log(‘Error:’, xhr.statusText);
}
};
xhr.onerror = function() {
console.log(‘Error:’, xhr.statusText);
};
xhr.send(‘action=remove_entry&id=’ + id + ‘&name=’ + name + ‘&_wpnonce=<?php echo wp_create_nonce(‘remove_entry’); ?>’);
}
}

function removeAskedEntry(id) {
var random_number = prompt(“Ange parkeringsnummer:”);
var garage = prompt(“Fyll i 1 för garage 0 för ute:”);
if (random_number !== null && garage !== null) {
var xhr = new XMLHttpRequest();
xhr.open(‘POST’, ‘<?php echo admin_url(‘admin-ajax.php’); ?>’);
xhr.setRequestHeader(‘Content-Type’, ‘application/x-www-form-urlencoded’);
xhr.onload = function() {
if (xhr.status === 200) {
location.reload();
} else {
console.log(‘Error:’, xhr.statusText);
}
};
xhr.onerror = function() {
console.log(‘Error:’, xhr.statusText);
};
xhr.send(‘action=remove_asked_entry&id=’ + id + ‘&random_number=’ + random_number + ‘&garage=’ + garage + ‘&_wpnonce=<?php echo wp_create_nonce(‘remove_entry’); ?>’);
}
}

</script>
</div>

</div>
</div>

<?php
get_footer();

?>

Functions.php:

<?php

add_action( ‘wp_enqueue_scripts’, ‘enqueue_parent_styles’ );
function enqueue_parent_styles() {
wp_enqueue_style( ‘parent-style’, get_template_directory_uri().’/style.css’ );
}

add_action(‘wp_ajax_remove_entry’, ‘remove_entry_callback’);
add_action(‘wp_ajax_nopriv_remove_entry’, ‘remove_entry_callback’);

function remove_entry_callback() {
check_ajax_referer(‘remove_entry’);

if (isset($_POST[‘id’])) {
global $wpdb;
$id = intval($_POST[‘id’]);
$name = sanitize_text_field($_POST[‘name’]);
$entry = $wpdb->get_row(“SELECT * FROM entries WHERE id = $id”);

if ($entry) {
$wpdb->delete(“entries”, array(“id” => $id));
$wpdb->insert(“removed_entries”, array(
“start_date” => $entry->start_date,
“start_time” => $entry->start_time,
“end_date” => $entry->end_date,
“end_time” => $entry->end_time,
“random_number” => $entry->random_number,
“garage” => $entry->garage,
“name” => $name
));
wp_send_json_success();
}

}

wp_send_json_error();
}

add_action(‘wp_ajax_remove_asked_entry’, ‘remove_asked_entry_callback’);
add_action(‘wp_ajax_nopriv_remove_asked_entry’, ‘remove_asked_entry_callback’);

add_action(‘wp_ajax_remove_asked_entry’, ‘remove_asked_entry_callback’);
add_action(‘wp_ajax_nopriv_remove_asked_entry’, ‘remove_asked_entry_callback’);

function remove_asked_entry_callback() {
check_ajax_referer(‘remove_entry’);

if (isset($_POST[‘id’])) {
global $wpdb;
$id = intval($_POST[‘id’]);
$random_number = sanitize_text_field($_POST[‘random_number’]);
$garage = intval($_POST[‘garage’]);

$entry = $wpdb->get_row(“SELECT * FROM asked_entries WHERE id = $id”);

if ($entry) {
$name = $entry->name;
$wpdb->delete(“asked_entries”, array(“id” => $id));
$wpdb->insert(“removed_entries”, array(
“start_date” => $entry->start_date,
“start_time” => $entry->start_time,
“end_date” => $entry->end_date,
“end_time” => $entry->end_time,
“random_number” => $random_number,
“garage” => $garage,
“name” => $name
));

// Send an email to the address in the ’email’ field of the ‘asked_entries’ table
$to = $entry->email;
$subject = ‘Din parkering är nu tillgänglig!’;
$message = ‘Hej ‘ . $entry->name . ‘, parkeringen du efterfrågade är nu tillgänglig. Här är detaljerna: ‘ . PHP_EOL . PHP_EOL;
$message .= ‘Från: ‘ . $entry->start_date . ‘ klockan ‘ . date(“H:i”, strtotime($entry->start_time)) . PHP_EOL;
$message .= ‘Till: ‘ . $entry->end_date . ‘ klockan ‘ . date(“H:i”, strtotime($entry->end_time)) . PHP_EOL;
$message .= ‘Parkeringsplats: ‘ . $random_number . ($garage ? ‘ garage’ : ‘ utomhus’) . PHP_EOL;
$headers = array(‘Content-Type: text/html; charset=UTF-8’);
wp_mail($to, $subject, $message, $headers);

wp_send_json_success();
}
}

wp_send_json_error();
}

[ad_2]
1 Comment
  1. After your wpdb->insert statement that’s inside the $_POST, perform a redirect e.g.

    header(‘Location: ‘.$_SERVER[‘PHP_SELF’]);
    die;

    Or do the post via AJAX.

 

This site will teach you how to build a WordPress website for beginners. We will cover everything from installing WordPress to adding pages, posts, and images to your site. You will learn how to customize your site with themes and plugins, as well as how to market your site online.

Buy WordPress Transfer