[PHP] Recuperer des variables

Fermé
ehar Messages postés 6 Date d'inscription jeudi 21 septembre 2006 Statut Membre Dernière intervention 11 janvier 2007 - 17 oct. 2006 à 10:34
 thib - 12 mars 2009 à 21:20
Bonjour,

Je vais tenter d'expliquer mon problème, pardon si je ne suis pas très clair au début, m'engueulez pas lol

Dans une page PHP généré dynamiquement à partir des valeurs d'une base SQL, j'ai un nombre X de zone de texte saisississable, depend du nombre d'enregistrement dans ma table. Comme je ne sais pas combien je peux en avoir (de 1 à 1000) le nom que je donne à ce "input" est égalemneet dynamique. A cote de chacun d'eux, je mets un bouton de validation "form" qui lance une autre page PHP quand on clique dessus.

Je voudrais, suivant le bouton "form" clické, recuperer les valeurs de la zone "input" juste à coté. Pour cela il ya deux methodes.
- Faire dans la nouvelle page un $_GET. Cependant je ne connais pas le nom de la zone vu qu'il est dynamique. (Peut-on faire des $_GET dynamique ? Si oui comment ?)
- Passer la valeur de la zone "input" en paramètre de l'URL. Mais là je ne sais pas comment faire, car la valeur n'est dans aucune variable, vu qu'elle vient tout juste d'être saisie.

Jespère avoir été clair.

D'avance merci

12 réponses

kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
17 oct. 2006 à 17:24
J'ai penser à un truc.. bon solution de port tu me dira, mais j'y ai pas réfléchi plus que ca.
Voilà ce que je te propose :

Tu as ton formulaire avec X input dont les noms sont variables.
Ce que tu peux faire tout simplement, c'est créer un tableau de ces noms d'input, tableau que dans lequel tu insere tes valeurs au fur et à mesure que tu pose tes input (donc dans ta boucle, j'imagine).

Puis, à la fin de ton formulaire, tu met un champ caché prenant pour valeur ton tableau rempli précédemment.

Tu met ton formulaire en POST, et ainsi, au tout début de ta page suivante (celle appellée par le formulaire), tu récupère ton tableau de valeur par POST.

Tu as donc maintenant possibilité de connaitre les noms de tes inputs créés dynamiquement :)
Afin de pouvoir extraire les valeurs passées en POST à ces input, car il a bien falloir les extraires pour les traiter, il te faut ensuite faire une fonction qui t'extrait les valeurs et les mets dans un tableau.

C'est à dire que tu fais un boucle sur ton tableau récupéré (celui des noms d'input) et tu boucle dessus. Pour chaque valeur récupérée (nom de l'input), tu vas extraire la valeur passée dans $_POST["nom_courant_de_l'input"], valeur que tu met immédiatement dans un deuxieme tableau, que tu rempli donc au fur et à mesure de ta boucle (comme dans ta page de formulaire lors de la création des input, sauf que là c'est lors de la récupération).

Au final, tu as un tablea avec toutes les valeurs de tes inputs.

Pour ce qui est du traitement apres... et bien ca dépend ce que tu veux en faire, mais je te laisse faire ;)

Bon courage :)
0
Bonjour,

Si c'est juste pour savoir combien de champ input ou autre que tu as crée dynamiquement, pas besoin d'envoyer un tableau qui pourrait se retrouver trés lourd si tu as 1000 input crée ou plus.

Il suffit simplement de crér une variable integer $nombre_input et de l'incrémenter ($nombre_input++;) à chaque fois que tu crée un nouvel input, après tu envoie cette variable en hidden avec ton formulaire.

