Je n'arrive pas à récuper les données d'un tableau

Eléphanteau du PHP | 27 Messages

11 janv. 2011, 14:37

Bonjour le forum,

J'en suis toujours au point mort, c'est pourqoi je me permets de relancer ce post. Mon problème reste récurrent, voici un autre script qui présente les mêmes caractéristiques et toujours pas moyen d'enregistrer les saisies :
<?php
$req_clients=mysql_query("SELECT * FROM utilisateurs LEFT JOIN clients ON clients.cli_util=utilisateurs.util_id JOIN client_service ON clients.cli_id=client_service.client_service_client JOIN services ON client_service.client_service_service=services.servi_id WHERE util_entreprise='".$ent['ent_id']."'");
$res_clients = mysql_num_rows ($req_clients);
if($res_clients == 0 )
{ 
echo "<p class='simple_alerte' align='center' valign='middle'><strong>Attention ! Vous devez d'abord avoir complété les données de votre entreprise avant de pouvoir accéder à cette enquête !</strong></p>";
} 
else 
{ 					
echo "";
}
?>
 
<?php 
if ($date_jour>=$peri2['peri_debut'])
{
?>

<form action="saisie2.php" method="post">

<table border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td align="center" valign="top">
<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td align="center" valign="top">

<!-- Contenu du tableau de GAUCHE-->
<table border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td width="4" height="4" background="img/cadre/hg.gif"></td>
    <td height="4" background="img/cadre/h.gif"></td>
    <td width="4" height="4" background="img/cadre/hd.gif"></td>
  </tr>
  <tr>
    <td width="4" background="img/cadre/g.gif"></td>
    <td><table width="100%" border="0" cellspacing="0" cellpadding="0">
          <tr>
              <td colspan="12" class="tabtitre">Enquête n°1</td>
           </tr>
			  <td width="15%" valign="center">client&nbsp;</td>
			  <td width="8%" valign="center">Service&nbsp;</td>			  
			  <td width="15%" valign="center">Nom et Prénom
de la personne 
renseignant l'enquête
(si différente du client)&nbsp;</td>
			  <td width="15%" valign="center">Renseignement1&nbsp;</td>
			  <td width="15%" valign="center">Renseignement2&nbsp;</td>
			  <td width="15%" valign="center">Renseignement3&nbsp;</td>
			  <td width="4%" valign="center">Renseignement4</td>
			  <td width="4%" valign="center">Renseignement5</td>
			  <td width="4%" valign="center">Renseignement6</td>
			  <td width="4%" valign="center">Renseignement7</td>
			  <td width="4%" valign="center">Renseignement8</td>		  
			<tr>
			    <td colspan="11" class="ligne"></td>
								
		    </tr>
<?php			
					
$k = 0;
$req_clients=mysql_query("SELECT DISTINCT * FROM utilisateurs LEFT JOIN clients ON clients.cli_util=utilisateurs.util_id JOIN client_service ON clients.cli_id=client_service.client_service_client JOIN services ON client_service.client_service_service=services.serv_id WHERE util_entreprise='".$ent['ent_id']."'  ORDER BY util_nom, util_prenom");
while($row_clients = mysql_fetch_assoc($req_clients))
{
				if ($k==0)
				{$fond="#EEEEEE";}
				else
				{$fond="#FFFFFF";}
				echo "<tr bgcolor='".$fond."'>";

				echo "<td class='simpleg' height='30'><strong>".$row_clients["util_prenom"]." ".$row_clients["util_nom"]."</strong></td>";
				echo "<td class='simpleg' height='10'>";
				$req_services2 = mysql_query ("SELECT * FROM client_service JOIN services ON client_service.client_service_service=services.servi_id WHERE client_service_client='".$row_clients['cli_id']."'");
				while($services2 = mysql_fetch_assoc($req_services2))
				{
				{echo "&nbsp;".$services2['servi_intitule']." <br/>";}
				}
				echo "</td>";
				
				echo "<td class='simplec'><input type='text' name='client_renseignement1'size='15' value='".$row_clients['client_renseignement1']."'/></td>";											
			
				echo "<td class='simplec'>
				<select name='client_renseignement2' size='1' value='".$row_clients['client_renseignement2']."'/>
				<option>".$row_clients['client_renseignement2']."</option>		
				<option>Valeur1</option>
				<option>Valeur2</option>
				<option>Valeur3</option>
				</select></td>";

				
				echo "<td class='simplec'>		
				<select name='client_renseignement3' size='1' value='".$row_clients['client_renseignement3']."'/>
				<option>".$row_clients['client_renseignement3']."</option>
				<option>Valeur1</option>
				<option>Valeur2</option>
				<option>Valeur3</option>
				<option>Valeur4</option>	
				</select></td>";
				
				echo "<td class='simplec'>
				<select name='client_renseignement4' size='1' value='".$row_clients['client_renseignement4']."'/>
				<option>".$row_clients['client_renseignement4']."</option>
				<option>Valeur1</option>
				<option>Valeur2</option>
				<option>Valeur3</option>
				<option>Valeur4</option>
				<option>Valeur5</option>				
				<option>Autres</option>
				</select></td>";
		
				echo "<td class='simplec'><input type='text' name='client_renseignement5' style='text-align:center' size='2' value='".$row_clients['client_renseignement5']."'/></td>";	
				echo "<td class='simplec'><input type='text' name='client_renseignement6' style='text-align:center' size='2' value='".$row_clients['client_renseignement6']."'/></td>";						
				echo "<td class='simplec'><input type='text' name='client_renseignement7' style='text-align:center' size='2' value='".$row_clients['client_renseignement7']."'/></td>";	
				echo "<td class='simplec'><input type='text' name='client_renseignement8' style='text-align:center' size='2' value='".$row_clients['client_renseignement8']."'/></td>";	

				
				$k = 1 - $k;
}
?>
   </table>
      </td>
      <td width="4" background="img/cadre/d.gif"></td>
    </tr>
    <tr>
      <td width="4" height="4" background="img/cadre/bg.gif"></td>
      <td height="4" background="img/cadre/b.gif"></td>
      <td width="4" height="4" background="img/cadre/bd.gif"></td>
    </tr>
  </table>
</td>

  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  
<tr>
  <td align="center"><input name="Valider" type="submit" value="Valider" /></td>
  </tr>

</table>

</form>
Une idée quelqu'un ?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

11 janv. 2011, 15:20

Bonjour,

Ton problème est simple, c'est juste un problème logique HTML et non PHP : tu mets dans un seul formulaire <form> ... </form> un tableau qui contient plusieurs lignes ayant les mêmes noms de champs de saisie, c'est normal que le postage ne se fera que sur le dernier lot de champs de la dernière ligne.

Pour s'en assurer, affiche le code HTML de ta page sur un navigateur.

Par exemple, le formulaire suivant est mal construit (comme le tiens) car il n'envoie que la dernière ligne de champs saisis:
<form method="post">
<table>
<tr><th>Nom</th><th>Prénom</th></tr>
<tr><td><input type="text" name="nom" /></td><td><input type="text" name="prenom" /></td></tr>
<tr><td><input type="text" name="nom" /></td><td><input type="text" name="prenom" /></td></tr>
<tr><td><input type="text" name="nom" /></td><td><input type="text" name="prenom" /></td></tr>
</table>
<input type="submit" name="action" value="Enregistrer" />
</form>
En effet, le formulaire contient une table de 4 lignes <tr> les 3 dernières lignes présentent chacune des zones de saisies (nom et prenom) et puisque ces noms se répètent dans toutes les lignes, le submit du formulaire ne portera que sur les nom et prénom de la dernière ligne de la table.

Pour pallier à ce problème logique, on a le choix entre 2 méthodes :
1. La première méthode consiste à envoyer les données saisies par ligne en ayant un formulaire et un submit par champs de ligne de la table HTML. Exemple :
<table>
<tr><th>Nom</th><th>Prénom</th></tr>
<tr><form method="post"><td><input type="text" name="nom" /></td><td><input type="text" name="prenom" /></td><td><input type="submit" name="action" value="Enregistrer" /></form></td></tr>
<tr><form method="post"><td><input type="text" name="nom" /></td><td><input type="text" name="prenom" /></td><td><input type="submit" name="action" value="Enregistrer" /></form></td></tr>
<tr><form method="post"><td><input type="text" name="nom" /></td><td><input type="text" name="prenom" /></td><td><input type="submit" name="action" value="Enregistrer" /></form></td></tr>
</table>
Voila, on 3 lignes de champs de saisie complétement autonomes car on a un formulaire par ligne. Sauf que l'inconvénient est d'ordre pratique, car ceci n'est pas très convivial pour l'utilisateur.

2. La seconde méthodes quant à elle, consiste à envoyer l'ensemble des lignes de champs saisie dans la table HTML avec un seul formulaire englobant le tout (comme ton cas) mais en donnant des noms de champs différents de ligne en ligne. Et dans ce cas, on préconise de nommer les champs sous forme de tableau PHP. Exemple :
<form method="post">
<table>
<tr><th>Nom</th><th>Prénom</th></tr>
<tr><td><input type="text" name="T[0][nom]" /></td><td><input type="text" name="T[0][prenom]" /></td></tr>
<tr><td><input type="text" name="T[1][nom]" /></td><td><input type="text" name="T[1][prenom]" /></td></tr>
<tr><td><input type="text" name="T[2][nom]" /></td><td><input type="text" name="T[2][prenom]" /></td></tr>
</table>
<input type="submit" name="action" value="Enregistrer" />
</form>
Dans cette méthode on nomme les champs selon le format d'un tableau T ayant deux colonnes (nom et prenom) et plusieurs lignes (0 à N). L'avantage de cette dernière méthode est double, la saisie des données est convivial, l'utilisateur saisit toute la liste des données puis valide une fois et côté PHP, le tableau T est récupéré par $_POST comme une variable normale et traité par lot. Exemple du PHP de traitement:
<?php
    // Récupérer le tableau T transmis par le formulaire
    $T = isset($_POST["T"]) ? $_POST["T"] : null;
    if (is_array($T)) foreach ($T as $index=>$donnees){
                echo "<p>Nom: " . $donnees['nom'] . "   Prénom: " . $donnees['prenom']  . "</p>";
   }
?>
Voila :wink: si t'as des questions?
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 27 Messages

11 janv. 2011, 18:00

Merci pour les explications mais je patauge encore. J'ai bien compris qu'il fallait différencier chaque ligne de mon tableau, mais je ne suis pas sûr d'avoir saisi toutes les subtilités de ton code... (Je ne vois pas très bien comment transposer tes "T[0][nom]") et surtout que cela corresponde à ce que je veux. Je vais donc essayé d'être précis sur ce que j'attends :
1- l'accès à la page se fait par connexion avec login et mdp.
2- en fonction de ce login et de ce mot de passe, les noms et prénoms des personnes de l'entreprise apparaissent (par requête mysql ".$row_clients["util_prenom"]." ".$row_clients["util_nom"].") dans mon tableau, ainsi que le service auquel ils sont rattachés (".$services2['servi_intitule'].").
3- les colonnes suivantes sont des input text, certains avec liste déroulante, pour saisir les renseignements.
4- en dessous du tableau, il y a un bouton "Valider" pour enregistrer les saisies qui fait référence à une page php de saisie avec une session_start().

A partir de là, j'aimerais savoir ce que je dois écrire à la place de
echo "<td class='simplec'><input type='text' name='client_renseignement1'size='15' value='".$row_clients['client_renseignement1']."'/></td>";
echo "<td class='simplec'><select name='client_renseignement2' size='1' value='".$row_clients['client_renseignement2']."'/>
etc...

pour la récupération, je souhaite que les renseignements aillent remplir les champs correspondants (renseignement1, renseignement2, renseignement3...) de la table "clients" de ma base mysql et je cherche dons le code à écrire en dessous de ma session_start().

Si ce n'est pas assez clair, demande-moi STP

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

11 janv. 2011, 21:24

Bien, tu modifie les noms des listes déroulantes et des inputs comme ça:
<input type='text' name='T[$i][client_renseignement1]' size='15' value='".$row_clients['client_renseignement1']."'/>
<select name='T[$i][client_renseignement2]' size='1' value='".$row_clients['client_renseignement2']."'/>
<select name='T[$i][client_renseignement3]' size='1' value='".$row_clients['client_renseignement3']."'/>
<select name='T[$i][client_renseignement4]' size='1' value='".$row_clients['client_renseignement4']."'/>
<input type='text' name='T[$i][client_renseignement5]' style='text-align:center' size='2' value='".$row_clients['client_renseignement5']."'/>
<input type='text' name='T[$i][client_renseignement6]' style='text-align:center' size='2' value='".$row_clients['client_renseignement6']."'/>
<input type='text' name='T[$i][client_renseignement7]' style='text-align:center' size='2' value='".$row_clients['client_renseignement7']."'/>
<input type='text' name='T[$i][client_renseignement8]' style='text-align:center' size='2' value='".$row_clients['client_renseignement8']."'/>

L'idée est de nommer les champs sous la forme d'un tableau php de type : T[index][champ]
Dans le code que je te propose la variable $i sert pour placer les index du tableau T, elle doit être initialisée à zéro au début du programme avant la boucle while principale, et incrémentée avant la fin de cette boucle.
Comme ça:
...
$req_clients=mysql_query("SELECT DISTINCT * FROM utilisateurs LEFT JOIN clients ON clients.cli_util=utilisateurs.util_id JOIN client_service ON clients.cli_id=client_service.client_service_client JOIN services ON client_service.client_service_service=services.serv_id WHERE util_entreprise='".$ent['ent_id']."'  ORDER BY util_nom, util_prenom");

$i = 0; //initialisation du compteur du tableau T

while($row_clients = mysql_fetch_assoc($req_clients))
{
...
... 
...
$i ++; //incrémentation du compteur du tableau T
}
?>
</table>
...
Dans la page de récupération des données du formulaire, tu récupère le tableau T et tu injecte les champs dans la requête INSERT :
<?php
...
// Récupérer le tableau T transmis par le formulaire => une ligne du tableau = données d'un client
$T = isset($_POST["T"]) ? $_POST["T"] : null;
if (is_array($T)) foreach ($T as $index=>$client){
     //exécuter la requête INESERT sur la table clients
     mysql_query("INSERT INTO clients (renseignement1, renseignement2, renseignement3 ... etc...) 
                            VALUES ('". $client['renseignement1']."' , '". $client['renseignement2']."' , '". $client['renseignement3'] ... etc... );
}
?>
J'espère que j'étais clair. A toi de jouer :wink:
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 27 Messages

12 janv. 2011, 11:06

Merci sadeq, je crois que ça avance...

seule petite chose, il semble y avoir un problème au niveau de
name='T[$i][client_renseignement1]'
name='T[$i][client_renseignement2]'
name='T[$i][client_renseignement3]'...etc
Vu la couleur affichée dans Notepad++, ce bout de code ne semble pas pris en charge (mais il ne bogue pas !).

En tout cas, rien ne se passe quand j'appuie sur mon bouton valider...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

12 janv. 2011, 19:39

donne nous le code que t'as écrit pour voir ce que t'as fait.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 27 Messages

13 janv. 2011, 09:51

Le voilà :
<?php
$req_clients=mysql_query("SELECT * FROM utilisateurs LEFT JOIN clients ON clients.cli_util=utilisateurs.util_id JOIN client_service ON clients.cli_id=client_service.client_service_client JOIN services ON client_service.client_service_service=services.servi_id WHERE util_entreprise='".$ent['ent_id']."'");
$res_clients = mysql_num_rows ($req_clients);
if($res_clients == 0 )
{ 
echo "<p class='simple_alerte' align='center' valign='middle'><strong>Attention ! Vous devez d'abord avoir complété les données de votre entreprise avant de pouvoir accéder à cette enquête !</strong></p>";
} 
else 
{                                       
echo "";
}
?>
 
<?php 
if ($date_jour>=$peri2['peri_debut'])
{
?>

<form action="saisie2.php" method="post">

<table border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td align="center" valign="top">
<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td align="center" valign="top">

<!-- Contenu du tableau de GAUCHE-->
<table border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td width="4" height="4" background="img/cadre/hg.gif"></td>
    <td height="4" background="img/cadre/h.gif"></td>
    <td width="4" height="4" background="img/cadre/hd.gif"></td>
  </tr>
  <tr>
    <td width="4" background="img/cadre/g.gif"></td>
    <td><table width="100%" border="0" cellspacing="0" cellpadding="0">
          <tr>
              <td colspan="12" class="tabtitre">Enquête n°1</td>
           </tr>
                          <td width="15%" valign="center">client&nbsp;</td>
                          <td width="8%" valign="center">Service&nbsp;</td>                       
                          <td width="15%" valign="center">Nom et Prénom
de la personne 
renseignant l'enquête
(si différente du client)&nbsp;</td>
                          <td width="15%" valign="center">Renseignement1&nbsp;</td>
                          <td width="15%" valign="center">Renseignement2&nbsp;</td>
                          <td width="15%" valign="center">Renseignement3&nbsp;</td>
                          <td width="4%" valign="center">Renseignement4</td>
                          <td width="4%" valign="center">Renseignement5</td>
                          <td width="4%" valign="center">Renseignement6</td>
                          <td width="4%" valign="center">Renseignement7</td>
                          <td width="4%" valign="center">Renseignement8</td>              
                        <tr>
                            <td colspan="11" class="ligne"></td>
                                                                
                    </tr>
<?php                   
                                        
$k = 0;
$i = 0;
$req_clients=mysql_query("SELECT DISTINCT * FROM utilisateurs LEFT JOIN clients ON clients.cli_util=utilisateurs.util_id JOIN client_service ON clients.cli_id=client_service.client_service_client JOIN services ON client_service.client_service_service=services.serv_id WHERE util_entreprise='".$ent['ent_id']."'  ORDER BY util_nom, util_prenom");
while($row_clients = mysql_fetch_assoc($req_clients))
{
                                if ($k==0)
                                {$fond="#EEEEEE";}
                                else
                                {$fond="#FFFFFF";}
                                echo "<tr bgcolor='".$fond."'>";

                                echo "<td class='simpleg' height='30'><strong>".$row_clients["util_prenom"]." ".$row_clients["util_nom"]."</strong></td>";
                                echo "<td class='simpleg' height='10'>";
                                $req_services2 = mysql_query ("SELECT * FROM client_service JOIN services ON client_service.client_service_service=services.servi_id WHERE client_service_client='".$row_clients['cli_id']."'");
                                while($services2 = mysql_fetch_assoc($req_services2))
                                {
                                {echo "&nbsp;".$services2['servi_intitule']." <br/>";}
                                }
                                echo "</td>";
                                
                                echo "<td class='simplec'><input type='text' name='T[$i][client_renseignement1]' size='15' value='".$row_clients['client_renseignement1']."'/></td>";                                                                                   
                        
                                echo "<td class='simplec'>
                                <select name='T[$i][client_renseignement2]' size='1' value='".$row_clients['client_renseignement2']."'/>
                                <option>".$row_clients['client_renseignement2']."</option>              
                                <option>Valeur1</option>
                                <option>Valeur2</option>
                                <option>Valeur3</option>
                                </select></td>";
                           
                                echo "<td class='simplec'>              
                                <select name='T[$i][client_renseignement3]' size='1' value='".$row_clients['client_renseignement3']."'/>
                                <option>".$row_clients['client_renseignement3']."</option>
                                <option>Valeur1</option>
                                <option>Valeur2</option>
                                <option>Valeur3</option>
                                <option>Valeur4</option>        
                                </select></td>";
                                
                                echo "<td class='simplec'>
                                <select name='T[$i][client_renseignement4]' size='1' value='".$row_clients['client_renseignement4']."'/>
                                <option>".$row_clients['client_renseignement4']."</option>
                                <option>Valeur1</option>
                                <option>Valeur2</option>
                                <option>Valeur3</option>
                                <option>Valeur4</option>
                                <option>Valeur5</option>                                
                                <option>Autres</option>
                                </select></td>";
                
                                echo "<td class='simplec'><input type='text' name='T[$i][client_renseignement5]' style='text-align:center' size='2' value='".$row_clients['client_renseignement5']."'/></td>"; 
                                echo "<td class='simplec'><input type='text' name='T[$i][client_renseignement6]' style='text-align:center' size='2' value='".$row_clients['client_renseignement6']."'/></td>";                                         
                                echo "<td class='simplec'><input type='text' name='T[$i][client_renseignement7]' style='text-align:center' size='2' value='".$row_clients['client_renseignement7']."'/></td>"; 
                                echo "<td class='simplec'><input type='text' name='T[$i][client_renseignement8]' style='text-align:center' size='2' value='".$row_clients['client_renseignement8']."'/></td>"; 
                
                $k = 1 - $k;
				$i ++;
}
?>
   </table>
      </td>
      <td width="4" background="img/cadre/d.gif"></td>
    </tr>
    <tr>
      <td width="4" height="4" background="img/cadre/bg.gif"></td>
      <td height="4" background="img/cadre/b.gif"></td>
      <td width="4" height="4" background="img/cadre/bd.gif"></td>
    </tr>
  </table>
</td>

  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  
<tr>
  <td align="center"><input name="Valider" type="submit" value="Valider" /></td>
  </tr>

</table>

</form>
Dans Notepad++, les écritures [$i] apparaissent en gris et gras, alors que les codes fonctionnels sont en bleu...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

13 janv. 2011, 11:47

Voici mes premières remarques sur ton code:

Pour la coloration syntaxique de [$i] ce n'est pas grave elle ne sera jamais comme les autres vaiables php vu que le $i est intégré dans une chaine de caractère entre guillemets "" (c'est une concaténation). Mais tu peux faire sortir $i de la chaine pour faire une concaténation normale moins coûteuse en temps d'exécution en utilisant les points, comme :
echo "....... name='T[" . $i . "][client_renseignement1]' ...";
Aussi je te conseille d'utiliser des guillemets au lieu des apostrophes (quotes) pour les valeurs d'attributs HTML pour respecter le standard XHTML et éviter les problèmes avec les valeurs textes ayant des apostrophes comme : "L'arbre de Noël".

Secondo, j'ai remarqué la répétition d'une même requête 2 fois dans ton code, il s'agit de celle-là:
$req_clients=mysql_query("SELECT * FROM utilisateurs LEFT JOIN clients ON clients.cli_util=utilisateurs.util_id JOIN client_service ON clients.cli_id=client_service.client_service_client JOIN services ON client_service.client_service_service=services.servi_id WHERE util_entreprise='".$ent['ent_id']."'");
La première fois elle est exécutée afin de récupérer le nombre d'enregistrements pour tester si le traitement peut être effectué et la seconde fois elle est ré-exécutée et utilisée pour construire les lignes de la table, il s'agit ici de cette requête:
$req_clients=mysql_query("SELECT DISTINCT * FROM utilisateurs LEFT JOIN clients ON clients.cli_util=utilisateurs.util_id JOIN client_service ON clients.cli_id=client_service.client_service_client JOIN services ON client_service.client_service_service=services.serv_id WHERE util_entreprise='".$ent['ent_id']."'  ORDER BY util_nom, util_prenom");
En comparant donc les 2 requête on comprend qu'elle sont identiques à quelques différences prés au niveau de l'organisation interne des enregistrements (DISTINCT et ORDER BY) différences qui à mon avis n'ont pas d'effet majeur sur les résultats.
Mais en comparant les champs utilisée, je suis tombé sur 2 champs qui ne sont pas écrit de la même façon : services.servi_id et services.serv_id S'agit-il de 2 champs différents ou bien c'est une erreur? Moi je pense que c'est une erreur car tu a l'habitude d'utiliser dans ton programme le terme servi plutôt que serv.

Dans le cas où ces 2 requêtes sont effectivement les mêmes, on peut simplifier en enlevant la deuxième et se contentant d'une seule exécution au début du programme.

Par ailleurs, j'ai testé ton programme et ça marche en corrigeant services.serv_id par services.servi_id. Et en rajoutant un champ caché (hidden) pour faire passer le n° du client pour réaliser l'enregistrement des renseignement dans la base:
Voici donc le corrigé:
<?php

$req_clients=mysql_query("SELECT DISTINCT * FROM utilisateurs LEFT JOIN clients ON clients.cli_util=utilisateurs.util_id JOIN client_service ON clients.cli_id=client_service.client_service_client JOIN services ON client_service.client_service_service=services.servi_id WHERE util_entreprise='".$ent['ent_id']."'  ORDER BY util_nom, util_prenom");
$res_clients = mysql_num_rows ($req_clients);
if($res_clients == 0 )
{
echo "<p class='simple_alerte' align='center' valign='middle'><strong>Attention ! Vous devez d'abord avoir complété les données de votre entreprise avant de pouvoir accéder à cette enquête !</strong></p>";
}
else
{                                      
echo "";
}
?>
 
<?php
if ($date_jour>=$peri2['peri_debut'])
{
?>
<form action="saisie2.php" method="post">

<table border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td align="center" valign="top">
<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td align="center" valign="top">

<!-- Contenu du tableau de GAUCHE-->
<table border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td width="4" height="4" background="img/cadre/hg.gif"></td>
    <td height="4" background="img/cadre/h.gif"></td>
    <td width="4" height="4" background="img/cadre/hd.gif"></td>
  </tr>
  <tr>
    <td width="4" background="img/cadre/g.gif"></td>
    <td><table width="100%" border="0" cellspacing="0" cellpadding="0">
          <tr>
              <td colspan="12" class="tabtitre">Enquête n°1</td>
           </tr>
                          <td width="15%" valign="center">client&nbsp;</td>
                          <td width="8%" valign="center">Service&nbsp;</td>                      
                          <td width="15%" valign="center">Nom et Prénom
de la personne
renseignant l'enquête
(si différente du client)&nbsp;</td>
                          <td width="15%" valign="center">Renseignement1&nbsp;</td>
                          <td width="15%" valign="center">Renseignement2&nbsp;</td>
                          <td width="15%" valign="center">Renseignement3&nbsp;</td>
                          <td width="4%" valign="center">Renseignement4</td>
                          <td width="4%" valign="center">Renseignement5</td>
                          <td width="4%" valign="center">Renseignement6</td>
                          <td width="4%" valign="center">Renseignement7</td>
                          <td width="4%" valign="center">Renseignement8</td>              
                        <tr>
                            <td colspan="11" class="ligne"></td>
                                                               
                    </tr>
<?php                  
                                       
$k = 0;
$i = 0;
while($row_clients = mysql_fetch_assoc($req_clients))
{
                                if ($k==0)
                                {$fond="#EEEEEE";}
                                else
                                {$fond="#FFFFFF";}
                                echo "<tr bgcolor='".$fond."'>";

                                echo "<td class='simpleg' height='30'><strong><input type='hidden' name='cli_id' value='".$row_clients["cli_id"]."' />".$row_clients["util_prenom"]." ".$row_clients["util_nom"]."</strong></td>";
                                echo "<td class='simpleg' height='10'>";
                                $req_services2 = mysql_query ("SELECT * FROM client_service JOIN services ON client_service.client_service_service=services.servi_id WHERE client_service_client='".$row_clients['cli_id']."'");
                                while($services2 = mysql_fetch_assoc($req_services2))
                                {
                                {echo "&nbsp;".$services2['servi_intitule']." <br/>";}
                                }
                                echo "</td>";
                               
                                echo "<td class='simplec'><input type='text' name='T[$i][client_renseignement1]' size='15' value='".$row_clients['client_renseignement1']."'/></td>";                                                                                  
                       
                                echo "<td class='simplec'>
                                <select name='T[$i][client_renseignement2]' size='1' value='".$row_clients['client_renseignement2']."'/>
                                <option>".$row_clients['client_renseignement2']."</option>              
                                <option>Valeur1</option>
                                <option>Valeur2</option>
                                <option>Valeur3</option>
                                </select></td>";
                           
                                echo "<td class='simplec'>              
                                <select name='T[$i][client_renseignement3]' size='1' value='".$row_clients['client_renseignement3']."'/>
                                <option>".$row_clients['client_renseignement3']."</option>
                                <option>Valeur1</option>
                                <option>Valeur2</option>
                                <option>Valeur3</option>
                                <option>Valeur4</option>        
                                </select></td>";
                               
                                echo "<td class='simplec'>
                                <select name='T[$i][client_renseignement4]' size='1' value='".$row_clients['client_renseignement4']."'/>
                                <option>".$row_clients['client_renseignement4']."</option>
                                <option>Valeur1</option>
                                <option>Valeur2</option>
                                <option>Valeur3</option>
                                <option>Valeur4</option>
                                <option>Valeur5</option>                                
                                <option>Autres</option>
                                </select></td>";
               
                                echo "<td class='simplec'><input type='text' name='T[$i][client_renseignement5]' style='text-align:center' size='2' value='".$row_clients['client_renseignement5']."'/></td>";
                                echo "<td class='simplec'><input type='text' name='T[$i][client_renseignement6]' style='text-align:center' size='2' value='".$row_clients['client_renseignement6']."'/></td>";                                        
                                echo "<td class='simplec'><input type='text' name='T[$i][client_renseignement7]' style='text-align:center' size='2' value='".$row_clients['client_renseignement7']."'/></td>";
                                echo "<td class='simplec'><input type='text' name='T[$i][client_renseignement8]' style='text-align:center' size='2' value='".$row_clients['client_renseignement8']."'/></td>";
               
                $k = 1 - $k;
                                $i ++;
}
?>
   </table>
      </td>
      <td width="4" background="img/cadre/d.gif"></td>
    </tr>
    <tr>
      <td width="4" height="4" background="img/cadre/bg.gif"></td>
      <td height="4" background="img/cadre/b.gif"></td>
      <td width="4" height="4" background="img/cadre/bd.gif"></td>
    </tr>
  </table>
</td>

  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
 
<tr>
  <td align="center"><input name="Valider" type="submit" value="Valider" /></td>
  </tr>

</table>
</form>

<?php
}
?>

Et le programme de validation du formulaire "saisie2.php":
<pre>
<?php
//Dump des paramétres POST pour le débogage
    print_r($_POST);

// Récupérer le tableau T transmis par le formulaire => une ligne du tableau = données d'un client
$T = isset($_POST["T"]) ? $_POST["T"] : null;

if ($_POST['Valider']){
	$connexion = mysql_connect('localhost', 'root');
	mysql_select_db('test');

	if (is_array($T)) foreach ($T as $index=>$client){
       //exécuter la requête Update sur la table clients
       $sql = sprintf("UPDATE clients SET client_renseignement1 = '%s', client_renseignement2 = '%s', client_renseignement3 = '%s',
	   client_renseignement4 = '%s', client_renseignement5 = '%s', client_renseignement6 = '%s', client_renseignement7 = '%s',
	   client_renseignement8 = '%s' 	WHERE clients.cli_id = '%s' ", $client['client_renseignement1'], $client['client_renseignement2'], 
	   									 $client['client_renseignement3'], $client['client_renseignement4'], $client['client_renseignement5'], 
										 $client['client_renseignement6'], $client['client_renseignement7'], $client['client_renseignement8'], 
										 $_POST['cli_id']);
	
	   echo "<p>" . $sql . "</p>"; //débug
	  
	  if (mysql_query($sql)) echo "<p>Enregistrement effectué pour le client ".$_POST['cli_id']."</p>";
	  else echo "<p>Erreur d'enregistrement pour le client ".$_POST['cli_id']."<br />(Détail de l'erreur: " . mysql_error() .")</p>";
	}
    mysql_close();
}
?>
</pre>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 27 Messages

13 janv. 2011, 13:02

J'ai oublié un "i", le champ correct est services.servi_id... pour les requêtes, je confirme qu'il n'y a aucune incidence

Pour le reste, 'T[" . $i . "] semble mieux convenir, sauf qu'il ne se passe toujours rien au niveau de l'enregistrement ! Je ne sais pas si j'ai oublié quelque chose ou si quelque chose bloque dans mon script ???

Voici ce que j'ai écrit pour la récupération :

Code : Tout sélectionner

$T = isset($_POST["T"]) ? $_POST["T"] : null; if (is_array($T)) foreach ($T as $index=>$row_enseignants) { mysql_query("INSERT INTO clients (client_renseignement1, client_renseignement2, client_renseignement3, client_renseignement4, client_renseignement5, client_renseignement6, client_renseignement7, client_renseignement8) VALUES ('".$row_clients['client_renseignement1']."' , '".$row_clients['client_renseignement2']."' , '".$row_clients['client_renseignement3']."', '".$row_clients['client_renseignement4']."', '".$row_clients['client_renseignement5']."', '".$row_clients['client_renseignement6']."', '".$row_clients['client_renseignement7']."', '".$row_clients['client_renseignement8']."')"); }
Peut-être que c'est là que ça dysfontionne ?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

13 janv. 2011, 13:05

Il ne faut pas utiliser un INSERT mais un UPDATE car selon ta logique le client existe et la table met à jour des renseignements le concernant. Regarde mon message précédent.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 27 Messages

13 janv. 2011, 14:27

Ca ?

Code : Tout sélectionner

$T = isset($_POST["T"]) ? $_POST["T"] : null; if (is_array($T)) foreach ($T as $index=>$row_clients) { mysql_query("UPDATE clients (client_renseignement1, client_renseignement2, client_renseignement3, client_renseignement4, client_renseignement5, client_renseignement6, client_renseignement7, client_renseignement8) VALUES ('".$row_clients['client_renseignement1']."' , '".$row_clients['client_renseignement2']."' , '".$row_clients['client_renseignement3']."', '".$row_clients['client_renseignement4']."', '".$row_clients['client_renseignement5']."', '".$row_clients['client_renseignement6']."', '".$row_clients['client_renseignement7']."', '".$row_clients['client_renseignement8']."')"); }
Ben... ça ne marche toujours pas !

ViPHP
ViPHP | 2577 Messages

13 janv. 2011, 14:57

Bonjour,
...
Ben... ça ne marche toujours pas !
Pas très descriptif comme problème.
Que ce passe t'il ? un problème PHP ? un problème SQL ?
Sans message d'erreur, difficile de t'aider.

Après un mysql_querry() il est bien d'ajouter :
if (mysql_errno() <> 0)
{
echo mysql_error();
exit;
}

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

13 janv. 2011, 14:58

La syntaxe de ton update n'est pas bonne, elle doit s'écrire :
UPDATE maTable SET unChamp='une valeur', unAutreChamp='une valeur', ...
Quand l'Update (modification) concerne simplement une sélection d'enregistrements, il faut ajouter une condition WHERE, comme:
UPDATE maTable SET unChamp='une valeur', unAutreChamp='une valeur' [, ... autres champs]  WHERE champ='valeur'  [And/OR ... autres conditions]
Dans ton cas l'Update doit se faire au nom d'un client, c'est pour cela qu'il faut ajouter un WHERE pour sélectionner le client concerné par les renseignements enregistrés. Du coup, il faut que tu ajoute dans le formulaire au niveau de chaque ligne renseignement un champ caché qui porte la valeur de l'id client pour le transmettre via le POST avec les renseignements.
Par exemple:
echo "<td class='simpleg' height='30'><strong><input type='hidden' name='cli_id' value='".$row_clients["cli_id"]."' />".$row_clients["util_prenom"]." ".$row_clients["util_nom"]."</strong></td>";
Dans ce cas, ton update devient:
mysql_query("UPDATE clients SET client_renseignement1='".$row_clients['client_renseignement1']."' , client_renseignement2='".$row_clients['client_renseignement2']."' , client_renseignement3='".$row_clients['client_renseignement3']."', client_renseignement4='".$row_clients['client_renseignement4']."', client_renseignement5='".$row_clients['client_renseignement5']."', client_renseignement6='".$row_clients['client_renseignement6']."', client_renseignement7='".$row_clients['client_renseignement7']."', client_renseignement8='".$row_clients['client_renseignement8']."'  WHERE cli_id='" .$_POST['cli_id']."' ") or die(mysql_error());
J'ai terminé le mysql_query() par or die(mysql_error()) pour afficher l'erreur SQL à l'exécution.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 27 Messages

13 janv. 2011, 15:42

je crois comprendre... mais comment et où cache-t-on la valeur de l'id client ?

Eléphanteau du PHP | 27 Messages

13 janv. 2011, 16:05

Euh... oublie mon précédent message, j'ai trouvé et... on avance doucement. En effet, ce sript enregistre bien, mais malheureusement UNIQUEMENT les renseignements saisis sur la dernière ligne, pas les autres ! L'avantage par rapport à mon problème initial, c'est que ça n'entegistre pas ces renseignements pur tout le monde.