2010-06-29 3 views
3

Le code ci-dessous fonctionne parfaitement. Dans un fichier appelé submit.php, un utilisateur peut entrer une soumission via un formulaire. Le formulaire va à submit2.php, où du code insère la soumission dans une base de données MySQL. Jusqu'ici tout va bien.Empêcher la soumission d'une soumission lors de l'actualisation d'un navigateur

Voici le problème: une fois que l'utilisateur a atterri sur submit2.php, si l'utilisateur actualise le navigateur, une boîte de dialogue «Confirmer la nouvelle soumission du formulaire» s'affiche. Ensuite, si l'utilisateur clique sur "Continuer" dans cette fenêtre, la soumission sera soumise à nouveau à la base de données MySQL.

Comment faire effectuer les opérations suivantes sur submit2.php:

  1. Le pop-up n'apparaît pas si le navigateur est actualisé.

  2. La soumission ne sera pas soumise à nouveau à la base de données.

Merci à l'avance,

John

Sur submit.php:

echo '<form action="http://www.domain.com/sample/submit2.php" method="post"> 
    <input type="hidden" value="'.$_SESSION['loginid'].'" name="uid"> 

    <div class="submissiontitle"><label for="title">Story Title:</label></div> 
    <div class="submissionfield"><input name="title" type="title" id="title" maxlength="1000"></div> 

    <div class="urltitle"><label for="url">Link:</label></div> 
    <div class="urlfield"><input name="url" type="text" id="url" maxlength="500"></div> 

    <div class="submissionbutton"><input name="submit" type="submit" value="Submit"></div> 
</form> 
'; 

Sur submit2.php:

if (isLoggedIn() == true) 
{ 

$remove_array = array('http://www.', 'http://', 'https://', 'https://www.', 'www.'); 
$cleanurl = str_replace($remove_array, "", $_POST['url']); 
$cleanurl = strtolower($cleanurl); 
$cleanurl = preg_replace('/\/$/','',$cleanurl); 
$cleanurl = stripslashes($cleanurl); 

$title = $_POST['title']; 
$uid = $_POST['uid']; 
$title = mysql_real_escape_string($title); 
$title = stripslashes($title); 
$slug = str_replace(' ', '-', $title); 

echo '-'.$site1.'-'; 

$cleanurl = mysql_real_escape_string(trim($cleanurl)); 

$site1 = 'http://' . $cleanurl; 

$displayurl = parse_url($site1, PHP_URL_HOST); 

function isURL($url1 = NULL) { 
     if($url1==NULL) return false; 

     $protocol = '(http://|https://)'; 
     $allowed = '[-a-z0-9]{1,63}'; 

     $regex = "^". $protocol . // must include the protocol 
         '(' . $allowed . '\.)'. // 1 or several sub domains with a max of 63 chars 
         '[a-z]' . '{2,6}'; // followed by a TLD 
     if(eregi($regex, $url1)==true) return true; 
     else return false; 
} 



if(isURL($site1)==true) 
    mysql_query("INSERT INTO submission VALUES (NULL, '$uid', '$title', '$slug', '$cleanurl', '$displayurl', NULL)"); 
else 
    echo "<p class=\"topicu\">Not a valid URL.</p>\n"; 

} else { 
    // user is not loggedin 
    show_loginform(); 
} 
+0

votre préparation de données est terrible. faire des stripslashes après mysql_real_escape_string est bizarre et insensé –

+0

Ouais ... la plupart de mon code est assez moche. J'essaie juste de concocter quelque chose qui fonctionne. – John

Répondre

7
+0

J'ai déjà essayé d'avoir "if ($ _ SERVER ['REQUEST_METHOD'] ==" POST ") {header ('Emplacement: http: //www.domain.com/sample/submit2.php ');} en haut de submit2.php, mais quand je le fais, la soumission ne peut pas être ajoutée à la base de données. – John

+0

Assurez-vous qu'il n'y a pas d'espace vide ou de lignes vides, en dehors des '' accolades. Tout espace vide sera envoyé et entraînera l'envoi des en-têtes. – RedFilter

0

Qu'est-ce que la première réponse/article tente de décrire est une méthode utilisée par de nombreux sites/applications qui permet de résoudre le problème que vous rencontrez.

La méthode fonctionne comme suit:

D'abord, vous avez une page de formulaire: info_form.php Ceci est la page qui contiendra votre formulaire. Il soumettra ces données de formulaire via POST à ​​votre deuxième page. Ensuite, vous avez votre page de traitement des données: info_submit.php Cette page ne fait que traiter des données et de travailler avec la base de données. Aucune sortie n'est affichée dans le navigateur. Une fois que les données sont traitées et insérées dans la base de données, cette page redirige l'utilisateur vers votre troisième page, envoyant toutes les informations nécessaires via GET (ie Redirection: info_confirm.php? Success = 1)

Troisièmement, vous avez votre page de confirmation : info_confirm.php Cette page reçoit toutes les informations sur le processus de soumission dont elle a besoin depuis la deuxième page via la chaîne de requête via GET.

Cela signifie que l'utilisateur ne remarque même jamais que la deuxième page existe. En ce qui concerne eux (et plus important encore, le navigateur), cette deuxième page n'existe pas. Ainsi, lorsque l'utilisateur actualise votre troisième page de confirmation, les seules variables chargées sont les variables GET et aucune information n'est renvoyée à votre base de données.

+0

D'accord, merci. Comment devrais-je rediriger submit2.php? – John

+0
Questions connexes