Quand tu la récupére tu sais combien de champs input que tu as et tu peux accéder à tes champs avec leur nom générique (je suppose que tu n'as pas mis des noms random, mais du genre : name="nom_input_1" ... ) donc ici le nom générique est "nom_input" et en ajoutant le numéro de l'input auquel tu veux accéder.

Le mieux c'est d'utiliser directement la variable integer qui te sert a générer les noms de tes champs input ...


exemple :

$nom_input = 'nom_generique_input';

for ($nombre_input = 0;$nombre_input < $nombre_champ_dans_BDD; $nombre_input++)
{
echo '<input name="'.$nom_input.$nombre_input.'" type="ton_type">';
}
echo '
<input type="hidden" name="nom_input" value="'.$nom_input.'">
<inputtype="hidden" name="nombre_input" value="'.$nombre_input.'"
<input type="submit" value="actualizar">';

et dans le script de gestion

if(isset($_post['nom_input']) && isset($_post['nombre_input']))
{
$nom_input=$_post['nom_input'];
$nombre_input=$_post['nombre_input'];
echo 'mon dernier enregistrement est : '.$_post[$nom_input.$nombre_input];
}


Voilà j'suis pas sur pourla concaténation des variables dans le tableau $_post mais bon sinon il suffit de changer la maniére de l'écrire.

Chao.
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
9 févr. 2009 à 09:44
Effectivement ça marchera tout aussi bien en étant moins lourd.
0
Bonjour,

Votre solution pourrai résoudre mon problème????


J'ai actuellement un formulaire qui dois afficher par exemple 3 utilisateurs et je dois mettre sur chaque utilisateur leur état via un menu déroulant par exemple "présent" "absent". Et quand j'appuie sur le bouton "submit" il doit m'ajouter autant de présence que d'utilisateur mais c'est pas le cas il m'ajoute que un état celui de la dernière personne du listing.

Voici le code du formulaire:
<?php
$query_users = "SELECT * FROM agent, service, utilisateurs WHERE agent.nservice = service.nservice = utilisateurs.nservice AND lservice = 'informatique'"; // Tri la table agent sur le champs Nservice
$users = mysql_query($query_users, $dbprotect) or die(mysql_error());
    while( $result = mysql_fetch_object( $users ) )
    {
?>
<form action="crea.php" method="post">
<table width="495" border="1">
  <tr>
    <td width="109">Entrez la Date:</td>
    <td width="215"> <input type="text" name="date" size="20"></td>
  </tr>
  <tr>
    <td>Agent:</td>
    <td><input type="text" size="10" name="agent" value="<?php echo ($result->nom);?>"> <select name="etat">
<option>Pr&eacute;sent</option>
<option>Cong&egrave;s Annuels</option>
<option>Cong&egrave;s Exceptionnel</option>
<option>Mission</option>
<option>R&eacute;cup&eacute;ration</option>
</select></td>
  </tr>
  <tr>
    <td>Chef de service</td>
    <td><input type="text" size="10" name="login" value="<?php echo ($result->login);?>"></td>
</table>
<input type="hidden" name="nservice" value="<?php echo ($result->nservice);?>"
<?php
}
?><br>
<input type="submit" value="valider" name="valider">
</form>
 
<?php } // fin de l'affichage conditionnel?>


crea.php

<?php require_once('connexion.php'); ?>
<?php
if(isset($_POST['valider']))
{
 
$nservice=$_POST['nservice'];
$date=$_POST['date'];
$agent=$_POST['agent'];
$etat=$_POST['etat'];
$login=$_POST['login'];
 
$valider=$_POST['valider'];
 
$requete ="INSERT INTO presence (id,nservice,date,agent,etat,login) values ('','$nservice','$date','$agent','$etat','$login')";
 
mysql_query($requete);
mysql_close();
echo "La date à bien été prise en charge pour vos agent";
}
else
echo "Merci de bien remplir le formulaire";
?>
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
10 févr. 2009 à 11:06
Bonjour,

Effectivement il faut que tu fasse le même genre de chose.

Actuellement, comme tu nomme à chaque fois tes éléments de la même façon dans ta boucle d'affichage (l'input pour la date, la select box pour la présence / non présence / etc), lors de la soumission du formulaire il va se passer la chose suivante :
Le moteur web va récupérer tous les éléments de la page contenu dans ton FORM et les envoyer via le tableau $_POST selon le nom que tu leur as donné, et ce sans ce pré-occupé de savoir si la variable qui a pour nom le nom de l'élément à ajouter existe déjà dans le tableau $_POST ou non. C'est donc pour ça que pour chacune de tes éléments inclus dans ta boucle, tu n'as que la dernière valeur référencée dans ton tableau $_POST lors de la soumission.

Donc une solution est bien d'appliquer la même remarque que pour le problème précédent : nommer individuellement tous tes champs, ce qui passe donc par une concaténation d'un entier (incrémenté) avec le nom des champs.

