inventaire

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : inventaire

Re: inventaire

par oranjules » 31 août 2010, 22:42

Aaaah oui, chuis bete ! merci beaucoup !

Re: inventaire

par Spols » 31 août 2010, 21:45

if (isset($_SESSION['option']) AND $_SESSION['option'] = 'sous_nombre')
Et
if (isset($_SESSION['option']) AND $_SESSION['option'] = 'sous_nombre')
ces parties ne test pas la valeur de $_SESSION['option'], mais en défini la valeur à 'sous_nombre' l'affectation se passant bien, elle renvoie true.

La correction est :
if (isset($_SESSION['option']) AND $_SESSION['option'] == 'sous_nombre')
Et
if (isset($_SESSION['option']) AND $_SESSION['option'] == 'sous_nombre')
Dans ce cas là, c'est bien un test de la valeurs qui est effectué. C'est une erreur classique que j'ai souvent faite.

A retenir pour les test des valeurs: En SQL 1 seul = ; En PHP 2 =

Re: inventaire

par oranjules » 31 août 2010, 19:26

bon j'ai encore un problème que je trouve... étrange :p (mais cette fois, aucun rapport avec SQL)
J'ai voulu créer un menu d'options pour pouvoir afficher uniquement les produits en sous-nombre. Je me sers donc de variables de session (pour pouvoir naviguer entre les pages). Voila la page du menu d'option :
<?php
include("menu.php");
if (isset($_POST['option']))
{
$_SESSION['option'] = $_POST['option'];
echo 'Changement effectué !';
echo $_SESSION['option'];
}
?>

<h4>Tout afficher sur la liste de produits ?</h4>
<form method="post">
<select name="option" id="option">
<option value="tout">Tout afficher</option>
<option value="sous_nombre">Afficher seulement les produits en sous-nombre</option>
</select>
<input type="submit" value="Changer">
</form>
Avec le echo $_SESSION['option'], je vois que la variable a bien changé (notamment quand elle prend pour valeur "tout", c'est la que se pose le problème).
Voila les lignes que j'ai rajoutées dans la page de liste :
if (isset($_SESSION['option']) AND $_SESSION['option'] = 'sous_nombre')
{
$reponse = $bdd->query('SELECT * FROM inventaire WHERE nombre_restant <= seuil ORDER BY nombre_restant') or die(print_r($bdd->errorInfo())); // Ici, on réagit en fonction du réglage : soit on affiche tout, soit on affiche seulement les produits en sous-nombre
echo $_SESSION['option'];}
else
{
$reponse = $bdd->query('SELECT * FROM inventaire ORDER BY nombre_restant') or die(print_r($bdd->errorInfo()));
}
Et
if (isset($_SESSION['option']) AND $_SESSION['option'] = 'sous_nombre')
	{
	$reponse_fournisseur = $bdd->prepare('SELECT produit, nombre_restant, seuil, fournisseur FROM inventaire WHERE fournisseur = :fournisseur AND nombre_restant <= seuil ORDER BY nombre_restant');
	} // Ici, on fait comme ligne 31-38 : on réagit selon le réglage
	else
	{
	$reponse_fournisseur = $bdd->prepare('SELECT produit, nombre_restant, seuil, fournisseur FROM inventaire WHERE fournisseur = :fournisseur ORDER BY nombre_restant');
	}
A la place des requetes situées dans le "else". Dans la première requete, j'ai encore mis un echo $_SESSION['option'] mais si la condition est vraie. Et la, je vois marqué (en plus de la liste vide) : sous_nombre :shock:
la variable a changé de valeur en cours de route ! D'ou vient le problème ? Merci.
PS : j'ai bien activé session_start() sur chaque page

Re: inventaire

par oranjules » 30 août 2010, 13:57

Mais c'est bon j'ai trouvé mon erreur : j'avais oublié le "from inventaire" dans ma requete :p et le where était placé au mauvais endroit (il doit être avant le order by)
Merci quand meme, grace à ces tests j'ai pu voir que c'était le while qui marchait pas !

Re: inventaire

par AB » 30 août 2010, 04:08

Ben oui, le echo 'waza'; signifie que tu es arrivé à ce niveau sans apparemment d'erreur, alors faut continuer tes tests sur l'accolade suivante et comme dit Spols mettre un var_dump($donnees_fournisseur); (ou print_r($donnees_fournisseur);) juste après le while
        while ($donnees_fournisseur = $reponse_fournisseur->fetch())
                {
                     var_dump($donnees_fournisseur);
                     
                     //if ($donnees_fournisseur['nombre_restant'] <= $donnees_fournisseur['seuil'])...
                }
Et ainsi de suite pour chaque niveau d'accolade si cela ne suffit pas... c'est le principe du débuggage :wink:

Ensuite fait attention il faut écrire :
echo '<div class="sous_nombre">';

et non pas echo '<div class=sous_nombre>';

Re: inventaire

par Spols » 29 août 2010, 23:21

En premier lieu tu devrais sécuriser ton entrée $_GET, ne pas laisser introduire n'importe quelle valeur

Ensuite je pense que ta requète ne doit retourner aucun résultat, et c'est pour cela que rien ne s'affiche

vérifie orthographe et casse de la valeur de $_GET['fournisseurs'], voir même sa valeur dans ton if

essaye aussi un var_dump($donnees_fournisseur); juste après le while voir si il retourne quelques chose et combien de fois

Re: inventaire

par oranjules » 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)

Re: inventaire

par oranjules » 28 août 2010, 19:43

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

Re: inventaire

par AB » 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));
    }

}

Re: inventaire

par Spols » 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'

Re: inventaire

par oranjules » 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 ?

Re: inventaire

par AB » 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) :)

Re: inventaire

par Spols » 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

Re: inventaire

par oranjules » 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)

Re: inventaire

par Spols » 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