[php] Probleme dans un while

Fermé
klomera - 19 janv. 2010 à 13:40
 klomera - 19 janv. 2010 à 16:25
Bonjour, à tous mon soucis est sous chaque bouton modifier, il aura un champ qui apparaitra pour changer le nom, soit la photo ou enfin le descriptif, le soucis est que quand je clique sur les boutons modifiés de la première ligne les champs apparaissent bien sous chaque bouton mais quand je clique sur un bouton modifié de la deuxième ligne, le champ apparait en dessous du bouton modifier de la première ligne alors qu'il devrai apparaitre sous le bouton modifier de la deuxième ligne :( voici mon bout de code ==>


<?php

$requeteB = mysql_query("SELECT * FROM univers");
$rowB = mysql_num_rows($requeteB);
if ($rowB == 0) echo '';
else {


while ($resultatB = mysql_fetch_assoc($requeteB)){
?>

<tr>
<td><div align="center"><?php echo $resultatB['nom'];?> </br><input type="submit" name="modifierA" value="Modifier" OPTION VALUE="modifA" onclick="afficher('modifA','modifB','modifC')"> </br>
<div id="modifA" style="display: none">
<input type="text" name="qtéinitial" size=" 10" maxlength="20" /><br />
</div></div>
</td>


<?php $photo = $resultatB['photo'] ; ?>
<td><div align="center"><?php echo " <IMG SRC='../mini/$photo'>" ;?> </br><input type="submit" name="modifierB" value="Modifier" OPTION VALUE="modifB" onclick="afficher('modifB','modifA','modifC')"> </br>
<div id="modifB" style="display: none">
<input type="file" name="mon_image" /><br />
</div></div>
</td>

<td><div align="center"><?php echo $resultatB['descriptif']; ?> </br><input type="submit" name="modifierC" value="Modifier" OPTION VALUE= "modifC" onclick="afficher('modifC','modifA','modifB')"> </br>
<div id="modifC" style="display: none">
<textarea name="mon_descriptif" id="mon_descriptif" cols="30" rows="5" style="width:250px" ></textarea>
<div id="descriptif"></div>
</div></div>
</td>

</tr>

<?php }} ?>

</table>
A voir également:

15 réponses

Bonjour

Le champ texte de ta première colonne s'appelle modifA. Mais il a le même nom sur toutes les lignes : tu as donc plusieurs champs texte qui ont le même nom. Quand tu essayes d'en rendre un visible, javascript ne connaît apparemment que le premier (il ne peut pas associer le même nom à plusieurs objets)
Une solution c'est de différencier les noms en ajoutant par exemple un numéro que tu incrémentes à chaque boucle : tes champs vont s'appeler modifA1,modifB1,modifC1 et sur la ligne suivante modifA2,modifB2,modifC2, etc... Il faut également adapter le onclick en conséquence
0
Tu pourrais me donner un exemple stp =)
0
Tu dit ==> Une solution c'est de différencier les noms en ajoutant par exemple un numéro que tu incrémentes à chaque boucle , mais je n'est pas de boucle pour cela et si j'en crée une est-ce que je peut faire ceci ?

for($i=1; $i<$resultatB; $i++)

la je prend juste un exemple,

<tr>
<td><div align="center"><?php echo $resultatB['nom'];?> </br><input type="submit" name="modifierA" value="Modifier" OPTION VALUE="modifA[$i]" onclick="afficher('modifA','modifB','modifC')"> </br>
<div id="modifA[$i]" style="display: none">
<input type="text" name="qtéinitial" size=" 10" maxlength="20" /><br />
</div></div>
</td>
0
$k=1
while ($resultatB = mysql_fetch_assoc($requeteB)){
?>

<tr>
<td><div align="center"><?php echo $resultatB['nom'];?> </br><input type="submit" name="modifierA" value="Modifier" OPTION VALUE="modifA" onclick="afficher('modifA<?php echo $k ?>','modifB<?php echo $k ?>','modifC<?php echo $k ?>')"> </br>
<div id="modifA<?php echo $k ?>" style="display: none">
<input type="text" name="qtéinitial" size=" 10" maxlength="20" /><br />
</div></div>
</td>
...
<?php
$k++
} // while
0
voici mon nouveau code avec ton aide, cela fonction mais mise a par que quand je clique sur le bouton modifier de la deuxième ligne, le champ s'affiche bien mais si je fait de même pour la premiere ligne le champ du dessous reste il ne disparait pas.


