Page 1 sur 2

inventaire

Posté : 27 août 2010, 18:59
par oranjules
Bonjour !
Je voudrais faire un inventaire pour le magasin de ma mère, grâce à PHP. J'ai donc créé la table qui contient le nom de chaque produit et la quantité qu'il reste. J'arrive facilement à tester si la quantité restante est sous un certain seuil, et prévenir qu'il faut en recommander, mais j'ai des problèmes pour changer la quantité des produits.
J'ai créé un champ supplémentaire "nombre_vendu", et dans un formulaire on pourra compléter ce champ. Mais le problème est pour actualiser le nombre restant : j'ai fait ce code pour actualiser :
req = $bdd->exec('UPDATE inventaire SET nombre_restant = nombre_restant-nombre_vendu');
Et pour créer le nombre vendu, voila comment je voulais me débrouiller :
for ($id; $id <= 100; $id++)
		
		$req = $bdd->prepare('UPDATE inventaire SET nombre_vendu = :nombre_vendu WHERE id = :id');
$req->execute(array(
'nombre_vendu' => $_POST[''],
'id' => $id
	));
Je change donc les quantités une à une. Mais le problème est dans la variable POST : ya t il un moyen pour mettre un nombre qui s'incrémente également à l'intérieur des crochets ? En effet, le formulaire créera une variable $_POST['1'], qui contiendra le nombre vendu du premier produit (j'espère être assez clair), puis $_POST['2']...
Comment puis-je faire pour que le nombre à l'intérieur du POST aie la même valeur que l'id ? Merci d'avance.

Re: inventaire

Posté : 27 août 2010, 19:18
par oranjules
je viens de voir qu'il existait une catégorie sur SQL, mea culpa :oops: si un modo pouvait déplacer le topic...

Re: inventaire

Posté : 27 août 2010, 19:28
par AB
Je change donc les quantités une à une...
Depuis un formulaire qui liste tes produits ?

Re: inventaire

Posté : 27 août 2010, 19:37
par oranjules
exactement, comme je l'ai expliqué, j'ai une variable $_POST par produit, qui contient le nombre vendu. Mais il faudrait que la valeur prenne la valeur de $_POST[1] pour l'id 1, de $_POST[2] pour l'id 2... pour l'id j'ai trouvé (on le voit bien), mais pour le post, je vois pas comment changer l'intérieur d'une variable...

Re: inventaire

Posté : 27 août 2010, 20:23
par AB
Normalement le code de ton formulaire de mise à jour de la quantité vendue devrait ressembler à ça :
(en tenant compte que $ressource est la requête qui liste tes produits)
<?php while ($resultat = mysql_fetch_assoc($ressource))
{?>
<form method = "post" action = "#">
<p>
<?php echo $resultat['nom_produit'];?>
<input type = "text" name = "qte" />
<input type = "hidden" name = "id" value = "<?php echo $resultat['id'];?>" />
<input type = "submit" name = "maj" value = "envoyer" />
</p>
</form>
<?php }?>
Ensuite tu récupères l'id du produit concerné dans $_POST['id'] et la quantité vendue dans $_POST['qte']. Et ta requête d'update est schématiquement de la forme
if (isset($_POST['maj']))
{
//...
$req = $bdd->prepare('UPDATE inventaire SET nombre_vendu = :nombre_vendu WHERE id = :id');
$req->execute(array('nombre_vendu' => $_POST['qte'],'id' => $_POST['id']));
}

Re: inventaire

Posté : 27 août 2010, 23:15
par oranjules
après longue réflexion pour comprendre le code, je me rends compte qu'en fait, c'est pas tout à fait ca que je voudrais : il me faudrait un seul bouton valider pour pouvoir saisir plusieurs objets d'un coup, d'ou l'idée de changer un nombre à l'intérieur d'un POST. C'est possible en faisant un quelconque truc pour rendre un nom de variable qui change, ou tu vois une autre méthode ?

Re: inventaire

Posté : 27 août 2010, 23:22
par Spols
$_POST[$id];
devrait renvoyer le contenu de $_POST[1] pour $id = 1 etc.
Mais je pense comme AB, il vaudrait peut être mieux parcourir ton tableaux $_POST plutot que de balayer tous les id de 1 à 100, ainsi tu n'aurais que les id correspondant à une valeur $_POST

Re: inventaire

Posté : 27 août 2010, 23:49
par oranjules
oui, mais je voulais un seul bouton valider donc du coup ca marchait pas. Merci de l'astuce, et à samedi prochain :mrgreen: (regarde mon pseudo tu comprendras :p)

Re: inventaire

Posté : 28 août 2010, 00:50
par Spols
En reprennant le code de AB,
<?php while ($resultat = mysql_fetch_assoc($ressource))
{?>
<form method = "post" action = "#">
<p>
<?php echo $resultat['nom_produit'];?>
<input type = "text" name = "qte_<?php echo $resultat['id'];?>" />
</p>
</form>
<?php }?>
<input type = "submit" name = "maj" value = "envoyer" />
foreach($_POS as $key => $value)
{
if (substr($key,0,4) == 'qte_')//Ou tout autre test permettant de savoir que c'est un champ de quantité
{
//...
$req = $bdd->prepare('UPDATE inventaire SET nombre_vendu = :nombre_vendu WHERE id = :id');
$req->execute(array('nombre_vendu' => $value,'id' => substr($key,4)));
}}
[/quote]

code non testé

PS, je t'avais reconnu

Re: inventaire

Posté : 28 août 2010, 06:23
par AB
oui, mais je voulais un seul bouton valider donc du coup ca marchait pas. Merci de l'astuce, et à samedi prochain :mrgreen: (regarde mon pseudo tu comprendras :p)
Ah oui je me demandais aussi d'où pouvait venir cette idée de faire "FOR ($id; $id <= 100; $id++)"

Bon maintenant que tu t'es mieux expliqué ça va être plus facile. Essaies un formulaire de ce type
<form method = "post" action = "#">
<?php while ($resultat = mysql_fetch_assoc($ressource))
{?>
<p>
<?php echo $resultat['nom_produit'];?>
<input type = "text" name = "qte[<?php echo $resultat['id'];?>]" />
</p>
<?php }?>
<input type = "submit" name = "maj" value = "envoyer" />
</form>
Et en haut de ta page dans ton code php fait
echo '<pre>';
print_r($POST['qte']);
echo '</pre>';
ça devrait te montrer un tableau facilement exploitable pour faire tes update en boucle :wink:

Ah au fait penses à limiter le nombre de produits par page dans ton formulaire d'envoi. Par défaut php est aujourd'hui configuré pour faire passer 200 input post par formulaire (pour plus il faut changer la config).

@Spols ton idée est fonctionnelle, mais c'est tellement plus pratique de récupérer un tableau :wink: (facile à lister etc...)
A part ça tu avais une petite erreur dans la construction de ton formulaire car il ne faut pas mettre les balises <form> dans la boucle sinon tu fais autant de formulaires que de tours de boucle et le bouton submit lui par contre ne soumettra que le dernier formulaire. Il faut donc faire dans ce cas un seul formulaire (mais limité à 199 + 1 pour le submit soit 200 imput post) :)