Exemple:

<?php
$query_users = "SELECT * FROM agent, service, utilisateurs WHERE agent.nservice = service.nservice = utilisateurs.nservice AND lservice = 'informatique'"; // Tri la table agent sur le champs Nservice
$users = mysql_query($query_users, $dbprotect) or die(mysql_error());
$indice = 0;
    while( $result = mysql_fetch_object( $users ) )
    {
?>
<form action="crea.php" method="post">
<table width="495" border="1">
  <tr>
    <td width="109">Entrez la Date:</td>
    <td width="215"> <input type="text" name="date<?php echo $indice; ?>" size="20"></td>
  </tr>
  <tr>
    <td>Agent:</td>
    <td><input type="text" size="10" name="agent<?php echo $indice; ?>" value="<?php echo ($result->nom);?>"> 
<select name="etat<?php echo $indice; ?>">
<option>Pr&eacute;sent</option>
<option>Cong&egrave;s Annuels</option>
<option>Cong&egrave;s Exceptionnel</option>
<option>Mission</option>
<option>R&eacute;cup&eacute;ration</option>
</select></td>
  </tr>
  <tr>
    <td>Chef de service</td>
    <td><input type="text" size="10" name="login<?php echo $indice; ?>" value="<?php echo ($result->login);?>"></td>
</table>
<input type="hidden" name="nservice" value="<?php echo ($result->nservice);?>"
<?php
 $indice++;
}
?><br>
<input type="hidden" name="numIndice" value="<?php echo $indice; ?>"/>
<input type="submit" value="valider" name="valider">
</form>
 
<?php } // fin de l'affichage conditionnel?>



Voilà pour l'affichage. Maintenant il faut adapter ton traitement, c'est à dire récupérer le nombre d'agent via la variable cachée "numIndice" pour pouvoir boucler sur ce nombre afin de faire ce que tu fais déjà mais sur chaque variable nommée "nom" + indice.
Exemple:
<?php require_once('connexion.php'); ?>
<?php
if(isset($_POST['valider']))
{

$indice = $_POST['numIndice'];
$valider=$_POST['valider'];

if ( $indice > 0 ){

for ($i=0; $i < $indice; $i++ ){
 
$nservice=$_POST['nservice'.$i];
$date=$_POST['date'.$i];
$agent=$_POST['agent'.$i];
$etat=$_POST['etat'.$i];
$login=$_POST['login'.$i];
 
 
$requete ="INSERT INTO presence (id,nservice,date,agent,etat,login) values ('','$nservice','$date','$agent','$etat','$login')";
 
mysql_query($requete);

}

mysql_close();
echo "La date à bien été prise en charge pour les ".$indice." agent";

}

}
else
echo "Merci de bien remplir le formulaire";
?>



Voilà, ton problème devrait être réglé. Le code que j'ai donné n'a pas été testé, il peut donc y avoir des erreurs de syntaxe / recopie, mais l'idée est là. A toi de corriger s'il y a des petites fautes.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci beaucoup ça fonctionne.

Quand je vois la solution je suis dégouté d'être bête :p
0
C'est encore moi :( j'espère que vous avez passez un bon week end :).

Les modifications que tu as faite marche très bien, mais pour que se soit plus pratique pour l'utilisateur, j'aimerai qu'il y ai que 1 input pour la date et qui l'ajoute pour tous les agent

