[PHP] doit-on utiliser extract() ?

[Résolu/Fermé]
Signaler
Messages postés
6728
Date d'inscription
mardi 14 mai 2002
Statut
Contributeur
Dernière intervention
11 janvier 2016
-
 deeploy -
salut,

j'ai un bon paquet de variables à récupérer depuis un formulaire (sondage), je pense utiliser extract($_POST); pour tout extraire d'un pèt'.

je ne trouve pas d'exemple qui utilise la fonction extract() et pas de commentaire non plus, je suis donc méfiant...

la doc met en garde contre les données inconnues.
https://www.php.net/manual/fr/function.extract.php

moi je souhaite l'utiliser sur un $_POST provenant d'un formulaire avec cases options et cases à cocher.

'register_globals' est activé sur mon serveur.

je me demande donc si vous connaitriez des raisons de s'en méfier ou de ne pas l'utiliser ou alors une meilleure méthode !

7 réponses

Bonjour,

Apparemment, personne ne connaît ?

Je me pose la même question..
The extract() function imports variables into the local symbol table from an array.
Bonjour,

// On n'effectue les traitements qu'à la condition que les informations aient été effectivement postées
if ( isset($_POST) && (!empty($_POST['a'])) && (!empty($_POST['b'])) ) {

extract($_POST); // je vous renvoie à la doc de cette fonction

echo $a;
echo $b
Messages postés
391
Date d'inscription
lundi 8 novembre 2004
Statut
Membre
Dernière intervention
19 mai 2010
4
Bonjour,
moi j'adore cette fonction et voici un exemple que j'ai utilisé récemment .
je te laisse le soin d'etudier le principe en suivant cet exemple.j'utilise extract() pour mes listes deroulantes .

Bon courage.

....
$rq = "SELECT DISTINCT departement FROM devis_table ORDER BY departement"; 
$resultq = mysql_query($rq) 
or die ("Exécution de la requête impossible"); 



echo"<b>Choisissez un departement</b>\n"; 
echo"<br><br>"; 

echo "<form action='menu1.php' method='post'>

<select name='departement'>\n"; 

echo "<option value='null'>Tous les Départements</option>";
while ($liste=mysql_fetch_array($resultq)) 
{ 
extract($liste); 
echo "<option value='$departement'>$departement\n"; 
} 
echo " </select>\n"; 
echo " <BR><BR><BR><BR>"; 

....


Messages postés
6728
Date d'inscription
mardi 14 mai 2002
Statut
Contributeur
Dernière intervention
11 janvier 2016
914
salut,

en fait je me posais la question dans le cas de l'utilisation des données de $_POST mais depuis (merci PHP 5.2) je suis passé à filter_input().

en tous cas merci !
-;o)
bonsoir,

je rebondis sur le sujet , j'ai du lire en partie les même conseils (mais pas vu le filter_input();)

En fait je travaille sur un petit cms perso et je cherchais un moyen de récuperer les differentes variables eventuellement dispos pour ensuite traitées celle que je recherche selon la config.

je met ci dessous une page test mise en forme avec une fonction un peu 'bateau' (extrait d'une fonctions d'une class que j'essaie de dévellopper )


//////////////////////////////////////
<?php
session_start();
function check($array) {
//verification si tableau et retourne le nombre d'enregistrement
$nb_item=is_array($array) ? count($array) : 0 ;
$nb_item = $nb_item;
//puis parcours du tableau si pas zero
if ($nb_item !=0) {
echo '<ul >';
foreach($array as $cle=>$valeur)
{
echo '<li>'.$cle.' : '.$valeur.'</li>';
}
echo '</ul>';
}
else { echo' <p class="err">Pas de variables récupérées.</p>';}
$array==null;
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="fr">
<head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Robots" content="follow,noindex,noarchive">

<title> test sur variable sans extract(); </title>
<style type="text/css">
body {text-align:center;}
#global {
display:table;
display:inine-block;
margin:auto;
}
#global div {
float:left;
padding:5px;
}
.pied {
clear:both;
}
h1, #global div , .pied{
border:3px double;
outline: 3px double red;
background:lightgreen;
margin:1em 5px;
}
label {float:left;
width:100px;
}
ul {
border:1px solid;
padding:5px;
width:250px;
margin:auto;
background:#ccc;
}
.err {
color:red;
}
</style>
<!--[if lte IE 7]>
<style type="text/css">
#global {
display:inline;
zoom:1;
}
#global div {
width:25%;
}
</style>
<![endif]-->
<?php
echo '</head><body><div id="global"><h1>les tests</h1>';