Re: inventaire

Posté : 28 août 2010, 13:08
par oranjules
Merci, mais j'ai encore un problème, une "parse error", dans cette portion de code :
$ressource = $bdd->query('SELECT * FROM inventaire ORDER BY produit') or die(print_r($bdd->errorInfo()));

 while ($resultat = $ressource->fetch())
{
$requete = $bdd->prepare('UPDATE inventaire SET nombre_vendu = :nombre_choisi WHERE id = :id');
$requete->execute(array(
'nombre_choisi' => $_POST[qte[$resultat[id]]],
'id' => $resultat[id]
	));
}
à la ligne qui commence par 'nombre_choisi'. L'écran me dit "parse error expecting '']" ", mais le nombre de crochets est correct... il aime pas le fait d'en avoir 3 imbriqués ?

Re: inventaire

Posté : 28 août 2010, 16:44
par Spols
$ressource = $bdd->query('SELECT * FROM inventaire ORDER BY produit') or die(print_r($bdd->errorInfo()));

 while ($resultat = $ressource->fetch())
{
$requete = $bdd->prepare('UPDATE inventaire SET nombre_vendu = :nombre_choisi WHERE id = :id');
$requete->execute(array(
'nombre_choisi' => $_POST[qte[$resultat['id']]],
'id' => $resultat['id']
	));
}
essaye cela, sinon donne nous la parse error et le code complet

