inventaire

oranjules
Invité n'ayant pas de compte PHPfrance

27 août 2010, 18:59

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.

oranjules
Invité n'ayant pas de compte PHPfrance

27 août 2010, 19:18

je viens de voir qu'il existait une catégorie sur SQL, mea culpa :oops: si un modo pouvait déplacer le topic...

ViPHP
AB
ViPHP | 5818 Messages

27 août 2010, 19:28

Je change donc les quantités une à une...
Depuis un formulaire qui liste tes produits ?

oranjules
Invité n'ayant pas de compte PHPfrance

27 août 2010, 19:37

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...

ViPHP
AB
ViPHP | 5818 Messages

27 août 2010, 20:23

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']));
}

oranjules
Invité n'ayant pas de compte PHPfrance

27 août 2010, 23:15

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 ?

Mammouth du PHP | 1967 Messages

27 août 2010, 23:22

$_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
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

oranjules
Invité n'ayant pas de compte PHPfrance

27 août 2010, 23:49

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)

Mammouth du PHP | 1967 Messages

28 août 2010, 00:50

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
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

ViPHP
AB
ViPHP | 5818 Messages

28 août 2010, 06:23

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) :)

oranjules
Invité n'ayant pas de compte PHPfrance

28 août 2010, 13:08

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 ?

Mammouth du PHP | 1967 Messages

28 août 2010, 16:44

$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'
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

ViPHP
AB
ViPHP | 5818 Messages

28 août 2010, 17:59

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));
    }

}

oranjules
Invité n'ayant pas de compte PHPfrance

28 août 2010, 19:43

Un énorme merci à tous les deux, ca fonctionne !!! =D>

oranjules
Invité n'ayant pas de compte PHPfrance

29 août 2010, 20:32

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)