Je cherche un moyen d'arrêter d'insérer ou d'envoyer des données dans la base de données lors de l'actualisation de la page.
voici mon code:
user_details_page.php
<form action="confirm_page.php" method="post" >
User Name:
<input type="text" name="username" >
User Email
<input type="text" name="useremail" >
Password:
<input type="text" name="password" >
<input type="submit" name="submit" >
</form>
confirm_page.php
if (isset($_POST['submit']))
{
$user= $_POST['username'];
$email = $_POST['useremail'];
$pass= $_POST['password'];
mysql_query("INSERT INTO table (username, useremail, email) VALUES ('$username','$useremail','$email');
}
donc le problème chaque fois que j'actualise la confirmation page.php les données sont envoyées à la base. comment arrêter ça?
En-tête de l'utilisateur sur une nouvelle page:
if (isset($_POST['submit']))
{
$user= $_POST['username'];
$email = $_POST['useremail'];
$pass= $_POST['password'];
mysql_query("INSERT INTO table (username, useremail, email) VALUES(`$username','$useremail','$email')");
}
//best outside the if statement so user isn't stuck on a white blank page.
header("location: landing_page.php");
exit;
En procédant ainsi, l'utilisateur qui actualise actualisera landing_page.php
, ce qui signifie qu'il ne fera pas l'insertion deux fois.
meilleur conseil : vérifiez si l'utilisateur existe en premier si ne l'insérez pas!
Ce qui se passe ici, c'est que lorsque vous actualisez la page, le formulaire est soumis deux fois.
Pour empêcher cela, vous pouvez utiliser des sessions:
session_start();
if( $_SESSION['submit'] == $_POST['submit'] &&
isset($_SESSION['submit'])){
// user double submitted
}
else {
// user submitted once
$_SESSION['submit'] = $_POST['submit'];
}
Nous pouvons l'arrêter sans redirection, meilleure façon d'utiliser PHP $ _SESSION comme ceci:
if($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_SESSION['form_submit']) )
{
extract($_POST);
$sql=""INSERT INTO table (username, useremail, email) VALUES('$username','$useremail','$email')";
$_SESSION['form_submit']='true';
}
else
{
$_SESSION['form_submit']='NULL';
}
Le moyen rapide est de rediriger la page vers son emplacement actuel:
if (isset($_POST['submit']))
{
//do somthing
header("Location: $current_url");
}
j'ai cette solution en utilisant session
<?php session_start();
if(isset($_POST[$_SESSION[a][count($_SESSION[a])-1]])){
echo "somthing....";
unset($_SESSION[a]);
}
else{
echo '<form method="post">';
$_SESSION["a"]=array();
$_SESSION["a"][0]="a".Rand(1,100);
echo '<input name="'.$_SESSION["a"][0].'"><br>';
$_SESSION["a"][1]="a".Rand(1,100);
echo '<input name="'.$_SESSION["a"][1].'"><br>';
$_SESSION["a"][2]="a".Rand(1,100);
echo '<input name="'.$_SESSION["a"][2].'"><br>';
$_SESSION["a"][3]="a".Rand(1,100);
echo '<input type="submit" name="'.$_SESSION["a"][3].'" value="submit"><br>';
echo '</form>';
}
?>
Une fois qu'une insertion ou une mise à jour est faite dans votre code, vous devez toujours rediriger vers une autre page.
Voir ici comment faire: Comment faire une redirection en PHP?
(Vous voulez utiliser une redirection PHP, et non une redirection Javascript ou HTML, car vous en avez évidemment besoin.
La page de confirmation doit correspondre à ce que vous redirigez après la mise à jour et non à l’insertion.
Le meilleur moyen d'éviter cela est d'ajouter un en-tête ("Emplacement: nom du fichier") après votre requête. Donc dans ton cas,
if (isset($_POST['submit']))
{
$user= $_POST['username'];
$email = $_POST['useremail'];
$pass= $_POST['password'];
mysql_query("INSERT INTO table (username, useremail, email) VALUES ('$username','$useremail','$email');
//must be inside the condition to prevent too many redirects
header('Location: user_details_page.php');
}
confirm_page.php:
if (isset($_POST['submit']))
{
$user= $_POST['username'];
$email = $_POST['useremail'];
$pass= $_POST['password'];
mysql_query("INSERT INTO table (username, useremail, email) VALUES ('$username','$useremail','$email')"); // <-- missing endquote and bracket here
header('Location: somewhere_else.php');
exit;
}