Cum să opriți retrimiterea formularului la reîmprospătarea paginii

20 apr. 2013, 18:27:44
Vizualizări: 103K
Voturi: 9

Salut! Am un formular care adaugă atașamente la o postare, însă când formularul este trimis, evident nu afișează postarea cu noul atașament ci doar mesajul "fișierul tău a fost încărcat". Când utilizatorul reîmprospătează pagina (pentru a încerca să vadă noul atașament) formularul este trimis din nou!

Este posibil să (1) oprim retrimiterea formularului la reîmprospătare, (2) să reîmprospătăm automat pagina pentru a afișa postarea cu noul atașament?? (varianta 2 ar fi mult mai bună)

<?php $post_id = $post->ID;
if ( isset( $_POST['html-upload'] ) && !empty( $_FILES ) ) {
require_once(ABSPATH . 'wp-admin/includes/admin.php');
$id = media_handle_upload('async-upload', $post_id); //id-ul postării pentru pagina Fișiere Client
unset($_FILES);
if ( is_wp_error($id) ) {
    $errors['upload_error'] = $id;
    $id = false;
}

if ($errors) {
    echo "<p>A apărut o eroare la încărcarea fișierului.</p>";
} else {
    echo "<p>Fișierul tău a fost încărcat.</p>";
}
}

?>
<form id="file-form" enctype="multipart/form-data" action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="POST">

<p id="async-upload-wrap"><label for="async-upload">încarcă</label>
<input type="file" id="async-upload" name="async-upload"> <input type="submit" value="Încarcă" name="html-upload"></p>

<p><input type="hidden" name="post_id" id="post_id" value="<?php echo $post_id ?>" />
<?php wp_nonce_field('client-file-upload'); ?>
<input type="hidden" name="redirect_to" value="<?php echo $_SERVER['REQUEST_URI']; ?>" /></p>

<p><input type="submit" value="Salvează toate modificările" name="save" style="display: none;"></p>
</form>

Mulțumesc! :)

0
Toate răspunsurile la întrebare 9
5
12

În loc de …

} else {
    echo "<p>Fișierul dumneavoastră a fost încărcat.</p>";
}

… redirecționează către o altă adresă în caz de succes:

} else {

    $new_url = add_query_arg( 'success', 1, get_permalink() );
    wp_redirect( $new_url, 303 );
    exit;
}

Codul de stare 303 declanșează o cerere GET:

Această metodă există în principal pentru a permite ieșirii unui script activat prin POST să redirecționeze agentul utilizator către o resursă selectată. Noul URI nu este o referință substitută pentru resursa solicitată inițial. Răspunsul 303 NU TREBUIE să fie cache-uit, dar răspunsul la a doua cerere (redirecționată) ar putea fi cache-abil.

În gestionarul formularului, verifică mai întâi dacă $_GET['success'] este setat și valoarea sa este 1, apoi afișează un mesaj de succes. Vizitatorul poate reîncărca această pagină din nou și din nou – și nimic nu va fi trimis.

20 apr. 2013 18:34:57
Comentarii

Din păcate, asta nu a funcționat și nu am nicio idee de ce, deoarece acel cod PHP se execută (doar pentru a confirma, tot ce trebuia să fac era să înlocuiesc echo?)

ameeromar ameeromar
20 apr. 2013 19:40:33

Trebuie să trimiți header-ul înainte ca orice output să fie trimis către browser.

fuxia fuxia
20 apr. 2013 19:42:06

deci să pun bucata de cod PHP în header?

ameeromar ameeromar
26 apr. 2013 16:02:14

@ameeromar Da. Toată procesarea datelor ar trebui să fie făcută înainte de a începe generarea rezultatelor.

fuxia fuxia
26 apr. 2013 16:12:29

Aceasta funcționează în WP și 303 este un cod de redirecționare corect în acest caz.

skobaljic skobaljic
29 aug. 2021 17:09:54
1

