8791 sujets

Développement web côté serveur, CMS

Pages :
Bonjour,

Je suis entrain de développer un petit site web et j'ai un souci pour des formulaires en lien avec une bdd.

Ci-joint mon code :

<?php
    mysql_connect("127.0.0.1", "root", "" );
    mysql_select_db("pronos" );
    ?>
    <table width="75%" border="2" bordercolor="#000000" bgcolor="#d5213e" align="center">
    <tr width="100%">
    <td align="center" colspan="6"><p><font color="#FFFFFF" size="5" face="Calibri"><strong>Panneau de modification Bonus</strong></font></p></td>
    </tr>
    <tr>
    <td border="2" style="width:40px;" align="center"><font color="#FFFFFF" size="4" face="Calibri"><strong>N°</strong></font></td>
    <td border="2" style="width:160px;" align="center"><font color="#FFFFFF" size="4" face="Calibri"><strong>Bonus</strong></font></td>
    <td border="2" style="width:160px;" align="center"><font color="#FFFFFF" size="4" face="Calibri"><strong>Choix</strong></font></td>
    </tr>   
    </table>               
    <?php
    $req1 = mysql_query("SELECT resbonus.numb,desbonus,bonusj FROM joueurs, resbonus, bonus WHERE resbonus.numb=bonus.numb AND resbonus.numj=joueurs.numj AND prenom='$login'" );                             
    $reqliste = mysql_query("SELECT equipes FROM liste" );     
    ?>
    <form method="post" action="updatepronosb.php">
    <?php       
    for ($i = 1 ; $i <=6 ; $i++)
    {
    $donnees = mysql_fetch_assoc($req1);
   
    ?>       
    <table width="75%" border="3" bordercolor="#000000" bgcolor="#3a75c5" align="center" valign="center">
    <tr>
    <td border="2" style="width:40px;" align="center"><font color="#FFFFFF" size="4"><strong><input readonly type="text" style="text-align:center;color:#FFFFFF;background:#3a75c5" size="1" name="<?php echo "demnumb".$i; ?>" value="<?php echo $donnees['numb']; ?>"></strong></font></td>
    <td border="2" style="width:160px;" align="center"><font color="#FFFFFF" size="4"><strong><?php echo $donnees['desbonus']; ?></strong></font></td>
    <td border="2" style="width:160px;" align="center"><font color="#FFFFFF" size="4"><strong><select name="<?php echo "dembonusj".$i; ?>"><?php while($liste = mysql_fetch_array($reqliste)) { echo "<option>".$liste['equipes']."</option>\n";} ?></select></strong></font></td>
    </tr>   
    </table>             
    <?php
    }
    ?>
    <br>
    <p align="center"><input type="submit" style="align:center;" value="Valider"/></p></form>
    <?php     
    mysql_close();
    ?>



Mon problème concerne la ligne suivante :

<td border="2" style="width:160px;" align="center"><font color="#FFFFFF" size="4"><strong><select name="<?php echo "dembonusj".$i; ?>"><?php while($liste = mysql_fetch_array($reqliste)) { echo "<option>".$liste['equipes']."</option>\n";} ?></select></strong></font></td>



J'essaie de faire une liste déroulante en fonction d'une bdd, et le résultat de la liste doit être récupéré avec un POST sur une autre page. En l'état, pour $i=1 j'ai bien la liste déroulante ! Toutes les autres sont vides... Et bien sûr, le post n'est pas récupéré....

Merci de votre aide car je sèche....
Salut, j'ai comme l'impression que normalement tu devrais avoir un warning php.

