OVH Cloud OVH Cloud

Data en extra dans un POST

5 réponses
Avatar
Donald Martel
J'ai ecrit un script PHP pour ecrire une ligne de data dans une base MYSQL ,
mais quand je POST mon formulaire on dirait que mon script recoit des data
en extra car mon formulaire me cree une requete du style :

INSERT INTO parts (pcat,pcost,pcode,pdetail,pdescript,pqte,pmodele,x,y)
VALUES ("","","","","","","","25","16")

mais x et y et 25 et 16 ne sont pas des datas de mon formulaire.Elle
viennent de j'sais pas ou ????



voici mon script :


function InsertData($donneesForm,$nomTable)
{
if (!is_array($donneesForm))
{
return FALSE;
exit() ;
}
foreach ($donneesForm as $cle => $valeur)
{
$donneesForm[$cle] = trim($donneesForm[$cle]);
$donneesForm[$cle] = strip_tags($donneesForm[$cle]);
if ($cle =="tel")
{
$donneesForm[$cle] = ereg_replace("[)(.-]","",$donneesForm[$cle]);
}
$tableau_champ[]=$cle;
$tableau_valeur[]=$donneesForm[$cle];
}
$champs=implode(",",$tableau_champ);
$valeurs=implode('","',$tableau_valeur);

$requete = "INSERT INTO $nomTable ($champs) VALUES (\"$valeurs\")";
$result = mysql_query($requete) or die ("La requête , $requete, ne peut pas
être effectuée.") ;

return TRUE;
}

5 réponses

Avatar
bruno modulix
Donald Martel wrote:
J'ai ecrit un script PHP pour ecrire une ligne de data dans une base MYSQL ,
mais quand je POST mon formulaire on dirait que mon script recoit des data
en extra car mon formulaire
s/mon formulaire/ma fonction/


me cree une requete du style :

INSERT INTO parts (pcat,pcost,pcode,pdetail,pdescript,pqte,pmodele,x,y)
VALUES ("","","","","","","","25","16")

mais x et y et 25 et 16 ne sont pas des datas de mon formulaire.Elle
viennent de j'sais pas ou ????


Ca vient pourtant bien de quelque part. Mais comme on ne sait pas - à la
lecture de ton bout de code - d'où vient $donneesForm, on ne pourra pas
t'aider à trouver le problème... Maintenant, c'est sur que si tu passe
directement $_POST en argument, faut s'attendre à des choses bizarres.


Quelques remarques sans rapport avec ta question...


function InsertData($donneesForm,$nomTable)
{
if (!is_array($donneesForm))
{
return FALSE;
exit() ;


Cette instruction ne sera pas exécutée, puisque l'instruction précédent
retourne le contrôle au code appelant.

}
foreach ($donneesForm as $cle => $valeur)
{
$donneesForm[$cle] = trim($donneesForm[$cle]);
$donneesForm[$cle] = strip_tags($donneesForm[$cle]);


ca tient en une seule ligne, et avec un accès en moins...
$donneesForm[$cle] = strip_tags(trim($valeur));

if ($cle =="tel")
{
$donneesForm[$cle] = ereg_replace("[)(.-]","",$donneesForm[$cle]);
}


Tu peux sortir ce test de la boucle sans perdre en lisibilité (cf plus bas).

$tableau_champ[]=$cle;
$tableau_valeur[]=$donneesForm[$cle];


Et tu peux aussi faire ça plus simplement et plus efficacement en dehors
de la boucle.

}


if (isset($donneesForm['tel'])) {

$donneesForm['tel']=ereg_replace("[)(.-]","",$donneesForm['tel']);
}
$tableau_champs = array_keys($donneesForm);
$tableau_valeurs = array_values($donneesForm);

$champs=implode(",",$tableau_champ);
$valeurs=implode('","',$tableau_valeur);


et vu ce à quoi servent ces tableaux, passer par une variable
intermédiare n'est pas forcément nécessaire...

$requete = "INSERT INTO $nomTable ($champs) VALUES ("$valeurs")";
$result = mysql_query($requete) or die ("La requête , $requete, ne peut pas
être effectuée.") ;

return TRUE;
}



Bon, je reprend:

//----------------
// refactoring n°1
//----------------
function nettoie_donnees($valeur)
{
return strip_tags(trim($valeur));
}

function insererDonnees($donnees, $nomTable)
{
if (! is_array($donnees)) {
die("dans insererDonnees() : argument invalide");
}
$donnees = array_map('nettoie_donnees', $donnees);

if (isset($donnees['tel'])) {
$donnees['tel']=ereg_replace("[)(.-]","",$donnees['tel']);
}

$champs=implode(",",array_keys($donnees));
$valeurs=implode('","',array_values($donnees));

// le problème ici est qu'on n'a pas de vérification de coherence
// entre $donnees et le schema de la table.
$requete = "INSERT INTO $nomTable ($champs) VALUES ("$valeurs")";
$result = mysql_query($requete)
or die ("dans insererDonnees : la requête '$requete' ne peut pas
être effectuée.") ;

return TRUE;
}

Hum... je n'aime pas le test sur $donnees['tel'], ce n'est pas
générique. Si tu ajoute un champs fax, ou si ton champs s'appelle
autrement, tu va devoir venir modifier le code ici...


//----------------
// refactoring n°2
//----------------
function nettoyerDonnees($valeur)
{
return strip_tags(trim($valeur));
}

// remplacer XXX par le nom de la table
// et ecrire une fonction par table ayant un besoin
// specifique en matière de formatage
function formaterDonneesXXX($donnees)
{
$donnees = array_map('nettoyerDonnees', $donnees);
if (isset($donnees['tel'])) {
$donnees['tel']=ereg_replace("[)(.-]","",$donnees['tel']);
}
return $donnees;
}

function formaterDonneesDefaut($donnees)
{
return array_map($donnees);
}

function insererDonnees($donnees, $nomTable)
{
if (! is_array($donnees)) {
die("dans insererDonnees() : argument invalide");
}

$format_fun = "formaterDonnees$nomTable";
if (! function_exists($format_fun)) {
$format_fun = "formaterDonneesDefaut";
}
$donnees = $format_fun($donnees);

$champs=implode(",",array_keys($donnees));
$valeurs=implode('","',array_values($donnees));
$requete = "INSERT INTO $nomTable ($champs) VALUES ("$valeurs")";
$result = mysql_query($requete)
or die ("dans insererDonnees : la requête '$requete' ne peut pas
être effectuée.") ;

return TRUE;
}


Maintenant, ça ne règle pas tes deux problèmes :
1/ passer les données qui vont bien à la fonction (et là, comme on ne
connait pas le reste du code, on ne peut pas t'aider)
2/ s'assurer que la structure de $donnees est cohérente avec celle de la
table $nomTable.

Mes deux centimes...
--
bruno desthuilliers
ruby -e "print ''.split('@').collect{|p|
p.split('.').collect{|w| w.reverse}.join('.')}.join('@')"

Avatar
CrazyCat
Donald Martel wrote:
mais x et y et 25 et 16 ne sont pas des datas de mon formulaire.Elle
viennent de j'sais pas ou ????


Peut être de la position de la souris lors du click de validation...

Correction après réflexion de 30s: très certainement....

--
Découvrez Original War: http://www.original-war.org
Humour: http://www.chatfou.com
Tchattez en liberté: http://www.c-p-f.net

Avatar
Stephane Pineau
Le 15 Apr 2005 17:59:09 GMT, CrazyCat écrivait:

Peut être de la position de la souris lors du click de validation...

Correction après réflexion de 30s: très certainement....


Non je te confirme ton hypothèse... les cordonnées x,y du bouton de
soumission sont toujours transmis lorsque l'on remplace le submit
traditionnel par une image.

http://www.htmlhelp.com/faq/html/forms.html#custom-button

Il suffit donc dans le bout de script indiqué de tester si la clé extraite
du tableau de données postée est x ou y et dans ce cas ne pas les traiter.

Cdlt,
Stéph'


--
AcroDict : Dictionnaire francophone des acronymes informatiques
<URL:http://www.teaser.fr/~spineau/acrodict/>
PHP Page : Script PHP3 Gratuits (Forum, Gestionnaires BDD, etc..)
<URL:http://steph.pineau.free.fr/php/index.php>

Avatar
Donald Martel
Effectivements j'envoie mes donnees a la fonction par $_POST
InsertData($_POST,"parts");
Donc peut etre de la les donnees d'extra...
Autre detail aussi que je n'avais pas mentionne, mon submit se fait avec une
image... Cela peut-il influencer le POST ??????

Et merci beaucoup pour les corrections suggerees a mon code... je vais en
prendre grandement connaissance et surement les mettre en application...
"CrazyCat" a écrit dans le message de news:
d3omnb$f7l$
Donald Martel wrote:
mais x et y et 25 et 16 ne sont pas des datas de mon formulaire.Elle
viennent de j'sais pas ou ????


Peut être de la position de la souris lors du click de validation...

Correction après réflexion de 30s: très certainement....

--
Découvrez Original War: http://www.original-war.org
Humour: http://www.chatfou.com
Tchattez en liberté: http://www.c-p-f.net



Avatar
Jedi121
Stephane Pineau avait prétendu :
Il suffit donc dans le bout de script indiqué de tester si la clé extraite
du tableau de données postée est x ou y et dans ce cas ne pas les traiter.


Ou bien plus sauvage :
unset($_POST[x]);
unset($_POST[y]);
en début de page de traitement.