Practic, ideea generală este să redirecționezi utilizatorul către alte pagini după trimiterea formularului, ceea ce ar împiedica retrimiterea formularului la reîmprospătarea paginii. Dar dacă trebuie să ții utilizatorul pe aceeași pagină după trimiterea formularului, poți face acest lucru în mai multe moduri.

Anularea datelor formularului

O metodă de a împiedica retrimiterea formularului la reîmprospătarea paginii este să anulezi datele formularului după trimitere, astfel încât variabila care stochează datele formularului devine goală și să înfășori codul de procesare al formularului pentru a verifica dacă formularul este gol.

if(!empty($_POST) && $_SERVER['REQUEST_METHOD'] == 'POST'){
   $data = // cod de procesare aici
   unset $data;
}

Aceasta va face ca $data să fie goală după procesare, iar prima condiție va împiedica retrimiterea formularului la reîmprospătarea paginii.

Javascript

Această metodă este destul de ușoară și blochează fereastra care solicită retrimiterea formularului la reîmprospătare odată ce formularul a fost trimis. Pur și simplu plasează această linie de cod JavaScript în subsolul fișierului tău și vezi magia.

<script>
if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}
</script>

Pentru mai multe detalii despre astfel de întrebări, poți vizita acest link.

11 mai 2018 11:54:20
Comentarii

Codul tău JavaScript a funcționat, dar sper să înțeleg cum funcționează în PHP, cum stochezi codul de procesare într-o variabilă?

Enjabain Enjabain
13 mai 2023 14:55:53
0

Am avut aceeași problemă și a fost "complicată" de faptul că redirecționez toate URL-urile către un singur fișier .php. S-a dovedit că tot ce trebuia să fac pentru a o rezolva a fost să inserez următorul fragment de cod înainte ca orice HTML să fie scris pe pagină.

<?php
if (isset($_POST['mypostvar']) && isset($_SERVER['REQUEST_URI']))
{
    [procesează datele postate în 'mypostvar']
    header ('Location: ' . $_SERVER['REQUEST_URI']);
    exit();
}
?>

Acest lucru va redirecționa către aceeași pagină după ce datele postate sunt procesate, așa cum doriți. După redirecționare, datele postate inițiale dispar și nu vor declanșa retrimiterea. Funcția 'header()' va funcționa doar dacă o inserați înainte ca orice să fie scris pe pagină. exit() este necesar.

Trebuie să procesați datele postate înainte de a plasa header().

12 sept. 2013 02:41:14
1

Am rezolvat această problemă folosind acțiunea template_redirect (fie într-un plugin, fie în fișierul functions.php al temei).

add_action('template_redirect','myfunction') ;

function myfunction() { 
  global $post;
  $post_id = $post->ID;
  if ( isset( $_POST['html-upload'] ) && !empty( $_FILES ) ) {
     require_once(ABSPATH . 'wp-admin/includes/admin.php');
     $id = media_handle_upload('async-upload', $post_id); //ID-ul postării paginii Fișiere Client
     unset($_FILES);
     if ( is_wp_error($id) ) {
        $errors['upload_error'] = $id;
        $id = false;
    }

  }
  $error = ($errors) ? 1 : 0;
  wp_redirect( "/?p={$post_id}?errors={$error}",301);
}

Apoi, pe pagina dvs. puteți verifica dacă există erori

if ($_GET['errors']) {
    echo "<p>A apărut o eroare la încărcarea fișierului.</p>";
} else {
    echo "<p>Fișierul dvs. a fost încărcat.</p>";
}

(Nu am testat acest cod.. ar trebui să vă ofere un punct de plecare bun).

12 sept. 2013 04:33:37
Comentarii

Cu global $post în prima linie, șansele ca această funcție să funcționeze vor crește...

gmazzap gmazzap
12 sept. 2013 05:40:44
0

De asemenea, poți verifica $_SERVER['REQUEST_METHOD'] === 'POST' pentru a te asigura că pagina a fost reîncărcată prin POST înainte de procesarea formularului.