Sur cette portion :

 <?php       
    for ($i = 1 ; $i <=6 ; $i++)
    {
    $donnees = mysql_fetch_assoc($req1);
    ?> 


J'aurais plutôt vu ceci :


 <?php    
$donnees = mysql_fetch_assoc($req1);   
    for ($i = 1 ; $i <=6 ; $i++)
    {
    ?> 


La ressource étant déjà donnée une fois, je ne sais pas si MYSQL te dis OK pour les 5 fois supplémentaire.

Ce qui expliquerais que pour $i=1 fonctionne, mais plus après.

Ensuite, SVP, indente le code car c'est illisible en l'état ! (Les commentaires ne tuent pas non plus =) )
Si je le laisse pas "$donnees" dans la boucle for, il renvoi toujours le bonus "1" ! Et je n'ai aucun warning php, tout fonctionne de ce côté là sur mes autres pages.

Par contre, comment faire le "indente le code" !?

Aucune idée pour la partie liste déroulante ? Smiley bawling
Définition d'Indenter (recherche google)

Ton code ne me semble pas bon, je ne vois pas en quoi la variable $i impacte ta requête SQL.

Le souci est ailleurs.

Concernant ta liste déroulante, vu que c'est toujours la même que tu sers à chaque fois, autant la généré une fois pour toute, et la réutiliser 5 fois !

Voici le code que je sors (commenté et indenté)

<?php
//Généré la liste des équipe
$liste_select = (isset($liste_select)) ? FALSE: $liste_select; //Si la variable n'est pas définis, la définir, sinon, elle reste à l'état précèdent
$reqliste = mysql_query("SELECT equipes FROM liste"); // Selectionner la liste des équipe
while($liste = mysql_fetch_array($reqliste)) // Générer la liste des équipes avec le résultat de ma requête
	{
	$liste_select.= '<option value="'.$liste['equipes'].'">'.$liste['equipes'].'</option>'."\n";
	}
$req1 = mysql_query("SELECT resbonus.numb, desbonus, bonusj FROM joueurs, resbonus, bonus WHERE resbonus.numb=bonus.numb AND resbonus.numj=joueurs.numj AND prenom='".$login."'" );
$donnees = mysql_fetch_assoc($req1); 

echo '<form method="post" action="updatepronosb.php">'."\n";

for($i = 1; $i <= 6; $i++)
	{
	?>       
	<table width="75%" border="3" bordercolor="#000000" bgcolor="#3a75c5" valign="center">
		<tr>
			<td border="2" style="width:40px;">
				<font color="#FFFFFF" size="4">
					<strong>
						<input readonly type="text" style="text-align:center;color:#FFFFFF;background:#3a75c5" size="1" <?php echo 'name="demnumb'.$i.'" value="'.$donnees['numb'].'"'; ?>>
					</strong>
				</font>
			</td>
			<td border="2" style="width:160px;">
				<font color="#FFFFFF" size="4">
					<strong>
						<?php echo $donnees['desbonus']; ?>
					</strong>
				</font>
			</td>
			<td border="2" style="width:160px;">
				<font color="#FFFFFF" size="4">
					<strong>
						<?php echo '<select name="dembonusj'.$i.'">'.$liste_select.'</select>'; ?>
					</strong>
				</font>
			</td>
		</tr>   
	</table>             
	<?php
	}
?>


Je te conseille fortement, après la résolution de ton problème, de reprendre la base HTML + CSS car ... c'est du grand n'importe quoi !!! (la mise en forme par tableau ... pas ainsi, le style sur chaque balise ... bref, pour maintenir, et lire ça, c'est vraiment pas simple).

Ce sont des critiques oui, mais c'est pour te faire avancer, dans le bon sens, celui des standards du web =)
Pas de souci pour les critiques, surtout quand elles sont constructives! Et déjà, je te remercie de passer du temps sur mon problème.

Pour la partie CSS/HTML, je dois reprendre tout ça, tu n'es pas le premier à me le dire Smiley lol

Par contre, si j'utilise ton code en l'état, il m'affiche 6 fois le bonus 1. voilà pourquoi je mets $donnes dans le while.

Il manque le bouton submit, je le rajoute, même pour la ligne 1, ce n'est pas pris en compte dans la base. Normalement, c'est "dembonusj'.$i.'" qui est récupéré avec la méthode POST.

Sinon, la liste déroulante est bonne, elle remonte bien les équipes disponibles dans la base.

Pour indenter, c'est le cas sur mon code, j'ai déconné au copié collé lol

Encore merci ! Smiley cligne
Modifié par orygynz (15 Mar 2012 - 21:50)
Pour info, ce code sans liste déroulante fonctionne sans aucun souci (voir poste au-dessus Smiley lol )

<?php
				$req1 = mysql_query("SELECT resbonus.numb,desbonus,bonusj FROM joueurs, resbonus, bonus WHERE resbonus.numb=bonus.numb AND resbonus.numj=joueurs.numj AND prenom='$login'");																
				?>
				<form method="post" action="updatepronosb.php">
				<?php 				
				for ($i = 1 ; $i <=6 ; $i++)
				{
				$donnees = mysql_fetch_assoc($req1);
					?>    			
					<table width="75%" border="3" bordercolor="#000000" bgcolor="#3a75c5" align="center" valign="center">
					<tr>
					<td border="2" style="width:40px;" align="center"><font color="#FFFFFF" size="4"><strong><input readonly type="text" style="text-align:center;color:#FFFFFF;background:#3a75c5" size="1" name="<?php echo "demnumb".$i; ?>" value="<?php echo $donnees['numb']; ?>"></strong></font></td>
					<td border="2" style="width:160px;" align="center"><font color="#FFFFFF" size="4"><strong><?php echo $donnees['desbonus']; ?></strong></font></td>
					<td border="2" style="width:160px;" align="center"><font color="#FFFFFF" size="4"><strong><input type="text" style="text-align:center;color:#FFFFFF;background:#3a75c5" size="20" name="<?php echo "dembonusj".$i; ?>" value="<?php echo $donnees['bonusj']; ?>"></strong></font></td>
					</tr>			
					</table>								
					<?php
					
				}
				?>
				<br>
				<p align="center"><input type="submit" style="align:center;" value="Valider"/></p></form>
				<?php				
				mysql_close();
				?>	

Modifié par orygynz (15 Mar 2012 - 21:58)
Le problème initial est résolu, c'est déjà ça.

Pour la suite, il doit manquer des informations alors, car je ne vois pas pourquoi cette requête SQL est impacté par ta boucle FOR

SELECT resbonus.numb,desbonus,bonusj FROM joueurs, resbonus, bonus WHERE resbonus.numb=bonus.numb AND resbonus.numj=joueurs.numj AND prenom='$login'"


Ici la seule variable est $login, donc le le $i de la boucle ne change rien, à moins que ça vienne d'ailleurs mais j'ai du mal à saisir (surtout que l'on utilise pas là même manière de concaténer les variable)
bah le $i permet d'afficher les pronos bonus 1 par 1 ! $i= 1 puis 2 puis 3 jusqu'à 6 !

Ensuite, dans un autre fichier, avec la méthode POST, il est récupéré avec la même méthode ! Ce la permet à la personne de pronostiquer les 6 lignes de bonus.

Alors ça affiche que la ligne 1 (6 fois) ! Donc problème en partie résolu
Modifié par orygynz (15 Mar 2012 - 22:25)
Je pensais être simple Smiley biggrin

Déjà, je pense qu'il faut mieux relire le script initial avec un formulaire sans liste déroulante ! (voir 3 postes au-dessus qui commence "pour informations")

Ensuite, un joueur se connecte au site, il va sur la page de code que j'ai posté et un tableau s'affiche avec 6 pronostics bonus (ex: Meilleure attaque, meilleur défense, etc...).
Le tableau a 3 colonnes (Numéro Bonus, Désignation, Prono du joueur)
Numéro Bonus et Désignation apparaissent en interrogeant une base mysql, c'est $req1.

Pour pouvoir afficher les 6 bonus, je suis obligé d'utiliser une boucle For de 1 à 6 avec un compteur $i.

Ensuite, une fois que le joueur a validé avec le Submit, l'autre page récupère dembonusj.$i et intègre les pronos de l'utilisateur dans une autre base (sur 6 lignes de table grâce au compteur).

Etant donné que je vais comparer les chaines de caractères, je préférais mettre en place une liste de sélection pour éviter les fautes de frappes, etc....
Voilà pourquoi j'ai créé $reqliste qui va interroger une autre table avec la liste d'équipe.

J'espère que c'est plus clair ! Smiley lol
On m'a proposé ça sur un autre forum :

<?php
 mysql_connect("127.0.0.1", "root", "" );
 mysql_select_db("pronos" );
 ?>
 <table width="75%" border="2" bordercolor="#000000" bgcolor="#d5213e" align="center">
 <tr width="100%">
 <td align="center" colspan="6"><p><font color="#FFFFFF" size="5" face="Calibri"><strong>Panneau de modification Bonus</strong></font></p></td>
 </tr>
 <tr>
 <td border="2" style="width:40px;" align="center"><font color="#FFFFFF" size="4" face="Calibri"><strong>N°</strong></font></td>
 <td border="2" style="width:160px;" align="center"><font color="#FFFFFF" size="4" face="Calibri"><strong>Bonus</strong></font></td>
 <td border="2" style="width:160px;" align="center"><font color="#FFFFFF" size="4" face="Calibri"><strong>Choix</strong></font></td>
 </tr>   
 </table>               
 <?php
 $req1 = mysql_query("SELECT resbonus.numb,desbonus,bonusj FROM joueurs, resbonus, bonus WHERE resbonus.numb=bonus.numb AND resbonus.numj=joueurs.numj AND prenom='$login'" );                             
 $reqliste = mysql_query("SELECT equipes FROM liste" );
 //je stocke cette requête dans un tableau   
   $equipe=array();
   while($liste = mysql_fetch_array($reqliste))
   { 
      $equipe[]=$liste['equipes'];
   }
 ?>
 <form method="post" action="updatepronosb.php">
 <?php       
 for ($i = 1 ; $i <=6 ; $i++)
 {
 $donnees = mysql_fetch_assoc($req1);

 ?>       
 <table width="75%" border="3" bordercolor="#000000" bgcolor="#3a75c5" align="center" valign="center">
 <tr>
 <td border="2" style="width:40px;" align="center"><font color="#FFFFFF" size="4"><strong><input readonly type="text" style="text-align:center;color:#FFFFFF;background:#3a75c5" size="1" name="<?php echo "demnumb".$i; ?>" value="<?php echo $donnees['numb']; ?>"></strong></font></td>
 <td border="2" style="width:160px;" align="center"><font color="#FFFFFF" size="4"><strong><?php echo $donnees['desbonus']; ?></strong></font></td>
 <td border="2" style="width:160px;" align="center"><font color="#FFFFFF" size="4"><strong><select name="<?php echo "dembonusj".$i; ?>">
   <?php foreach($equipe as $val) {
      echo "<option>".$val."</option>\n";
   } ?></select></strong></font></td>
 </tr>   
 </table>             
 <?php
 }
 ?>
 <br>
 <p align="center"><input type="submit" style="align:center;" value="Valider"/></p></form>
 <?php     
 mysql_close();
 ?>


ça fonctionne ! Y'a juste un souci, contrairement à mon code en formulaire text, la liste déroulante n'affiche plus le prono validé par le joueur si il vient le modifier....
Y'a un truc qui colle pas.

Ton select ne sert strictement à rien si les options n'ont pas de valeur.

Alors à quoi sert cette liste ?

Je m'explique :


<select name="monchamp">

<option value="valeur1">Texte associé valeur 1</option>
<option value="valeur2">Texte associé valeur 2</option>
<option value="valeur3">Texte associé valeur 3</option>

</select>


Si l'utilisateur sélectionne "Texte associé valeur 2", tu auras comme retour :

$_POST['monchamp'] = 'valeur2';


Sans value dans le champs option, tu devrais récupérer ceci :

$_POST['monchamp'] = '';


Autrement dis, retour vide, juste qu'une sélection à été faite ... pas vraiment utile.

La doc sur la balise SELECT : http://www.w3schools.com/tags/tag_select.asp

Ensuite, pourquoi stocké le résultat de la requête ? A part faire le boulot 3 fois (requête SQL + Boucle pour restocker le résultat déjà disponible + boucle pour afficher le résultat) ?

Le code que je t'ai donnée, donne le même résultat, mais avec une valeur sur chaque OPTION

$reqliste = mysql_query("SELECT equipes FROM liste");
while($liste = mysql_fetch_array($reqliste))
	{
	$liste_select.= '<option value="'.$liste['equipes'].'">'.$liste['equipes'].'</option>'."\n";
	}


D'ailleurs j'ai une question, pourquoi utiliser mysql_fetch_array() à la place de mysql_fetch_assoc() ?

Le fetch_array demande 2 fois plus de boulot côté SQL et PHP qu'un fetch_assoc, à moins d'indiquer le type de retour que tu souhaites avec le fetch_array (mais là je te laisse allez voir la documentation php pour voir ce dont je veux parler)
Modifié par Super_baloo8 (16 Mar 2012 - 23:26)
Juste pour rajouter, une page en ligne serait top pour vraiment comprendre, car j'ai toujours du mal sur ton système de pronostics.

Je suis sur qu'en 10/20 lignes de codes serait suffisant, et tout ça avec une seule requête SQL.
Modifié par Super_baloo8 (16 Mar 2012 - 23:28)
Y'a un truc que je comprends pas, le texte que j'ai posté fonctionne et remonte bien toutes les valeurs de la liste disponibles dans la base de données, pourtant tu dis que le résultat devrait être null ?

Et le problème de ton code, c'est qu'il remonte 6 fois le 1er bonus !

J'ai remplacé array par assoc et ça fonctionne Smiley cligne
Modifié par orygynz (16 Mar 2012 - 23:36)
Oui il devrait être "vide", mais en même temps, je n'ai jamais oublié ce genre d'attribut indispensable, donc il se peut que certain navigateur renvoie quand même une valeur ... mais ce n'est pas un fonctionnement "Standard".

C'est un peu comme ceci :

<input readonly ...


La bonne écriture en STRICT est :

<input readonly="readonly" ...


Mais ce n'est pas autant que la navigateur ne va pas le comprendre, ce n'est pas standard, mais ça fonctionne.
Oui je me doute... Mais comment apprendre ? Je comprends le truc.... Je connais mieux que le php d'autres logiciels et il accepte des trucs qui devraient être interdit...

Du coup moi je fais quoi ? Je veux bien utiliser ton code qui me semble plus optimisé mais il m'affiche 6 fois le bonus avec le numéro 1.
Je t'ai envoyé un message privé pour continuer la discussion hors forum, car les réponses trop rapide sur le forum ne sont vraiment pas simple à suivre.

As tu Gtalk ? (discussion instantanée en ligne)
J'ai comme l'impression que tu ne maitrise pas complètement le code.

Depuis le code que je t'ai donnée, j'ai juste remis ta 2ieme requête SQL là où tu la mettais (puisqu'à voir c'est ça qui pose soucis sans que je ne sache pourquoi pour l'instant).

Et je reste donc avec ton code de base, mais avec la liste préfaite :

<?php
//Généré la liste des équipe
$liste_select = (isset($liste_select)) ? FALSE: $liste_select; //Si la variable n'est pas définis, la définir, sinon, elle reste à l'état précèdent
$reqliste = mysql_query("SELECT equipes FROM liste"); // Selectionner la liste des équipe
while($liste = mysql_fetch_assoc($reqliste)) // Générer la liste des équipes avec le résultat de ma requête
	{
	$liste_select.= '<option value="'.$liste['equipes'].'">'.$liste['equipes'].'</option>'."\n";
	}
$req1 = mysql_query("SELECT resbonus.numb, desbonus, bonusj FROM joueurs, resbonus, bonus WHERE resbonus.numb=bonus.numb AND resbonus.numj=joueurs.numj AND prenom='".$login."'" );

echo '<form method="post" action="updatepronosb.php">'."\n";

for($i = 1; $i <= 6; $i++)
	{
	$donnees = mysql_fetch_assoc($req1); 
	?>       

	<table width="75%" border="3" bordercolor="#000000" bgcolor="#3a75c5" valign="center">
		<tr>
			<td border="2" style="width:40px;">
				<font color="#FFFFFF" size="4">
					<strong>
						<input readonly type="text" style="text-align:center;color:#FFFFFF;background:#3a75c5" size="1" <?php echo 'name="demnumb'.$i.'" value="'.$donnees['numb'].'"'; ?>>
					</strong>
				</font>
			</td>

			<td border="2" style="width:160px;">
				<font color="#FFFFFF" size="4">
					<strong>
						<?php echo $donnees['desbonus']; ?>
					</strong>
				</font>
			</td>

			<td border="2" style="width:160px;">
				<font color="#FFFFFF" size="4">
					<strong>
						<?php echo '<select name="dembonusj'.$i.'">'.$liste_select.'</select>'; ?>
					</strong>
				</font>
			</td>
		</tr>   
	</table>             
	<?php
	}
mysql_close();
?>
	<p align="center"><input type="submit" style="align:center;" value="Valider"/></p>
	
</form>

Modifié par Super_baloo8 (16 Mar 2012 - 23:57)
Pages :