Page 1 sur 1

j'ai perdu ma variable $_GET['modify_id']

Posté : 08 janv. 2008, 21:19
par emilie1955
Bonjour,

j'ai un problème qui doit être simple à résoudre mais j'y arrive pas... Mon script traite l'affichage et le remplissage d'un formulaire, puis insère ou met à jour un enregistrement sur soumission.

Par exemple, si lL'URL de ma page est la suivante:

localhost/monrepertoire/formulaire.php?modify_id=5

(donc j'ai bien ma variable) j'obtiens mon formulaire bien rempli mais au submit je la perd .. elle n'est plus dans l'URL.... est-ce normal si j'envoie le formulaire à lui-même avec un $_SERVER["PHP_SELF"] ?

La variable qui m'intéresse est déclarée après connexion à la base comme ceci:
$id = ($_GET['modify_id']);  // j'en ai besoin dans le script d'update
// je déclare aussi mes autres variables
$titre =($_POST['titre']);
$mots_cles = ($_POST['mots_cles']);
$description =($_POST['description']);
$contenu =($_POST['contenu']);
$urlpage = ($_POST['urlpage']);
$id_parent =($_POST['id_parent']);
Je modifie mes données et au submit la page se recharge sans ma variable dans l'url ... ce qui tue mes tests....
if (($_POST['submitted']) && (!$_GET['modify_id'])) {formulaire vide et traitement pour insertion}
elseif  ((!$_POST['submitted']) && ($_GET['modify_id'])) {formulaire rempli avec les données du modify_id correspondant }
elseif  (($_POST['submitted']) && ($_GET['modify_id'])) {update}
Le message d'erreur me prouve que ma requête a été traitée comme si il s'agissait d'une insertion.

Mon formulaire est envoyé comme ceci:
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post">
Dois-je coller tout le code? je me demande si déjà l'erreur n'est pas présente ici...

Merci de votre précieuse aide.

Émilie

Re: j'ai perdu ma variable $_GET['modify_id']

Posté : 08 janv. 2008, 23:15
par @rthur
Bonjour,

Essaye simplement avec ceci:
<form action="<?php echo $_SERVER["PHP_SELF"]."?".$_SERVER["QUERY_STRING"]; ?>" method="post">
Car la variable $_SERVER["PHP_SELF"] ne conserve pas les paramètres passés en GET ;)

Posté : 08 janv. 2008, 23:30
par Invité
Pour un minimum de sécurtité, pense aussi à vérifier le contenu de ta variable GET pour éviter les injections SQL ! Dans ton cas, tu attends un entier alors pour en être sur tu peux faire
$id=intval($_GET['id_modify']);

Merci pour votre aide

Posté : 09 janv. 2008, 01:05
par emilie1955
Un gros merci @rthur pour ta réponse rapide et efficace. J'apprends tranquillement et je me rends compte que j'ai pas fini :shock:

J'ai utilisé une petite fonction trouvée sur le net pour empêcher les injections SQL mais je ne suis pas certaine si je l'utilise bien...

voici la dite fonction:
function quote_smart($value)
{
   // Stripslashes
   if (get_magic_quotes_gpc()) {
      $value = stripslashes($value);
   }
   // Protection si ce n'est pas un entier
   if (!is_numeric($value)) {
      $value = "'" . mysql_real_escape_string($value) . "'";
   }
   return $value;
}
et voici 2 requêtes sorties de leur contexte de test; (elles ne sont pas faites de la même façon, ça doit vous sembler un peu bête... je ne sais pas laquelle est la mieux)

// Requête update

$titre = quote_smart($titre);
$mots_cles = quote_smart($mots_cles);
$description = quote_smart($description);
$contenu = quote_smart($contenu);
$urlpage = quote_smart($urlpage);
$id_parent = quote_smart($id_parent);
			 
$success = mysql_query("UPDATE pages SET titre = $titre, mots_cles = $mots_cles, description = $description, 
contenu = $contenu,  urlpage = $urlpage, id_parent = $id_parent WHERE id_page='$id'")or die ( mysql_error()." IMPOSSIBLE DE MODIFIER CET ENREGISTREMENT"); 

// requête insertion

$query = sprintf("INSERT into pages (titre,mots_cles,description,contenu,urlpage,id_parent) VALUES (%s, %s, %s, %s, %s, %d)",
	quote_smart($_POST['titre']),
	quote_smart($_POST['mots_cles']),
	quote_smart($_POST['description']),
	quote_smart($_POST['contenu']),
	quote_smart($_POST['urlpage']),
	quote_smart($_POST['id_parent']));
	
	mysql_query($query)	
 		or die (mysql_error() ."<BR>Valeur de ID: $id <BR>REQUÊTE D'INSERTION IMPOSSIBLE");
 
L'une utilise un sprintf l'autre pas. C'est vous dire... je ne suis même pas tout à fait à l'aise avec ça... mais il me semble que le sprintf est inutile puisque ça marche et que j'ai protégé ma variable numérique avec

$id=intval($_GET['modify_id']);

comme l'ami invité me le faisait remarquer.



Encore merci

Émilie