Voila la modification que j'ai faite et qui marche pas bien sur :x
<?php
$query_users = "SELECT * FROM utilisateurs,agent WHERE utilisateurs.nservice = '1' AND agent.nservice = '1'"; // Tri la table agent sur le champs Nservice
$users = mysql_query($query_users, $dbprotect) or die(mysql_error());
$indice = 0;
?>
<form action="crea.php" method="post">
Entrez la Date <input type="text" name="date<?php echo $indice;?>">
<?php

    while( $result = mysql_fetch_object( $users ) )
    {
?>
<table width="495" border="1">
  <tr>
    <td>Agent:</td>
    <td><input type="text" size="20" name="agent<?php echo $indice;?>" value="<?php echo ($result->nom);?> <?php echo ($result->prenom);?>"> <select name="etat<?php echo $indice;?>">
<option>Pr&eacute;sent</option>
<option>Cong&egrave;s Annuels</option>
<option>Cong&egrave;s Exceptionnel</option>
<option>Mission</option>
<option>R&eacute;cup&eacute;ration</option>
</select></td>
  </tr>
  <tr>
    <td>Matricule</td>
    <td><input type="text" size="10" name="nchrono<?php echo $indice;?>" value="<?php echo ($result->nchrono);?>"></td>
  </tr>
  <tr>
    <td>Chef de service</td>
    <td><input type="text" size="10" name="login<?php echo $indice;?>" value="<?php echo ($result->login);?>"></td>
    </tr>
</table>

<input type="hidden" name="nservice<?php echo $indice;?>" value="<?php echo ($result->nservice);?>"

<?php

	$indice++;
}

?>
<br>
<input type="hidden" name="numIndice" value="<?php echo $indice;?>"/>
<input type="submit" value="valider" name="valider">
</form>
<a href="consultation.php">Consulter/Modifier</a>


Une idée?
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
16 févr. 2009 à 17:25
Bonjour, oui bon we merci.

L'erreur est évidente oui ^^

Puisque pour la date tu n'as qu'un seul champ, il ne faut plus le nommer dynamiquement (aucun intérêt).
Ton formulaire (partie date) devient donc simplement ceci :
Entrez la Date <input type="text" name="date_amoi">