while ($resultatB = mysql_fetch_assoc($requeteB)){
?>

<tr>
<td><div align="center"><?php echo $resultatB['nom'];?> </br><input type="submit" name="modifierA <?php echo $i; ?>" value="Modifier" OPTION VALUE="modifA<?php echo $i; ?>" onclick="afficher('modifA<?php echo $i; ?>','modifB<?php echo $i; ?>','modifC<?php echo $i; ?>')"> </br>
<div id="modifA<?php echo $i; ?>" style="display: none">
<input type="text" name="qtéinitial" size=" 10" maxlength="20" /><br />
</div></div>
</td>


<?php $photo = $resultatB['photo'] ; ?>
<td><div align="center"><?php echo " <IMG SRC='../mini/$photo'>" ;?> </br><input type="submit" name="modifierB <?php echo $i; ?>" value="Modifier" OPTION VALUE="modifB<?php echo $i; ?>" onclick="afficher('modifB<?php echo $i; ?>','modifA<?php echo $i; ?>','modifC<?php echo $i; ?>')"> </br>
<div id="modifB<?php echo $i; ?>" style="display: none">
<input type="file" name="mon_image" /><br />
</div></div>
</td>

<td><div align="center"><?php echo $resultatB['descriptif']; ?> </br><input type="submit" name="modifierC<?php echo $i; ?>" value="Modifier" OPTION VALUE= "modifC<?php echo $i; ?>" onclick="afficher('modifC<?php echo $i; ?>','modifA<?php echo $i; ?>','modifB<?php echo $i; ?>')"> </br>
<div id="modifC<?php echo $i; ?>" style="display: none">
<textarea name="mon_descriptif" id="mon_descriptif" cols="30" rows="5" style="width:250px" ></textarea>
<div id="descriptif"></div>
</div></div>
</td>

</tr>

<?php $i++; }} ?>

</table>
0

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

Posez votre question
Ça vient sûrement de ta fonction afficher. Tu ne la montres pas, mais je parie qu'elle est prévue pour montrer un champ mais pas pour cacher les autres Ou alors, seulement ceux donnés en 2ème et 3ème paramètre.
0
Voici ma fonction :

<script language="javascript">
function afficher(f,f2,f3)
{

document.getElementById(f).style.display = 'block';
document.getElementById(f2).style.display = 'none';
document.getElementById(f3).style.display = 'none';

}
</script>
0
Je m'en doutais un peu. Cette fonction n'est pas adaptée, elle ne marche qu'avec un nombre fixe de champs.
Pour t'en sortir, il suffit de mémoriser dans une variable globale (pas très propre, mais bon..) le dernier champ affiché et de n'effacer que lui. Du coup, tes paramètres f2 et f3 sont inutiles, tu peux les supprimer. Ne pas oublier de les supprimer aussi dans les 'onclick'

<script language="javascript">
var dernier_champ = ''; // aucun champ affiché au départ
function afficher(f)
{
if (f!= dernier_champ) {
document.getElementById(f).style.display = 'block'; // on affiche le nouveau
document.getElementById(dernier_champ).style.display = 'none'; // on efface l'ancien
dernier_champ=f; // on se rappelle lequel est affiché, pour l'effacer plus tard
}

}
</script>
0
je remplace ma fonction et par la tienne et je supprime mes onclick ?
0
Maintenant j'ai ceci mais maintenant quand j'appuie sur chaque bouton, les champs apparaissent mais ne se cache plus, ils restent en permanences. La fonction ==>

