Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Formulaire et tableaux

4 réponses
Avatar
Toto
Bjr,

J'ai réalisé un formulaire à champ unique qui après chaque validation
réaffiche les saisies précédentes
suivies d'un champ vide permettant une nouvelle saisie.

J'utilise un tableau - $saisie_article[], nom du champ - que je remplis
par les valeurs des saisies effectuées
- tableau $article, valeur du champ.

Le traitement consiste à afficher le nombre et la valeur des saisies
effectuées.


J'aimerai maintenant effectué la même chose avec ... 2 champs!


A l'affichage, la valeur du 1er champ - $ref_article - n'est pas
reconnue par mon double foreach pour balayer le tableau :
syntaxe en cause ou il faut faire autrement?

Dans le traitement, cette valeur n'est bien entendu pas reconnue non
plus.


J'aimerai en fait traiter le problème à l'aide d'un tableau associatif,
pour permettre par exemple la saisie du nom
d'un produit et de sa quantité, à l'aide d'une déclaration du genre:

$saisie_article = array("nom" => array(), "qt" => array());


Ci - dessous mon code, merci pour vos remarques.
Toto.

Je laisse en commentaires les déclarations et instructions relatives à
la 1ère version et précédées de:
// // V1champ ok : un champ unique de saisie


traiter.php:
--------------------------------------------------------
<?php

// initialise les variables

// V1champ ok : un champ unique de saisie
// $saisie_article[] = ""; // saisies
postées via formulaire
// $article = array(); // vide,
destiné à recevoir les saisies


// V2champs
$saisie_article[][] = "";
$ref_article = array();
$valeur = array();

$nb_art = 0; // compteur sur nombre de saisie


// Récup variables formulaire

$ajout_art = $_REQUEST['ajout_art']; // recup nom bouton de
validation