j'ai ajouté des guillemets simple autour de id afin de pointer vers la clé id du tableau en question, mais c'est peut être la valeur de la variable id qui est la clé alors il faudrait essayer avec $id plutot que 'id'

Re: inventaire

Posté : 28 août 2010, 17:59
par AB
Ta façon de faire n'est pas bonne pour l'update.

Si tu utilises le type de formulaire que je t'ai donné dans mon dernier exemple, tu devrais, après soumission du formulaire, récupérer les données dans le tableau $_POST['qte'] (laisse bien les guillemets autour de qte).

Donc le code php devrait-être quelque chose comme :
if (isset($_POST['qte']) && is_array($_POST['qte']))
{

$requete = $bdd->prepare('UPDATE inventaire SET nombre_vendu = :nombre_choisi WHERE id = :id');

foreach ($_POST['qte'] as $id_prod => $valeur)
    {
        $requete->execute(array('nombre_choisi' => $valeur,'id' => $id_prod));
    }

}

Re: inventaire

Posté : 28 août 2010, 19:43
par oranjules
Un énorme merci à tous les deux, ca fonctionne !!! =D>

Re: inventaire

Posté : 29 août 2010, 20:32
par oranjules
Je me re-tourne vers vous car j'ai encore un problème (fondamentalement différent du premier, mais j'ai préféré ne pas faire de nouveau topic) :
J'ai fait une page qui liste les produits du magasin, et qui colorie en rouge ceux dont la quantité est sous un certain seuil (différent pour chaque produit). Voila le code de cette partie :
while ($donnees = $reponse->fetch())
{
if ($donnees['nombre_restant'] <= $donnees['seuil']){echo '<div class=sous_nombre>';} // Si le produit est en sous-nombre, on colorie en rouge?>
Il y a <?php echo $donnees['nombre_restant'];?> unité(s) restantes de <?php echo $donnees['produit'];?> ! <br /> <!-- Ici, on liste les produits par ordre croissant de leur quantité restante -->
<?php if ($donnees['nombre_restant'] <= $donnees['seuil']){echo '</div>';} 
}
Avec une requête $reponse au début de ma page. Ensuite, j'ai voulu avoir la possibilité de trier par fournisseur (si un produit est en sous-nombre, on regarde tous les produits du fournisseur pour voir si on peut en profiter pour en commander d'autres). Pour des raisons de simplicité et pour pouvoir faire des liens, j'utilise des variables $_GET. Voila la portion de code que j'ai rajoutée (qui ressemble énormément à l'autre) :
if (isset ($_GET['fournisseur']))
	{
	$reponse_fournisseur = $bdd->prepare('SELECT produit, nombre_restant, seuil, fournisseur ORDER BY nombre_restant WHERE fournisseur = :fournisseur');
	$reponse_fournisseur->execute(array('fournisseur' => $_GET['fournisseur'])); // On cherche les produits du fournisseur concerné, et on les liste en fonction de la quantité restante
echo 'waza';
	
	while ($donnees_fournisseur = $reponse_fournisseur->fetch())
		{
		
		if ($donnees_fournisseur['nombre_restant'] <= $donnees_fournisseur['seuil']){echo '<div class=sous_nombre>';} // Si le produit est en sous-nombre, on colorie en rouge?> 
		Il y a <?php echo $donnees_fournisseur['nombre_restant'];?> unité(s) restantes de <?php echo $donnees_fournisseur['produit'];?> !
		<?php if ($donnees_fournisseur['nombre_restant'] <= $donnees_fournisseur['seuil']){echo '</div>';} ?><br /> 
		<?php
		}
	}
Le "echo 'waza';" servait à tester si c'était le "if" qui était en cause. Mais le waza s'affiche, contrairement à la liste des produits. L'erreur se situe donc dans le while, mais je ne la trouve pas ! Où est-elle ? Merci d'avance. (PS : je n'ai aucun message d'erreur qui s'affiche quand je lance la page)