Eviter la duplication d'insertion Mysql

Fermé
max-jacob Messages postés 28 Date d'inscription jeudi 19 octobre 2017 Statut Membre Dernière intervention 23 mai 2020 - Modifié le 18 oct. 2018 à 16:40
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 - 18 oct. 2018 à 16:45
Bonjour à tous,

J'ai mon script qui permet une insertion Mysql mais voilà, après l'insertion si j'actualise la page de confirmation d'insertion, une nouvelle insertion se produit.

J'ai alors décidé qu'au lieu que le message de confirmation d'insertion apparait sur la même page du formulaire, elle devrait plutôt apparaitre sur une autre page html afin que même si on actualise celui-là, il ai pas duplication d'insertion.

Pour ce faire, j'ai alors remplacé le message mysql de confirmation d'insertion avec
header("Location:../confirmation_insertion.php");
exit;
Mais ça ne marche toujours pas, j'obtient le message d'erreur: Warning: Cannot modify header information - headers already sent by...
J'ai vu qu'il était possible de faire une redirection en JavaScript mais ma page contient une variable de session que javascript ne pourrais pas assurer la continuité de la session.

C'est pourquoi alors je demande votre aide, voici mon script d'insertion:
      //Récupération des valeurs du formulaire
      if(!empty($_POST)){
      $maVariable = $_POST;



      //Insertion MYSQL
      $sql = "INSERT INTO compte VALUES( null, '".$maVariable['nom']."',  '".$maVariable['prenom']."',
      CURRENT_TIMESTAMP)";

if(mysqli_query($mysqli, $sql)){


      /*header("Location:../app/insertion.php");
      exit;*/
//L'erreur affiché par le header, Warning: Cannot modify header information - headers already sent by...



      echo "<p class='NumeroDispo'><br><img src='../img/success-icon.png' width='150' height='150'><br>L'enregistrement s'est déroulé avec succès!<br><a href='../app/index.php'>Revenir à la page d'accueil</a></p>";



  } else {
    echo "<p class='NumeroIndispo'><img src='../img/Warning.png' width='150' height='150'><br>Désolé, Une erreur une erreur s'est produit durant l'enregistrement</p>Cause de l'erreur: ".mysqli_error($mysqli);

    }
}
mysqli_close($mysqli);


EDIT : Ajout des BALISES DE CODE


A voir également:

1 réponse

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
18 oct. 2018 à 16:45
Bonjour,

L'erreur sur le header apparait lorsque tu as déjà afficher des choses via des echo/print en php ou via du code html....
C'est pour ça qu'il faut impérativement placer le MAXIMUM de ton code PHP avant tout affichage...
Je t'invite d'ailleurs à lire et à appliquer le contenu de ce lien
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code

Ensuite, la redirection JS ne te fera pas perdre les variables de session....

Et pour finir, tu peux prévenir le renvoie des données php en utilisant un système de tocken....
Tu peux utiliser, par exemple, un truc du genre
<?php
session_start();

/**
 * Creates a token usable in a form
 * @return string
 */
function getToken(){
  $token = sha1(mt_rand());
  if(!isset($_SESSION['tokens'])){
    $_SESSION['tokens'] = array($token => 1);
  }
  else{
    $_SESSION['tokens'][$token] = 1;
  }
  return $token;
}

/**
 * Check if a token is valid. Removes it from the valid tokens list
 * @param string $token The token
 * @return bool
 */
function isTokenValid($token){
  if(!empty($_SESSION['tokens'][$token])){
    unset($_SESSION['tokens'][$token]);
    return true;
  }
  return false;
}

// Check if a form has been sent
$postedToken = filter_input(INPUT_POST, 'token');
if(!empty($postedToken)){
  if(isTokenValid($postedToken)){
      //  ICI tu place ton code d'insertion ..
      // ...
  }
}

// Get a token for the form we're displaying
$token = getToken();
?>
<form method="post" action="">
    <input type="hidden" name="token" value="<?php echo $token;?>"/>
    <!-- tes autres champs de ton formulaire -->

</form>


0