La partie en gras étant à définir toi même (il faut que ce soit le même nom dans le formulaire mais aussi dans le traitement lorsque tu récupère la valeur du champ.

Et la partie traitement :

$date = $_POST['date_amoi'];

for ($i=0; $i < $indice; $i++ ){
 
$nservice=$_POST['nservice'.$i];
$agent=$_POST['agent'.$i];
$etat=$_POST['etat'.$i];
$login=$_POST['login'.$i];
 


Tu l'ajoute en dehors de ta boucle de traitement puisque la date est commune et avec un nom statique. Tu pense bien à supprimer la réception de la date à l'intérieur de ta boucle (ou simplement la déplacer à l'extérieur puis la modifier)

Normalement ça devrait fonctionner.
0
Merci c'est niquel :)
0
Bonjour,

J'ai un peu le même problème.

Dans mon code, je n'arrive pas à récupérer la valeur de mon input qui a un nom variable.

Voici mon code :

<form method="post">
<p>
<input type="text" value="Nb lignes" size="10" disabled="disabled"/> <input type="text" value="Nb colonnes" size="10" disabled="disabled"/></br>
<input type="text" name="nb_lignes" value="7" size="10"/> <input type="text" name="nb_colonnes" value="14" size="10"/></br></br>
<input type="reset" value="Réinitialiser"/> <input type="submit" value="Valider"/></br></br>

<?php if ((isset($_POST['nb_lignes'])) and (isset($_POST['nb_colonnes'])))
{
for ($i=1; $i <= $_POST['nb_lignes'] ; $i++)
{
for ($j=1; $j <= $_POST['nb_colonnes'] ; $j++)
{
?> <input type="text" size="7" name="<?php echo 'case[' . $i . ';' . $j . ']';?>" value="<?php echo 'case[' . $i . ';' . $j . ']';?>" /><?php
}
?></br><?php
}?>
</br></br>
<input type="text" value="Case_i" size="10" disabled="disabled"/> <input type="text" value="Case_j" size="10" disabled="disabled"/></br>
<input type="text" name="case_i" value="3" size="10"/> <input type="text" name="case_j" value="4"size="10"/></br></br>
<?php if ((isset($_POST['case_i'])) and (isset($_POST['case_j'])))
{
$case_i=$_POST['case_i'];
$case_j=$_POST['case_j'];
echo 'Le contenu de la case[' . $_POST['case_i'] . ';' . $_POST['case_j'] . '] est : ' . $_POST['case[' . $case_i . ';' . $case_j .']'] ;
}
}?>
</p>
</form>

Je suis débutant en PHP, quel est mon erreur pour que la valeur de la case s'affiche ?

Existe-t-il un moyen d'écrire un formulaire entièrement en PHP ?
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
6 mars 2009 à 12:01
Bonjour,

Je n'ai pas lu en détails ton formulaire mais je pense qu'en spécifiant l'action attachée à ton formulaire (c'est à dire sur quelle page il redirige une fois submité, ça devrait déjà marcher un peu mieux. Il faut donc que tu renseigne la propriété 'action' avec le nom de ton fichier PHP, mettons "toto.php" par exemple, comme ceci :

<form method="post" action="toto.php"/> 


Pour ce qui est d'écrire un forumulaire entièrement en PHP, tu peux utiliser 'echo' de la manière suivante pour écrire par exemple un input :

<?php

$maValeur = 3;
echo "<input type='texte' name='champ1' value='".$maValeur."'/>";

?>


Ainsi tu vois que tu peux facilement adapté ceci pour n'importe quel code HTML à écrire sur la page (et donc un formulaire dans ton cas)
0
Bonsoir,

Merci kij_82 pour ta réponse, mais malheureusement même en spécifiant l'action de mon formulaire cela ne fonctionne pas, je redirige la réponse sur la même page (mon code php est écrit sur toto.php et je redirige la réponse vers toto.php).

Par contre, merci pour l'astuce pour le formulaire en php, par contre celui-ci est toujours visible lorsque l'on désire voir le code source de la page.

Comment faire pour que celui-ci soit totalement invisible, c'est-à-dire complètement en php.

à bientôt
0
Bonjour,

Je ne peux malheureusement pas tester en ce moment mais essaye simplement en rajoutant la fermeture de la balise </form> après le input submit.

Sinon tu n'as qu'un seul formulaire dans ta page, si no n'oublie pas la balise name.

Et pour le formulaire en php, c'est normal qu'il soit toujours visible, le php traite le code que tu lui code et te renvoie du code html qu'il affiche. Donc toi vu que le formulaire est déjà en html et qu'il ne nécessite pas forcément un traitement au php ça ne sert a rien de le mettre en php, laisse le en htmnl directement.

Ça ira plus vite, bon ça se verra pas mais théoriquement sa allège le traitement php (vu que tu lui donne moins de code php a traiter) et donc il renvoie le code html plus vite.

Bon dis où tu en es pour le retour de balise.

chaoop
0
Bonsoir,

Désolé, mais ça ne semble pas marcher, voici le code que j'ai testé :

<form method="post">
<p>
<input type="text" name="texte" value="Nb lignes" size="10" disabled="disabled" /> <input type="text" name="texte" value="Nb colonnes" size="10" disabled="disabled"/></br>
<input type="text" name="nb_lignes" value="7" size="10"/> <input type="text" name="nb_colonnes" value="14" size="10"/></br></br>

<?php if ((isset($_POST['nb_lignes'])) and (isset($_POST['nb_colonnes'])))
{
for ($i=1; $i <= $_POST['nb_lignes'] ; $i++)
{
for ($j=1; $j <= $_POST['nb_colonnes'] ; $j++)
{
?> <input type="text" size="7" name="<?php echo 'case[' . $i . ';' . $j . ']';?>" value="<?php echo 'case[' . $i . ';' . $j . ']';?>" /><?php
}
?></br><?php
}?>
</br></br>
<input type="text" name="texte" value="Case_i" size="10" disabled="disabled"/> <input type="text" name="texte" value="Case_j" size="10" disabled="disabled"/></br>
<input type="text" name="case_i" value="3" size="10"/> <input type="text" name="case_j" value="4"size="10"/></br></br>
<?php if ((isset($_POST['case_i'])) and (isset($_POST['case_j'])))
{
$case_i=$_POST['case_i'];
$case_j=$_POST['case_j'];
echo 'Le contenu de la case[' . $_POST['case_i'] . ';' . $_POST['case_j'] . '] est : ' . $_POST['case[' . $case_i . ';' . $case_j .']'] ;
?></br></br><?php
}
}?>
<input type="reset" value="Réinitialiser"/> <input type="submit" value="Valider"/>
</p>
</form>

Mais impossible de savoir ce qu'il y a dans cette case[3;4] ??
Par contre je ne trouve pas mon code très clair avec toutes ces balise php, il n'existe pas de moyen de faire un formulaire entièrement en php (sans echo) de sorte à avoir un code transparent et invisible ?

Merci pour l'aide ;)
0