switch ($ajout_art){ // si validation

case "Ajout": // Réferencer article supplémentaire


// recup et affichage variables postées

// V1champ ok : un champ
unique de saisie
//foreach
($_POST['saisie_article'] as $article){
//echo 'ajout de
'.$article.'<br><br>';}




foreach($_POST['saisie_article'] as
$ref_article){

foreach ($ref_article as
$valeur){

echo 'ajout de
'.$valeur.'<br><br>';
}
}

$nb_art = $_REQUEST['nb_art'];

$nb_art++; // incrémentation compteur
nombre de saisie

break;

default:
}


// Afficher formulaire

include('afficher.php');

echo $nb_art.' articles ajoutés'; // test affichage compteur

?>


afficher.php:
--------------------------------------------------------------------
<table>

<form name="devis_modif" method="post" action="<?php
echo $_SERVER['PHP_SELF']; ?>">

<tr>

<td>Article :</td>
<td>Quantité :</td>

</tr>




<?php if (isset($saisie_article) &
!empty($saisie_article)){


// V1champ ok : un
champ unique de saisie

//foreach($saisie_article as $article){ ?>

<!-- <tr>

<td><input type="text" name="saisie_article[]" value="<?php echo
$article; ?>" size="30" maxlength="35"></td>

</tr>

-->
<?php // }}
?>


<?php
// V2champs

foreach($saisie_article as $ref_article){

foreach ($ref_article as
$valeur){ ?>


<tr>
<td><input type="text"
name="saisie_article[][]" value="<?php echo $ref_article; ?>" size="30"
maxlength="35"></td>
<td><input type="text"
name="saisie_article[][]" value="<?php echo $valeur; ?>" size="30"
maxlength="35"></td>
</tr>

<?php }
}
} ?>


<tr>

<td>Ajouter un article</td>


<!-- Référencer un autre article -->

<td>
<input type="hidden" name="nb_art" value="<?php
echo $nb_art; ?>">

<input type="submit" name="ajout_art"
value="Ajout">
</td>

</tr>

</form>

</table>

4 réponses

Avatar
Olivier Miakinen

J'utilise un tableau - $saisie_article[], nom du champ - que je remplis
par les valeurs des saisies effectuées
- tableau $article, valeur du champ.


Ok.

J'aimerai maintenant effectué la même chose avec ... 2 champs!


Eh bien utilise deux tableaux, non ?

Ci - dessous mon code, merci pour vos remarques.


Ton code est assez illisible. Ce serait mieux si toutes les lignes
étaient d'une longueur inférieure 70 caractères, afin que ton nouvelleur
ne les coupe pas. Tu peux aussi mettre un fichier sur http://cjoint.com
ou autre, et ne mettre ici que le lien (mais c'est un pis-aller car il
devient plus difficile de te répondre).

<?php

// initialise les variables

// V1champ ok : un champ unique de saisie
// $saisie_article[] = ""; // saisies
postées via formulaire


Sais-tu que ceci n'initialise pas le tableau à zéro, mais crée une
nouvelle entrée dans le tableau, entrée égale à une chaîne vide ?

// V2champs
$saisie_article[][] = "";


Et là, par contre, j'aimerais bien savoir ce qu'en fait l'interpréteur
PHP. J'aurais parié pour une erreur de syntaxe.

<td><input type="text"
name="saisie_article[][]" value="<?php echo $ref_article; ?>" size="30"
maxlength="35"></td>
<td><input type="text"
name="saisie_article[][]" value="<?php echo $valeur; ?>" size="30"
maxlength="35"></td>


Moi j'aurais bien vu name="saisie_article[]" pour le premier et
name="saisie_valeur[]" pour le second. En tout cas, je ne vois
pas comment PHP pourra choisir les *deux* index d'un tableau de
tableaux si tu mets « [][] » au lieu de « [] ».

Avatar
Toto
// $saisie_article[] = "";

Sais-tu que ceci n'initialise pas le tableau à zéro, mais crée une
nouvelle entrée dans le tableau, entrée égale à une chaîne vide ?

Oui, cela me permet d'afficher une ligne vide de saisie au
1er appel du formulaire.




// V2champs
$saisie_article[][] = "";

Et là, par contre, j'aimerais bien savoir ce qu'en fait l'interpréteur
PHP. J'aurais parié pour une erreur de syntaxe.

Au 1er appel du formulaire, j'ai "Array" d'afficher ds le 1er
champ et le 2nd champ est vide : la variable $ref_article


déclarée et initialisée comme étant un tableau vide n'est
pas reconnue - ce qui rejoins le pbm d'index dont tu parles -
et le 2nd champ est vide : la variable $valeur déclarée et
initialisée comme étant un tableau vide est reconnue.

J'effectue alors une saisie: je remplis le 1er champ avec "titi"
- après avoir effacé Array - en voulant donc affecter cette valeur
à $ref_article.
Je remplis le 2nd champ avec "toto", en voulant donc affecter
cette valeur à $valeur.

Après validation, au lieu d'obtenie une ligne préremplie avec titi puis
toto j'obtiens deux lignes avec Array ds le 1er champ et
toto ds le second.

On est d'accord sur le problème: j'essaie donc en nommant
les deux champs différemment, ce qui revient comme tu le dis à
travailler avec deux tableaux.

En outre comment travailler avec des tableaux associatifs?

Cela serait plus souple: je référence des articles qui possèdent
plus de deux caractéristiques :-).

J'effectue alors cette déclaration :
$saisie_article = array("nom" => array(), "qt" => array());
Parcourir un tableau de ce type préalablement rempli ne me pose
pas de problème.
Mon souci est de le remplir à l'aide des saisies du formulaire.

Je me permet de reposter mon code .... avec une meilleure lisibilité?

Merci, Toto.
On commence par appeler "traiter.php" ds lequel est inclus
le formulaire.

traiter.php:
--------------------------------------------------------
<?php

// initialise les variables

// V1champ ok : un champ unique de saisie
// $saisie_article[] = ""; // saisies postées via formulaire
// $article = array(); // vide, destiné à recevoir les saisies


// V2champs
$saisie_article[][] = "";
$ref_article = array();
$valeur = array();

$nb_art = 0; // compteur sur nombre de saisie


// Récup variables formulaire

$ajout_art = $_REQUEST['ajout_art'];// recup nom bouton de validation