<script language="javascript">
var dernier_champ = ''; // aucun champ affiché au départ
function afficher(f)
{
if (f!= dernier_champ) {
document.getElementById(f).style.display = 'block'; // on affiche le nouveau
document.getElementById(dernier_champ).style.display = 'none'; // on efface l'ancien
dernier_champ=f; // on se rappelle lequel est affiché, pour l'effacer plus tard
}

}
</script>

puis le code ==>

while ($resultatB = mysql_fetch_assoc($requeteB)){
?>

<tr>
<td><div align="center"><?php echo $resultatB['nom'];?> </br><input type="submit" name="modifierA <?php echo $i; ?>" value="Modifier" OPTION VALUE="modifA<?php echo $i; ?>" onclick="afficher('modifA<?php echo $i; ?>')"> </br>
<div id="modifA<?php echo $i; ?>" style="display: none">
<input type="text" name="qtéinitial" size=" 10" maxlength="20" /><br />
</div></div>
</td>


<?php $photo = $resultatB['photo'] ; ?>
<td><div align="center"><?php echo " <IMG SRC='../mini/$photo'>" ;?> </br><input type="submit" name="modifierB <?php echo $i; ?>" value= "Modifier" OPTION VALUE="modifB<?php echo $i; ?>" onclick="afficher('modifB<?php echo $i; ?>')"> </br>
<div id="modifB<?php echo $i; ?>" style="display: none">
<input type="file" name="mon_image" /><br />
</div></div>
</td>

<td><div align="center"><?php echo $resultatB['descriptif']; ?> </br><input type="submit" name="modifierC<?php echo $i; ?>" value= "Modifier" OPTION VALUE="modifC<?php echo $i; ?>" onclick="afficher('modifC<?php echo $i; ?>')"> </br>
<div id="modifC<?php echo $i; ?>" style="display: none">
<textarea name="mon_descriptif" id="mon_descriptif" cols="30" rows="5" style="width:250px" ></textarea>
<div id="descriptif"></div>
</div></div>
</td>

</tr>

<?php $i++; }} ?>

</table>
0
help me =(
0
Ah bon, qu'est-ce que je fais selon toi ?

document.getElementById(dernier_champ).style.display = 'none'; // on efface l'ancien
cette ligne plante la première fois car dernier_champ est vide
donc dernier_champ reste vide
donc cette ligne plante toujours
Il suffit de ne pas l'exécuter quand dernier_champ est vide

if (dernier_champ!='') document.getElementById(dernier_champ).style.display = 'none'; // on efface l'ancien

J'ai remarqué au passage que tu avais laissé trainer un espace en trop dans name="modifierA <?php echo $i; ?>", mais vu que ce nom ne semble servir à rien, ce n'est peut-être pas grave
0
Oui justement ce que j'ai fait c'est que j'ai remplacer ma fonction par la tienne donc la je comprend maintenant dans mes 'Onclick' j'ai juste :
onclick="afficher('modifA<?php echo $i; ?>')"

au lieu de :

onclick="afficher('modifA<?php echo $i; ?>','modifB<?php echo $i; ?>','modifC<?php echo $i; ?>')"

et donc le soucis c'est que les champ reste en permanences.
0
Tu as compris mon message 12 ? et surtout appliqué la modification ?
J'ai essayé chez moi, ça marche.
0
Donc j'ai ceci ? j'ai un peu de mal à comprendre. :s
0
<script language="javascript">
var dernier_champ = ''; // aucun champ affiché au départ
function afficher(f)
{
if (dernier_champ!='') document.getElementById(dernier_champ).style.display = 'none'; // on efface l'ancien {
document.getElementById(f).style.display = 'block'; // on affiche le nouveau
document.getElementById(dernier_champ).style.display = 'none'; // on efface l'ancien
dernier_champ=f; // on se rappelle lequel est affiché, pour l'effacer plus tard
}

}
</script>
0
C BON !!!!!! merci infiniment Le pere tu assure MERCIIIIIII j'allait mourir la ^^
0