Page 1 sur 2

Probleme lors de la creation d'un tableau dynamique

Posté : 23 nov. 2006, 15:32
par castell
Boujour,

J'ai un probleme lors de la creation d'un tableau dynamique.
En effet c'est la premiere fois que j'utilise les boucles et je ne sait trop comment m'en servir j'ais fait un essais sans grand resultat

mon scirpt doit me renvoyer plusieurs tableaux trié par un chiffre inscrit dans la base de donnée (possibilité d'avoir plusieur entré dans la base de donnée avec le meme chiffre 'groupe' )

le scritp fonctionne mais dans les tableaux il n'y a rien du tout qui s'affiche.

voici mon code:

$requete=" SELECT distinct groupe FROM commande2";
$res2 = mysql_query($requete,$link) or die ('Erreur : '.mysql_error() );


while ($voir=mysql_fetch_array($res2))
{

$requete2="SELECT * FROM commande2 WHERE groupe LIKE '".$voir."'";
$res3 = mysql_query($requete2,$link) or die ('Erreur : '.mysql_error() );
$voir2=(mysql_fetch_array($res3));

echo "<BR><FORM method=\"POST\" action='commande.php'><table border=1>";

$nom=$voir2['nom'];

echo "<TR bgcolor=\"#CCFFCC\"><th>Nom</th><th>Référence</th><th>Quantité</th><th>Nombre d'unité</th><th>Fournisseur</th><th>Reference fournisseur</th><th>Prix à l'unité</th><th>Prix total</th><th>Prix avec reduction</th><th>Numero de cas</th><th>Date</th><th>initiale</th><th>Commande</th></tr>";
echo"<tr>";

?>
<td><font face='Verdana' size='2'><?php echo $nom; ?></font></td>

<td><font face='Verdana' size='2'><?php echo $voir2['reference']; ?></font></td> 

<td><font face='Verdana' size='2'><?php echo $voir2['quantite']; ?></font></td>

<td><font face='Verdana' size='2'><?php echo $voir2['nombre_quantite']; ?></font></td>


<td><font face='Verdana' size='2'><?php echo $voir2['fournisseur']; ?></font></td>

<td><font face='Verdana' size='2'><?php echo $voir2['reference_fournisseur']; ?></font></td>


<td><font face='Verdana' size='2'> <?php echo $voir2[prix]; ?></font></td>

<td><font face='Verdana' size='2'> <?php echo $voir2[prix_total]; ?></font></td>

<td><font face='Verdana' size='2'> <?php echo $voir2[reduction]; ?> </font></td>

<td><font face='Verdana' size='2'> <?php echo $voir2['numero_cass']; ?></font></td>

<td><font face='Verdana' size='2'> <?php echo $voir2['date']; ?></font></td>

<td><font face='Verdana' size='2'><?php echo $voir2['initiale']; ?></font></td>

<?php echo "
<td class=\"truc\"><font face='Verdana' size='2'><div style=\"text-align:left;\">

<select name=\"commande[]\">

<option value=\"rien\"></option>
<option value=\"effectuee\">Effectuée</option>
<option value=\"annulee\">Annulée</option>

</select>
<input type=\"hidden\" name=\"tabnom[]\" value=\"$nom\"
</div></font></td></tr>";



echo "<tr><td colspan=11><div style=\"text-align:center;\">
<input type=\"submit\" value=\"Valider\">
<input type=\"submit\" value=\"Imprimer\" onclick=\"print();\">
<input type=\"submit\" value=\"Fermer\" onClick=\"window.close()\";></div></TD></tr>";
echo "</table></form>"; 
Donc ma demande serait si vous pouviez regarder pour voir pourquoi rien ne s'affiche et m'aider pour la correction

Je vous remercie encore

Posté : 23 nov. 2006, 15:59
par Ajoloca
Bonjour,
le scritp fonctionne mais dans les tableaux il n'y a rien du tout qui s'affiche.
Je ne suis pas aussi sur que toi.
A tu activé la directive d'affichage des erreurs ?

Si c'est le cas tu devrais avoir plusieurs erreurs.
Pas de fermeture de la boucle 'while()'.
Des variables indéfinies pour
<td><font face='Verdana' size='2'> <?php echo $voir2[prix]; ?></font></td>

<td><font face='Verdana' size='2'> <?php echo $voir2[prix_total]; ?></font></td>

<td><font face='Verdana' size='2'> <?php echo $voir2[reduction]; ?> </font></td>
Il manque les ' entre les crohets

Posté : 23 nov. 2006, 16:08
par Ryle
Pareil qu'Ajoloca ! :)

Pis en plus, tu dois également avoir un soucis par ici :
while ($voir=mysql_fetch_array($res2)) 
{ 
$requete2="SELECT * FROM commande2 WHERE groupe LIKE '".$voir."'"; 
$voir est un tableau et pas une variable. Si tu affiches cette requête avant de l'exécuter, tu risques d'être surpris par la valeur de $voir :)

Par ailleurs, un LIKE sans % comme caractère joker (à moins qu'il n'y en ait dans les valeurs de ton $voir, ce dont je doute) n'a aucun intérêt et consomme beaucoup de ressource inutilement. Si c'est une égalité qu'il te faut, autant utiliser le signe "=" :)

Posté : 23 nov. 2006, 17:34
par castell
Deja merci pour m'avoir fais corriger certaine erreur de syntaxe

j'ai fermer ma boucle pour whyle , mis des '' pour les trois champs qui en manquait et enfin remplacer le like de ma requete par un egale comme vous me l'aviez conseillez.

Pour ce qui es de :
while ($voir=mysql_fetch_array($res2))  
{  
$requete2="SELECT * FROM commande2 WHERE groupe LIKE '".$voir."'";
j'ai essaille de mettre a la place de mysql_fetc_array , mysql_num_rowS mais j'ai l'impression que sa me fais une boucle infinie

enfin voila
a votre avis ai je mal batis ma boucle ? que puis je mettre a la place de mysql_fetch_array pour que mes variables apparaissent dans le tableau??

merci encore

Posté : 23 nov. 2006, 17:41
par Ajoloca
Re,
Essaie ceci
$requete=" SELECT distinct(groupe) FROM commande2";
Les parenthèses en plus.
et
$requete2="SELECT * FROM commande2 WHERE groupe LIKE '%".$voir['groupe']."%'";

Posté : 23 nov. 2006, 17:50
par castell
j'ais tester de modifié mes requetes comme tu me la montrée Ajoloca ,
Je n'ai aucun retour d'erreur mais par contre mon tableau est toujours aussi vide lol

j'ai surement du faire fausse route dans la maniere d'utiliser ma boucle : /

Posté : 23 nov. 2006, 17:53
par Ajoloca
Poste ton nouveau code.

Posté : 23 nov. 2006, 18:00
par castell
Voila code que sa me donne en ce moment
$requete=" SELECT distinct(groupe) FROM commande2";
$res2 = mysql_query($requete,$link) or die ('Erreur : '.mysql_error() );


while ($voir=mysql_fetch_array($res2))
{

$requete2="SELECT * FROM commande2 WHERE groupe LIKE '%".$voir['groupe']."%'"; 
$res3 = mysql_query($requete2,$link) or die ('Erreur : '.mysql_error() );
$voir2=(mysql_num_rowS($res3));

echo "<BR><FORM method=\"POST\" action='commande.php'><table border=1>";

$nom=$voir2['nom'];

echo "<TR> bgcolor=\"#CCFFCC\"><th>Nom</th><th>Référence</th><th>Quantité</th><th>Nombre d'unité</th><th>Fournisseur</th><th>Reference fournisseur</th><th>Prix à l'unité</th><th>Prix total</th><th>Prix avec reduction</th><th>Numero de cas</th><th>Date</th><th>initiale</th><th>Commande</th></tr>";
echo"<tr>";

?>
<td><font face='Verdana' size='2'><?php echo $nom; ?></font></td>

<td><font face='Verdana' size='2'><?php echo $voir2['reference']; ?></font></td> 

<td><font face='Verdana' size='2'><?php echo $voir2['quantite']; ?></font></td>

<td><font face='Verdana' size='2'><?php echo $voir2['nombre_quantite']; ?></font></td>


<td><font face='Verdana' size='2'><?php echo $voir2['fournisseur']; ?></font></td>

<td><font face='Verdana' size='2'><?php echo $voir2['reference_fournisseur']; ?></font></td>


<td><font face='Verdana' size='2'> <?php echo $voir2['prix2'];  ?></font></td>

<td><font face='Verdana' size='2'> <?php echo $voir2['prix_total2'];  ?></font></td>

<td><font face='Verdana' size='2'> <?php echo $voir2['reduction2'];  ?> </font></td>

<td><font face='Verdana' size='2'> <?php echo $voir2['numero_cass']; ?></font></td>

<td><font face='Verdana' size='2'> <?php echo $voir2['date']; ?></font></td>

<td><font face='Verdana' size='2'><?php echo $voir2['initiale']; ?></font></td>

<?php echo "
<td class=\"truc\"><font face='Verdana' size='2'><div style=\"text-align:left;\">

<select name=\"commande[]\">

<option value=\"rien\"></option>
<option value=\"effectuee\">Effectuée</option>
<option value=\"annulee\">Annulée</option>

</select>
<input type=\"hidden\" name=\"tabnom[]\" value=\"$nom\"
</div></font></td></tr>";

echo "<tr><td colspan=11><div style=\"text-align:center;\">
<input type=\"submit\" value=\"Valider\">
<input type=\"submit\" value=\"Imprimer\" onclick=\"print();\">
<input type=\"submit\" value=\"Fermer\" onClick=\"window.close()\";></div></TD></tr>";
echo "</table></form>"; 

}

Posté : 23 nov. 2006, 18:15
par Ajoloca
Re,
En premier
$voir2=(mysql_num_rowS($res3)); 
retournr le nombre d'enregistements lus et non pas les enregistrements eux-mêmes.

En suite un petit PB de logique
Dans cette requête
$requete=" SELECT distinct(groupe) FROM commande2"; 
tu vas avoir un certain nombre de réponses que tu traites avec
while ($voir=mysql_fetch_array($res2))
Jusque là tout va bien, mais... dans ce while tu as une nouvelle requête
$requete2="SELECT * FROM commande2 WHERE groupe LIKE '%".$voir['groupe']."%'";
Qui elle aussi retourne plusieurs résultats, il est où le while() (ou autre strcture de boucle) qui traite les résultats un par un ?

Posté : 23 nov. 2006, 18:34
par Ryle
z'allez dire que j'radote mais bon... ;)

Puisque les données viennent de la base, je recommande d'autant plus le "=" à la place du "LIKE %" ça sera beaucoup plus efficace d'un point de vue performance et temps de traitement (il a juste à comparer 2 valeurs au lieu de vérifier si l'une n'est pas par hazard contenue dans l'autre)

Et pour peu que la table possède un index sur ce champ, la réponse sera quasi immédiate même avec un grand nombre d'enregistrement :)

A voir bien entendu, si tu as besoin d'une égalité ou qu'au contraire tu cherches volontairement des chaines qui se ressemblent

Posté : 23 nov. 2006, 18:39
par Ajoloca
z'allez dire que j'radote mais bon... ;)

Puisque les données viennent de la base, je recommande d'autant plus le "=" à la place du "LIKE %" ça sera beaucoup plus efficace d'un point de vue performance et temps de traitement (il a juste à comparer 2 valeurs au lieu de vérifier si l'une n'est pas par hazard contenue dans l'autre)

Et pour peu que la table possède un index sur ce champ, la réponse sera quasi immédiate même avec un grand nombre d'enregistrement :)

A voir bien entendu, si tu as besoin d'une égalité ou qu'au contraire tu cherches volontairement des chaines qui se ressemblent
:pouce:

Posté : 23 nov. 2006, 18:54
par castell
Pour retournerl e nombre d'enregistrement lus je fais sa :
$voir2=mysql_num_rowS($res3);
$voir3=count(mysql_num_rowS($res3)); 
j'ai fais un echo dessus et il 'y a la valeur 1 qui s'affiche au dessus de chaque tableau

sinon pour la boucle qui doit traiter les resultats un par un

j'ai essailler de faire un for (j'ai lus la definition sur phpnet)

pour dire que tant que un resultat est trouvé il est ajouté

voila l'essais

for ($voir2=1;$voir2<$voir3;$voir2++){mon tableau}

mais comme tu te doute sa ne donne rien du tout : //


(desolé d'etre si boulet )[/php]

Posté : 23 nov. 2006, 19:21
par Ajoloca
Re,
Essaie ceci, SANS GARANTIE mais au moins on y vois plus clair
J'ai modifié l'indentation, donné des noms plus parlants au variables et ajouté la seconde boucle while().
<?php
$qryGroup = "SELECT distinct(groupe) FROM commande2";
$resQryGroup = mysql_query($qryGroup,$link) or die ('Erreur : ' . mysql_error() );


while ($rangGroupe = mysql_fetch_array($resQryGroup)){
	$qryCmde = "SELECT * FROM commande2 WHERE groupe = '" . $rangGroupe['groupe'] . "'"; 
	$resQryCmde = mysql_query($qryCmde,$link) or die ('Erreur : ' . mysql_error() );
	while($rangCmde = mysql_fetch_array($resQryCmde)){
?>
		<BR><FORM method="POST" action="commande.php">
		<table border=1>
			<TR> bgcolor=\"#CCFFCC\">
				<th>Nom</th><th>Référence</th><th>Quantité</th><th>Nombre d'unité</th>
				<th>Fournisseur</th><th>Reference fournisseur</th><th>Prix à l'unité</th>
				<th>Prix total</th><th>Prix avec reduction</th><th>Numero de cas</th>
				<th>Date</th><th>initiale</th><th>Commande</th>
			</tr>
			<tr>
				<td><font face='Verdana' size='2'><?php echo $rangCmde['nom']; ?></font></td>
				<td><font face='Verdana' size='2'><?php echo $rangCmde['reference']; ?></font></td> 
				<td><font face='Verdana' size='2'><?php echo $rangCmde['quantite']; ?></font></td>
				<td><font face='Verdana' size='2'><?php echo $rangCmde['nombre_quantite']; ?></font></td>
				<td><font face='Verdana' size='2'><?php echo $rangCmde['fournisseur']; ?></font></td>
				<td><font face='Verdana' size='2'><?php echo $rangCmde['reference_fournisseur']; ?></font></td>
				<td><font face='Verdana' size='2'><?php echo $rangCmde['prix2'];  ?></font></td>
				<td><font face='Verdana' size='2'><?php echo $rangCmde['prix_total2'];  ?></font></td>
				<td><font face='Verdana' size='2'><?php echo $rangCmde['reduction2'];  ?> </font></td>
				<td><font face='Verdana' size='2'><?php echo $rangCmde['numero_cass']; ?></font></td>
				<td><font face='Verdana' size='2'><?php echo $rangCmde['date']; ?></font></td>
				<td><font face='Verdana' size='2'><?php echo $rangCmde['initiale']; ?></font></td>
				<td class="truc"><font face='Verdana' size='2'>
					<div style="text-align:left;">
						<select name="commande[]">
							<option value="rien"></option>
							<option value="effectuee">Effectuée</option>
							<option value="annulee">Annulée</option>
						</select>
					<input type="hidden" name="tabnom[]" value="<?php echo $rangCmde['nom']; ?>" />
					</div>
				</font></td>
			</tr>
			<tr>
				<td colspan=11>
					<div style="text-align:center;">
						<input type="submit" value="Valider" />
						<input type="submit" value="Imprimer" onclick="print();" />
						<input type="submit" value="Fermer" onClick="window.close()" />
					</div>
				</td>
			</tr>
		</table>
	</form>
<?php
	}
} 
?>

Posté : 24 nov. 2006, 11:46
par castell
Désolé du retard pour ma reponse mais j'etait pas au travail et j'avais pas pris mes lignes de code avec moi

Sinon Ajoloca je tenai vraiment a te remercier d'avoir pris du temps avec mon probleme, c'est vraiment gentil .

Les lignes de code que tu m'a donné s'execute presque parfaitement bien.
Il me reste juste a faire que si lon a plusieur entré pour le meme groupe , le tableau ajoute une ligne au mieu de recréer un tableau.

exemple :

si il y a deux produit de chez acros ,un de chez fluku et un de chez strem;
il y ai un tableau ou sont ranger les deux produit acros , un tableau pour fluka et un pour strem.

j'ais donc fais cela :
$qryGroup = "SELECT distinct(groupe) FROM commande2"; 
$resQryGroup = mysql_query($qryGroup,$link) or die ('Erreur : ' . mysql_error() ); 


while ($rangGroupe = mysql_fetch_array($resQryGroup)){ 
    $qryCmde = "SELECT * FROM commande2 WHERE groupe = '" . $rangGroupe['groupe'] . "'";  
    $resQryCmde = mysql_query($qryCmde,$link) or die ('Erreur : ' . mysql_error() ); 
  
?> 
        <BR><FORM method="POST" action="commande.php"> 
        <table border=1> 
            <TR bgcolor= "#CCFFCC"> 
                <th>Nom</th><th>Référence</th><th>Quantité</th><th>Nombre d'unité</th> 
                <th>Fournisseur</th><th>Reference fournisseur</th><th>Prix à l'unité</th> 
                <th>Prix total</th><th>Prix avec reduction</th><th>Numero de cas</th> 
                <th>Date</th><th>initiale</th><th>Commande</th> 
            </tr> <?php
			  while($rangCmde = mysql_fetch_array($resQryCmde)){ 
			  ?>
            <tr> 
                <td><font face='Verdana' size='2'><?php echo $rangCmde['nom']; ?></font></td> 
                <td><font face='Verdana' size='2'><?php echo $rangCmde['reference']; ?></font></td>  
                <td><font face='Verdana' size='2'><?php echo $rangCmde['quantite']; ?></font></td> 
                <td><font face='Verdana' size='2'><?php echo $rangCmde['nombre_quantite']; ?></font></td> 
                <td><font face='Verdana' size='2'><?php echo $rangCmde['fournisseur']; ?></font></td> 
                <td><font face='Verdana' size='2'><?php echo $rangCmde['reference_fournisseur']; ?></font></td> 
                <td><font face='Verdana' size='2'><?php echo $rangCmde['prix2'];  ?></font></td> 
                <td><font face='Verdana' size='2'><?php echo $rangCmde['prix_total2'];  ?></font></td> 
                <td><font face='Verdana' size='2'><?php echo $rangCmde['reduction2'];  ?> </font></td> 
                <td><font face='Verdana' size='2'><?php echo $rangCmde['numero_cass']; ?></font></td> 
                <td><font face='Verdana' size='2'><?php echo $rangCmde['date']; ?></font></td> 
                <td><font face='Verdana' size='2'><?php echo $rangCmde['initiale']; ?></font></td> 
                <td class="truc"><font face='Verdana' size='2'> 
                    <div style="text-align:left;"> 
                        <select name="commande[]"> 
                            <option value="rien"></option> 
                            <option value="effectuee">Effectuée</option> 
                            <option value="annulee">Annulée</option> 
                        </select> 
                    <input type="hidden" name="tabnom[]" value="<?php echo $rangCmde['nom']; ?>" /> 
                    </div> 
				</font>
			</td>
		</tr>

<?php
}
?>
            <tr> 
                <td colspan=11> 
                    <div style="text-align:center;"> 
                        <input type="submit" value="Valider" /> 
                        <input type="submit" value="Imprimer" onclick="print();" /> 
                        <input type="submit" value="Fermer" onClick="window.close()" /> 
                    </div> 
                </td> 
            </tr> 

       </table> 
    </form> 

<?php

}
?>
et cela fonctionne tré bien

Encore merci a tout le monde pour l'aide que vous nous apporter a nous developpeur en aide :)

Posté : 24 nov. 2006, 12:05
par Ajoloca
Bonjour,

Ce petit souci tu devrais être en mesure de le résoudre.
Que fait-il (le script) actuellement ?
- Il me crée un tableau à chaque article (même groupe ou différent)
Quelle instruction (balise) crée un tableau ?
- La balise '<tab>'
Où se trouve-t-elle ?
- A l'intérieur de la bocle qui gère chaque ligne de groupe
Si je la sorts de cette boucle et que je la place dans la boucle qui gère chaque groupe ???

D'après toi?