// on lance le test sur $_POST
echo '<div ><h2>test sur post </h2>';
check($_POST);
echo'
<form method="POST">
<fieldset><legend>form en methode post</legend>
<p><label for="test" >Test</label><input type="text" name="test" ></p>
<p><label for="test2" >Test 2</label><input type="text" name="test2" ></p>
<p><input type="submit" name="sub" value="test sur var post"></p>
</fieldset>
</form></div>';

// on lance le test sur $_GET
echo' <div ><h2>test $_get</h2>';
check($_GET);
echo '<p><a href="?test=oki&autretest=reoki&etc=etc">test sur 3 variable dans l\'url</a></p>';
echo '<p><a href="?un=une seule variable">test sur 1 seule variable dans l\'url</a></p></div>';


// on lance le test sur $_SESSION
echo '<div ><h2>test sur session</h2>';
$_SESSION['<b>key : log 1</b>'] = 'okitest';
$_SESSION['<b>clé : log 2</b>'] = 'okitest2';
check($_SESSION);
echo'<p>testons voir si il y a un cookie créer par la session </p>';

check($_COOKIE);
echo '</div><p class="pied">fin des test </p></body></html>';
session_destroy();
?>
////////////////////////////////////////////////

a partir de la on peut récuperer ces données , les filtrées , les nettoyées et les restockées dans un ou d'autres tableau .

Est ce une bonne idée ?

(dans ma class voici ce que je fais avant de voir ce que je vais en faire extraits
:
public function __construct($query) {
$this->check($query);//on verifie si tableau

}

puis la fonction check:
function check($query) {
//verification si tableau et retourne le nombre d'enregistrement
$nb_item=is_array($query) ? count($query) : 0 ;
$this->nb_item = $nb_item;
}
)

Je continue sur cette lancée ou est ce une bêtise ?
Messages postés
6728
Date d'inscription
mardi 14 mai 2002
Statut
Contributeur
Dernière intervention
11 janvier 2016
914
salut,

tu devrais ouvrir une discussion spécifique pour ton sujet et mettre ton code en forme avec le bouton "Conserver la mise en forme du texte sélectionné".

à plus
Messages postés
1767
Date d'inscription
lundi 11 décembre 2000
Statut
Membre
Dernière intervention
23 décembre 2009
607
Bjr

Tu peux utiliser extract si tu veux

Personnellement pour les formulaires je préfère passer par un tableau intermédiaire portant le nom du formulaire

Ex

<html>
<head>
<style>
*
{
	font-family : arial;
	font-size : 10pt;

}
</style>
</head>
<body>
<form name="form1" method="post" >
	Username <input type="text" value="" name="form1[username]"><br />
	Password <input type="text" value="" name="form1[password]"><br />
	<select name="form1[choix]">
		<option value="option A">Option A</option>
		<option value="option B">Option B</option>
		<option value="option C">Option C</option>		
	</select>
	<br />
	Autorisation <input type="radio" name="form1[autorisation]" value="oui"><br />

	<input type="submit" value="Envoyer">
</form>
<?php

$form1 = (isset($_POST["form1"])) ? $_POST["form1"] : null;
if ($form1)
{
	echo "<pre>";
	var_dump($form1);
	echo "</pre>";
}
?>
</body>
</html>


En php je récupère le tableau associatif $form1 qui contient tous mes champs : juste un petit test isset($form1[...]) dans le cas des boutons radio étant donné que leur valeur n'est pas systématiquement transmisse et c'est tout.



Messages postés
2
Date d'inscription
samedi 19 janvier 2013
Statut
Membre
Dernière intervention
28 septembre 2013

$nb=extract($_POST,EXTR_PREFIX_SAME,'new');
foreach($_POST as $k => $v){
$$k = htmlspecialchars($v);
}