if ( $_SERVER['REQUEST_METHOD'] === 'POST' )
{
   // Execută acțiuni
}
13 sept. 2013 01:40:02
0

o metodă mai ușoară este să eliminați acțiunea din formular și să aveți o acțiune ascunsă, de exemplu:

<html>
<form action="" method="post"><input type="text" name="name" />
<input type="submit" value="Trimite" />
<input type="hidden" name="action" value="Trimite" />
</form>
</html>

controlerul tău ar trebui să verifice validitatea și trimiterile pentru a verifica dacă formularul a fost trimis:

<?php 
if (isset($_POST['action']) && $_POST['action'] == 'Trimite'){
   //ar trebui să adaugi cod pentru validarea inputului utilizatorului aici
   //dacă totul este în regulă, trimite formularul
   header('Location: .'); //redirecționează către controler fără retrimitere
}
?>

această metodă este foarte utilă pentru scripturile în care adaugi sau elimini înregistrări pe o pagină de administrare, deoarece va reîncărca pagina fără retrimitere, iar înregistrarea eliminată sau adăugată va fi fie eliminată, fie adăugată pe pagină :)

10 ian. 2016 00:06:52
0

Cea mai bună metodă pe care am găsit-o este utilizarea JavaScript și CSS. Metoda comună de redirecționare PHP header('Location: <a href="a0">http://www.yourdomain.com/url</a>); va funcționa, dar poate cauza avertismentul "Warning: Cannot modify header information - headers already sent" în diferite framework-uri și CMS-uri precum WordPress, Drupal etc. Așadar, sugestia mea este să urmați codul de mai jos:

echo '<style>body{display:none;}</style>'; 
echo '<script>window.location.href = "http://www.siteurl.com/mysuccesspage";</script>'; 
exit;

Tag-ul <style> este important, altfel utilizatorul poate avea senzația că pagina s-a încărcat de două ori. Dacă folosim tag-ul <style> cu body { display: none; } și apoi reîmprospătăm pagina, experiența utilizatorului va fi la fel ca în cazul header('Location: ....); din PHP.

Sper că acest lucru vă va fi de ajutor :)

23 iun. 2017 15:33:06
0

Soluția 1: Dacă inserezi un post într-un tip de postare, atunci pur și simplu generează un cod aleator folosind funcția PHP rand() și salvează codul în timpul inserării postului. De asemenea, setează același cod în variabila $_POST['uniqueid'].

Apoi verifică la inserare dacă uniqueid-ul curent există deja în postări sau nu, poți face acest lucru folosind wp_query().

Soluția 2: Redirecționează către o altă pagină folosind JavaScript. Dar reține că utilizatorul poate să se întoarcă la pagină și la reîncărcare va salva din nou postarea. Pentru această problemă, prima soluție este cea mai bună.

Soluția 3: Folosește AJAX pentru a insera postarea - nu vor exista astfel de probleme. Dar dacă ai nevoie de vizualizări ale paginii, aceasta nu este o idee bună, poate doar pentru Google Adsense.

Am încercat doar să ajut din experiența mea. Dacă cineva are nevoie de cod pentru a rezolva problema, pur și simplu cere, voi împărtăși.

1 mai 2020 01:05:04
0
-2

modul simplu și ușor de a face acest lucru în php.

exemplu aici:

nu uitați tag-urile html (acest formular nu le permite aici, așa că folosesc [acestea])

$firstname = $post[firstname]

$lastname = $post[lastname]

[form action="here.php" method="post"]

prenume [input type='firstname' name='firstname']

nume [input type='text' name='lastname']

[input type=submit value=trimite]
[/form]

if($firstname==""||$lastname=="")
{

echo "prenumele și numele sunt goale";

}
else
{

mysql_query("INSERT AICI ÎN BAZA DE DATE");

header("Location:here.php");

}

acesta este modul de a păstra datele introduse în baza de date și de a evita postarea acelorași date de două ori la reîmprospătarea paginii

7 dec. 2014 17:14:57