switch ($ajout_art){ // si validation

case "Ajout": // Réferencer article supplémentaire


// recup et affichage variables postées

// V1champ ok : un champ unique de saisie
//foreach ($_POST['saisie_article'] as $article){
//echo 'ajout de '.$article.'<br><br>';}




foreach($_POST['saisie_article'] as $ref_article){

foreach ($ref_article as $valeur){

echo 'ajout de '.$valeur.'<br><br>';
}
}

$nb_art = $_REQUEST['nb_art'];

$nb_art++; //incrémentation compteur nombre de saisie

break;

default:
}


// Afficher formulaire

include('afficher.php');

echo $nb_art.' articles ajoutés'; // test affichage compteur

?>


afficher.php:
----------------------------------------------------------------
<table>

<form name="devis_modif" method="post"
action="<?php echo $_SERVER['PHP_SELF']; ?>">

<tr>

<td>Article :</td>
<td>Quantité :</td>

</tr>




<?php if (isset($saisie_article) & !empty($saisie_article)){


// V1champ ok : un champ unique de saisie
//foreach($saisie_article as $article){ ?>
<!-- <tr>
<td><input type="text" name="saisie_article[]"
value="<?php echo $article; ?>" size="30" maxlength="35">
</td>
</tr>
-->
<?php // }} ?>



<?php
// V2champs

foreach($saisie_article as $ref_article){

foreach ($ref_article as $valeur){ ?>


<tr>
<td><input type="text" name="saisie_article[][]"
value="<?php echo $ref_article; ?>" size="30" maxlength="35">
</td>

<td><input type="text" name="saisie_article[][]"
value="<?php echo $valeur; ?>" size="30" maxlength="35">
</td>
</tr>

<?php }
}
} ?>


<tr>

<td>Ajouter un article</td>


<!-- Référencer un autre article -->

<td>
<input type="hidden" name="nb_art" value="<?php echo $nb_art; ?>">

<input type="submit" name="ajout_art" value="Ajout">
</td>

</tr>

</form>

</table>


Avatar
Olivier Miakinen

// $saisie_article[] = "";

Sais-tu que ceci n'initialise pas le tableau à zéro, mais crée une
nouvelle entrée dans le tableau, entrée égale à une chaîne vide ?


Non, ça ce n'est pas toi qui l'a écrit, c'est moi.

Oui, cela me permet d'afficher une ligne vide de saisie au




Ici au contraire ce n'est pas celui à qui tu réponds qui l'a écrit (plus
de chevrons), c'était bien toi.

1er appel du formulaire.


Et là, c'est bien toi qui l'a écrit, mais c'est la même phrase qui continue.

Bref... je sais que même Outlook Express est capable de citer à peut
près correctement, le nombre de chevrons correspondant au niveau de
citation (surtout si on lui adjoint OE Quotefix), merci d'essayer de le
configurer comme il faut pour cela.

[...]

Je me permet de reposter mon code .... avec une meilleure lisibilité?


Un peu, oui. Mieux indenté et avec moins de sauts de ligne ce serait
encore mieux, mais déjà on y voit un peu plus clair.

$saisie_article[][] = "";


Je t'ai déjà signalé que c'était forcément du code faux.

<td><input type="text" name="saisie_article[][]"


Et ça aussi. Commence par nettoyer un peu tout ça, au besoin relis la
doc, et ensuite tu pourras revenir poser des questions si jamais tu
n'avais pas fini par tout résoudre seul.

Voir en particulier les deux liens suivants qui devraient répondre à la
plupart de tes questions (y compris les tableaux associatifs) :
<http://www.php.net/manual/fr/language.types.array.php>
<http://www.php.net/manual/fr/faq.html.php#faq.html.arrays>



Avatar
Florian Sinatra
*Olivier Miakinen* @ 18/11/2006 01:58 :
$saisie_article[][] = "";


Je t'ai déjà signalé que c'était forcément du code faux.


Faux, conceptuellement peut-être, mais pas syntaxiquement :

$a = array();
$a[][] = "foo";
$a[][] = "bar";
print_r($a);

donne :

Array
(
[0] => Array
(
[0] => foo
)

[1] => Array
(
[0] => bar
)

)