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();
}

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.