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

Eléphanteau du PHP | 27 Messages

15 déc. 2010, 12:28

Bonjour le forum,

j'ai créé un site (que je teste pour l'instant en local) destiné à collecter des commandes de produits par des utilisateurs groupés au sein d'une même entreprise. Sur une page, j'ai un tableau dans lequel la 1ère colonne fait apparaître les noms des utilisateurs (ceux d'une même entreprise), les autres colonnes leur permettant par des input text d'indiquer la quantité de produits que chacun souhaite commander. Voici mon code php:
<?php

$k = 0;
$req_clients=mysql_query("SELECT * FROM utilisateurs LEFT JOIN clients ON clients.cli_util=utilisateurs.util_id JOIN produits ON clients.cli_id=produits.prod_cli JOIN cli_ville ON clients.cli_id=cli_ville.cli_ville_cli JOIN villes ON cli_ville.cli_ville_ville=villes.ville_id WHERE util_societe='".$soc['soc_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'><a href=\"resultat_client.php?client=".$row_clients['util_id']."\" alt=\"Voir la fiche compl&egrave;te de ".$row_clients['util_nom']." ".$row_clients['util_nom']."\" title=\"Voir la fiche compl&egrave;te de ".$row_clients['util_nom']." ".$row_clients['util_nom']."\">".$row_clients["util_civilite"]." <strong>".$row_clients["util_prenom"]." ".$row_clients["util_nom"]."</strong></td>";
				echo "<td class='simpleg' height='10'>";
				echo "</td>";
				$req_commande = mysql_query ("SELECT * FROM commande WHERE commande.commande_cli='".$row_clients['cli_id']."'");
				while($comm = mysql_fetch_assoc($req_commande))
				{				
				{echo "<td class='simplec'><input type='text' name='service' id='service' size='15' value='".$comm['commande_nom_service']."'/></td>";											
							
				echo "<td class='simplec'><input type='text' name='prod1' style='text-align:center' size='2' value='".$comm['commande_prod1']."' /></td>";
				echo "<td class='simplec'><input type='text' name='prod2' style='text-align:center' size='2' value='".$comm['commande_prod2']."' /></td>";						
				echo "<td class='simplec'><input type='text' name='prod3' style='text-align:center' size='2' value='".$comm['commande_prod3']."' /></td>";
				echo "<td class='simplec'><input type='text' name='prod4' style='text-align:center' size='2' value='".$comm['commande_prod4']."' /></td>";
				echo "<td class='simplec'><input type='text' name='prod5' style='text-align:center' size='2' value='".$comm['commande_prod5']."' /></td>";}
				}				
				
				$cli_id_fiche=$row_clients['cli_id'];
				$cli_fiche=$row_clients['util_civilite']." ".$row_clients['util_prenom']." ".$row_clints['util_nom'];
				
				
				$k = 1 - $k;
}
?>
Mon problème : je n'arrive pas à récupérer les commandes de chacun dans ma base MySql. j'ai essayé ceci sans succès :
if ((isset($_POST['prod1'])) AND (is_numeric($_POST['prod1'])))
{
$prod1 = mysql_query("UPDATE commande SET commande_prod1='".ent_pos($_POST['prod1'])."' WHERE commande_ent='".$ent['ent_id']."' commande_cli='".$clients['cli_id']."'");
}
Quelqu'un aurait-il une solution ?
Merci d'avance à tous ceux qui voudront bien m'aider !

ViPHP
xTG
ViPHP | 7331 Messages

15 déc. 2010, 12:47

Il manque un AND entre les deux couples de valeurs dans ton WHERE.
Rajoutes des instructions de debug et tu ne resteras pas planté ainsi devant ce genre d'étourderies. ;)

Pour l'exemple il suffirai de rajouter or die(mysql_error()) à la fin de la commande mysql_query() pour détecter toute erreur de syntaxe.

ViPHP
ViPHP | 5462 Messages

15 déc. 2010, 12:49

Pour l'exemple il suffirai de rajouter or die(mysql_error()) à la fin de la commande mysql_query() pour détecter toute erreur de syntaxe.
ou mieux activer le mysql.trace_mode
ini_set('mysql.trace_mode', true);

Eléphanteau du PHP | 27 Messages

15 déc. 2010, 18:38

Merci, mais même avec le "AND", ça ne marche pas...
ma formule enregistre la valeur de la dernière ligne et l'affuble à tous les utilisateurs !
Où est l'erreur ou la subtilité de syntaxe ?

ViPHP
xTG
ViPHP | 7331 Messages

15 déc. 2010, 20:01

Que donnes ceci :
echo "UPDATE commande SET commande_prod1='".ent_pos($_POST['prod1'])."' WHERE commande_ent='".$ent['ent_id']."' commande_cli='".$clients['cli_id']."'";

Eléphanteau du PHP | 27 Messages

16 déc. 2010, 10:36

Ca n'est toujours pas bon...

II n'y a visiblement que la dernière ligne du tableau qui semble être prise en compte, et je ne comprends toujours pas pourquoi !

ViPHP
xTG
ViPHP | 7331 Messages

16 déc. 2010, 11:55

Bon solvons déjà un problème.
C'est quoi la dernière ligne du tableau pour toi ? Un n-uplet de la table ou bien l'index prod5 du tableau $_POST ?

Et tu ne m'as toujours pas donné ce que renvoyais le echo. ^^

Eléphanteau du PHP | 27 Messages

16 déc. 2010, 12:07

Ben pour moi, la dernière ligne du tableau c'est la commande du dernier client (dans l'ordre alphabétique) de l'entreprise. En fait, avec les scripts que j'ai utilisés, il n'y a que cette commande qui semble être prise en compte lorsque l'on clique sur le bouton valider.

ViPHP
xTG
ViPHP | 7331 Messages

16 déc. 2010, 12:52

En relisant le code et avec tes informations pour m'éclairer j'ai compris.

Tu fais une boucle pour récupérer les résultats de la requête $req_commande.
Sauf que dans cette boucle tu affiches des input avec un nom fixe. Ce qui fait que si tu parcours 10 fois la boucle tu auras bien 10 affichages mais avec le même nom.
Donc seul le dernier input est traité.

Solution : faire varier le nom des inputs en y concaténant par exemple l'id de l'enregistrement concerné.

Eléphanteau du PHP | 27 Messages

16 déc. 2010, 13:05

Merci xTG, je crois avoir compris ton raisonnement, mais concrètement, je ne vois vas comment faire varier le nom des inputs comme tu dis : est ce la valeur (value) que je dois modifier ou le nom (name) ? Pourrais-tu me donner un exemple ?

ViPHP
xTG
ViPHP | 7331 Messages

16 déc. 2010, 17:23

Admettons que je récupères de ma base de donnée une suite de valeur que je veux ensuite modifier.
Toutes ces valeurs sont des n-uplet différents, mon formulaire travaille donc avec plusieurs input qui selon la logique possède le même nom.
Chaque n-uplet est caractérisé par une valeur unique (ou un coupe, c'est la clé primaire). Donc le but est d'insérer cette valeur dans le nom afin d'obtenir des noms compréhensibles et uniques.
while( $r = mysql_fetch_***($requete) )
{
  echo "<input type=\"***\" name=\"nomduchamps_{$r['cle_primaire']}\" value=\"{$r['valeur']}\" />";
}
Sur cet exemple de codage du nom du champs il suffit à la réception de couper la chaîne suivant le caractère "_" pour obtenir l'identifiant du n-uplet à modifier. :)

Eléphanteau du PHP | 27 Messages

16 déc. 2010, 17:37

Merci pour le tuyau, j'essaierai ça demain...

Eléphanteau du PHP | 27 Messages

17 déc. 2010, 16:35

Bonjour xTG bojour le forum,

désolé mais j'ai trituré ton script un peu dans tous les sens, sans succès. Tes \, tes { et autres signes que je n'ai pas compris, m'ont aussi pas mal désorienté... enfin bref : je suis toujours planté complet !
Lorsque je te demandais hier de me donner un exemple, j'espérais que tu utilises mes propres noms de champ et de requête, en gros que tu me transformes mon code original en un code qui fonctionne et que je puisse reproduire. Est-ce trop abusé que de te demander de me faire quelque chose avec ça à transformer:
$req_commande = mysql_query ("SELECT * FROM commande WHERE commande.commande_cli=' ".$row_clients['cli_id']." ' ");
while($comm = mysql_fetch_assoc($req_commande))
{
echo "<input type='text' name='commande_prod1' value=' ".$comm['commande_prod1]." '/>";
}
merci d'avance de te pencher sur mon cas

ViPHP
xTG
ViPHP | 7331 Messages

17 déc. 2010, 20:56

Les caractères qui te gênent sont des caractères d'échappement ou de protection. :)
Tu utilises dans ton code des ' pour les paramètres html, ce qui n'est pas très bon en fait même si le navigateur les interprète au final. Il faut utiliser des " .
Cela se comprend en général lorsqu'on fait une faute de syntaxe de par la coloration :
echo "<input type=\"***\" name=\"nomduchamps_{$r['cle_primaire']}\" value=\"{$r['valeur']}\" />";
echo "<input type="***" name="nomduchamps_$r['cle_primaire']" value="$r['valeur']" />";
Quand aux {} c'est pour indiquer que tout ce qui se trouve au milieu est la variable. Car sinon on s'arrêterai à l'interprétation de $r et on perdrait donc l'index du tableau.
while($comm = mysql_fetch_assoc($req_commande))
{
echo "<input type=\"text\" name=\"commande_prod1-{$comm['id_commande']}\" value=\"{$comm['commande_prod1']}\" '/>";
}
Et l'interprétation de l'input :
foreach($_POST as $index => $valeur) // parcours de tous les champs renvoyés
{
  $tab = explode("-",$index); // on coupe l'index sur le caractère -
  if( count($tab) == 2 && $tab[0] == "commande_prod1" )
  {
    $id_commande = $tab[1];
    echo "Commande numéro $id_commande : $valeur\n";
  }
}

Eléphanteau du PHP | 27 Messages

03 janv. 2011, 14:55

Bonjour xTG, Bonjour le Forum et Meilleurs Voeux à tous !

Voilà, j'ai essayé pendant mes vacances, mais en reprenant le boulot ce matin, je ne suis guère plus avancé. Si ma page "commande" affiche bien les produits de chacun, je n'arrive toujours pas à enregistrer de nouvelles commandes avec le code
foreach($_POST as $index => $valeur)
{
$tab = explode("-",$index);
if( count($tab) == 2 && $tab[0] == "commande_prod1" )
{
$id_commande = $tab[1];
echo "Commande numéro $id_commande : $valeur\n";
}
}

Est-ce par que je dois modifier certains mots en fonction de mes tables MySql, est-ce que c'est parce que mon bouton "valider" utilise une méthode POST ?...etc
Bref, j'ai toujours besoi d'aide !