Vous n'êtes pas identifié(e).
il te faut l'inclure dans le HAVING et non pas le rajouter dans un WHERE.
J'aimerais comprendre, cela est-il plus performant ou c'est parce que c'est plus "propre" ?
Au niveau du résultat obtenu, en faisant ORDER BY DateEpexidiotn j'obtiens quelque chose de plus cohérent.
Pour ta condition, je n'ai pas eu le temps de vérifier le comportement de la requête
Raison de plus pour te remercier infiniment de ton aide, prendre le temps que tu n'as pas pour m'aider (et aider les autres) c'est très gentil.
Pour répondre exactement à ta question, tu fais un truc du genre:
print "moyenne=".$result[0]." jours";.
Bonne continuation.
Merci tu es sympa.
A l'affichage j'obtiens : moyenne 0.00005787 jours
J'ai rajouté à la requête WHERE DateExpedition != '0000-00-00 00:00:00' car parfois des produits (volés par exemple) ne sorte pas du stock côté logiciel (maaaalllhheereusement !)
Effectivement.. J'inscris toujours * par habitude je vais le modifier
![]()
J'ai ajouté ce code au début de ma page et dès qu'on clique sur le lien, c'est cette fonction qui s'exécute avant d'afficher les images... Est-ce qu'il y a un meilleur moyen ?
Salut,
Cette petite phrase ne sert peut être pas à grand chose, du moins pas à t'aider dans ton problème, mais il est très important de ne pas utiliser * dans une requête, tu peux gagner en performance en prenant l'habitude de mettre le nom du champ que tu sélectionne .
Je te recommande aussi de vérifier ta variable GET avant de l'utiliser (je ne sais pas si tu le fais déjà) avec is_numeric (pour les valeurs numériques) et isset par exemple.
Le but de ta démarche c'est d'incrémenter de 1 quand quelqu'un regarde une image ?
Saluton,
Faire un AVG d'un TIME_DIFF avec un formatage, y-a vraiment pas de quoi baver.
J'avais déjà essayé mais j'avais un résultat un peu bizarre (pour ne pas dire étrange :-p) ...
Bonsoir,
Voici la requête pour les 5000 derniers enregistrements. Filtre à adapter selon tes besoins (année, etc...). Si tu as moins de 5000 enregistrements dans ta base fait un <= pour avoir un résultat.
SELECT AVG(UNIX_TIMESTAMP(DateExpedition)-UNIX_TIMESTAMP(DateReception))/86400 FROM myTable GROUP BY IdProduit HAVING count(IdProduit)=5000 ORDER BY DateReception DESC
Note: la requête ci-dessus pour être exact ne recense pas les 5000 derniers enregistrements mais les 5000 dernières receptions, que tu peux remplacer par les expéditions.
++
Merci beaucoup JC
Je n'ai jamais vue une requête comme ça mais j'ai une question. Dois-je faire une boucle pour afficher le résultat si oui, comment afficher le résultat de façon groupé (par exemple : Moyenne: '14' jours) ? Car quand je fais un While, j'ai un résultat avec des milliers de chiffres ...
Merci à vous pour votre aide, vous êtes incroyables !
A la bonheur ! J'en bave déjà lol !
Tu as parfaitement compris mon problème, je veux savoir en combien mes produits restent en stock mais pas forcément pour chaque produit mais pour le global.
Par exemple :
Sur les 5000 derniers enregistrements, les produits sont restés 14.7 jours en moyenne en stock
Je souhaite que le résultat soit exprimé en jours.
Merci JC !!
Bonjour à tous,
Je m'arrache les cheveux pour calculer un indice de jour de stock, en gros, combien de temps en moyenne reste un enregistrement dans ma base de données.
J'ai donc une table avec deux champs DateTime sous Mysql : DateReception et DateExpedition
Voici la structure de ma table:
IdProduit - IdProvenance - NumeroLivraison - DateReception - DateExpedition
J'avoue que j'ai essayé des dizaines et des dizaines de solutions, mais aucunes ne fonctionnes.
Avez vous une solution concernant le problème cité ? Est ce qu'il faut à votre avis utiliser des fonctions Mysql (AVG, SUM) ou qu'il faut passer par PHP en sachant qu'il y a 150 - 200 enregistrements à comparer ?
J'ai essayé de faire des recherches sur google mais il y a à boire et à manger, j'ai un peu essayé tout ce que j'ai vue sans succès ...
Merci à vous,
Antho
Bonjour moogli et merci pour ton aide,
N'y aurait-il pas un moyen de fournir des "index" différents aux trois champs plutôt que de changer le reste ?
En effet, je ne passe pas un temps "officiel" sur ce problème car je suis au boulot et je voudrais éviter de tout changer si cela est toujours possible.
Dans la négative, si je fait 3 tableaux, dois-je faire trois boucles pour afficher les inputs genre :
Si oui, comment récupérer ces trois boucles, est-il possible de les récupérer en une seule et ainsi ne faire qu'une seule requête d'insertion dans la base de donnée ?
Bon je crois que j'ai une piste, si je modifie ceci :
Pour ceci :
J'ai bien tous les enregistrement mais bien sur, les informations enregistrées dans mysql ne sont pas les bonnes car dans le "DOM l'id n'est pas UNIQUE" (ref Maljuna Kris :-)).
Donc le problème viens de $i qui ne doit probablement pas fournir assez d'id différent dans la page html.
Comment contourner cela, tel est la question ?
Bonjour,
J'ai encore essayé pas mal de modification mais je n'ai toujours que la moitié de la boucle qui est lu ...
Je commence a désespérer !
Il y a surement un problème avec le foreach de la ligne 88 qu'en pensez vous ?
Re,
Voici le code complet:
<?php
// Boucle pour afficher le nom/prénom du client
while($DETAILS_NAME = mysql_fetch_assoc($REQ_DETAILS_NAME))
{
$NameClt_1 = $DETAILS_NAME['name'];
echo $NameClt_1;
}
?>
<br>
<?php
// Boucle pour afficher le contenu de la commande
while($DETAILS_CMD = mysql_fetch_assoc($REQ_DETAILS_CMD))
{
// Création d'une varible pour l'email du client
$EmailClt = $DETAILS_CMD['email'];
?>
<?php echo $DETAILS_CMD['order_id']; ?><br>
<?php echo $DETAILS_CMD['order_item_sku']; ?><br>
<?php echo $DETAILS_CMD['order_item_name']; ?><br>
<?php echo $DETAILS_CMD['product_quantity']; ?><br>
<?php
for($i=0;$i < $DETAILS_CMD['product_quantity'];$i++)
{
echo '<input type="text" name="lignes['.$i.'][numero_serie]" id="numero_serie" value="" /><br>';
echo '<input type="hidden" name="lignes['.$i.'][details]" id="details" value="'.filtre_spec_caracteres($DETAILS_CMD['order_item_name']).'" /><br>';
echo '<input type="hidden" name="lignes['.$i.'][PartNumber]" id="PartNumber" value="'.$DETAILS_CMD['order_item_sku'].'" /><br>';
} // fin for
} // Fin while($DETAILS_CMD = mysql_fetch_assoc($REQ_DETAILS_CMD))
?>
<br>
> Veuillez remplir le(s) champ(s) ci-dessus (obligatoire).
<br>
<input type="hidden" name="EnvForm" id="EnvForm" value="1" />
<input type="hidden" name="Name" id="Name" value="<?php echo $NameClt_1; ?>" />
<input type="hidden" name="email" id="email" value="<?php echo $EmailClt; ?>" />
<input type="submit" name="button" id="button" value="Ajouter à la synthèse" class="boutonf_commentaire" />
<?php
} // Fin du if - if($NB_LST_CMD != '0')
?>
</form>
<?php
// Si le formulaire est envoyé, on traite les champs
if(isset($_POST['EnvForm']))
{
// Création d'un flag pour vérifier si tous les champs sont remplis
$flag = false;
// Parcours du tableau
foreach($_POST['lignes'] as $ligne)
{
// Si des champs "numero_serie" ne sont pas remplis $flag = true
if(empty($ligne['numero_serie'])) { $flag = true; }
}
// Si flag vaut TRUE on affiche une erreur
if($flag === true)
{
echo '<div style="padding: 5px;" class="text_erreur"><img src="images/horsstock.png" width="16" height="16" alt="erreur"> Un ou plusieurs champs n\'ont pas été remplis...</div>';
}
// Sinon, on continu le traitement
else
{
// Vérification si les champs on bien été remplis
$id = $_GET['id'];
$emailclt = $_POST['email'];
$Nameclt = $_POST['Name'];
// Connexion base de donnée
include('includes/connexion_base_site.php');
// On parcours le tableau notamment en cas de plusieurs produits (product_quantity > 1)
foreach($_POST['lignes'] as $ligne)
{
// REQUETE INSERTION DANS LA BASE SN / ASSUR
$SQL_INSERT_NUM_SERIE =
sprintf("INSERT INTO
gstock_HistoriqueCommande
(NumeroCommande,PartNumber,Designation,NumeroSerie,Email,NameClt,DateAjt)
VALUES ('%s','%s','%s','%s','%s','%s',NOW())"
,$id
,$ligne['PartNumber']
,$ligne['details']
,$ligne['numero_serie']
,$emailclt
,$Nameclt
);
$REQ_INSERT_NUM_SERIE = mysql_query($SQL_INSERT_NUM_SERIE) or die( "Impossible d'ajouter des données à la table : " .mysql_error());
}
// Fermeture de la base de donnée
mysql_close($db);
// SI correctement éxécuté on redirige
echo '<script language="javascript" type="text/javascript">window.location.replace("test.php?cmd=',$id,'");</script>';
} // Fin else =====> if($flag === true)
} // Fin if =====> if(isset($_POST['EnvForm']))
?>
Bonjour,
Je modifie le nom des champs de façon définitives et je posterais ensuite l'ensemble du code, merci beaucoup pour votre aide.
Anthony
Bonjour,
Merci beaucoup. Je n'ai pas l'impression que la fonction soit opérante avec le NOW(), j'ai essayé plusieurs écritures mais pour le moment ça ne fonctionne pas, je verrais ça après.
En revanche, je n'ai toujours que la moitié des enregistrements dans la base, les deux dernières boucles pour être exact (semble t-il en tout cas). Comme si le foreach ne parcourais pas tous le tableau.
Avez vous une idée ?
Anthony
Bonjour,
En regardant de plus prêt :
Je ne suis pas un codeur, je travail juste sur un petit module qui nous facilite la vie au boulot, qui permet de servir comme il se doit nos clients, nous sommes trois à l'utiliser...
Pour la solution donnée par Maljuna Kris, j'ai un petit soucis, il ne prend en compte que la moitié des champs j'ai l'impression :
N'insert que deux enregistrements lorsqu'il y a 4 champs dans le formulaire.
Avez vous une idée ?
Anthony
if(empty($champ)) {
$flag = true;
break;
}a++
Bonjour,
Merci pour ton aide, je n'ai pas de problème avec le flag mais avec le foreach :-)
foreach($_POST['lignes'] as $ligne){
echo 'numero : ',$ligne['numero'], '<br />details : ',$ligne['details'], '<br />'remarque : ',$ligne['remarque'], '<br />';
}
Merci beaucoup ! Avec vous les choses sont très vites comprises c'est très bien, je n'y avait pas penser à cette façon d'écrire le code !
Mais désormais, nous revenons à mon premier post à savoir, comment vérifier si les champs sont remplis ?
J'utilisais un flag :
foreach($_POST['numero'] as $champ)
{
if(empty($champ)) { $flag = true; }
}
if($flag === true)
{
echo '<div style="padding: 5px;" class="text_erreur"><img src="images/horsstock.png" width="16" height="16" alt="erreur"> Un ou plusieurs champs n\'ont pas été remplis...</div>';
}
Désormais, je veux faire ce test sur le champ numéro uniquement alors j'ai fait comme suit :
foreach($_POST['lignes']['numero'] as $champ)
{
if(empty($champ)) { $flag = true; }
}
if($flag === true)
{
echo '<div style="padding: 5px;" class="text_erreur"><img src="images/horsstock.png" width="16" height="16" alt="erreur"> Un ou plusieurs champs n\'ont pas été remplis...</div>';
}
sans succès je dois dire ...
Pouvez vous m'aiguiller s'il vous plaît ? (les boucles me font peur, j'ai déjà planté un serveur avec une boucle infinie alors ...)
Merci à vous pour votre aide !
Anthony
Bon, bah, c'est bien ce que tu voulais obtenir, non ?
Oui, le problème vient ensuite.
Comment faire pour traiter ceci ? avec un seul champ il faut faire:
Mais avec plusieurs champ à récupérer ?
Je sais que l'exemple ci-dessous n'est pas correct (du moins je crois j'ai "peur" d'essayer) mais alors comment on reprend tout les champs dans ces cas là ?
A noté qu'ensuite j'insère une ligne dans une BDD autant de fois qu'il y a de champs "numero"
Merci pour votre aide,
Anthony
Re,
Voici le résultat :
J'ai oublié de préciser que les champs détails et remarque sont des champs hidden qui contiennent des informations provenant d'une BDD mais je ne pense pas que cela gêne ?...
Merci pour ton aide,
Anthony
Saluton,
Comme je te l'ai déjà dit un id doit être unique dans une page HTML, or là, tu risques d'avoir plusieurs ids 'numero', 'details' et 'remarque'.
Ensuite, pour éclaircir le reste de ta problématique, il faudrait nous communiquer le résultat d'un var_dump($_POST['numero']); à partir du script php cible de l'attribut action de ton <form>
Bonjour,
Je ne l'ai pas mis ici mais pour les ID j'incrémente de +1 une variable ce qui donne en gros id="numero<?php echo $var++; ?>".
En ce qui concerne la réponse de var_dump:
Bonjour,
A la suite d'un problème (résolu) dans ce Topic : http://forum.phpdebutant.org/viewtopic.php?id=13432 je tombe sur un autre problème.
Pour rappel, je génère un formulaire grâce à une entrée numérique dans ma base de donnée, le champ "numero[]" peut donc être affiché 1 fois comme 5 fois.
Je le récupère ensuite avec un foreach comme ceci sans problème :
Désormais, je voudrais récupérer le même formulaire avec avec des informations en plus comme ceci :
Et c'est le drame lol! La je ne sais plus comment faire pour récupérer les champs. J'ai imaginer imbriquer des foreach de cette façon :
Je ne sais pas si c'est correct et je souhaiterais avoir votre avis avant de faire une bêtise ou une boucle infinie ...
Merci à tous!
Anthony
Bon, je pense que cette modification devrait te donner satisfaction :
<?php
$saisie=array_map("trim",$_POST['numero']);
var_dump($saisie);
echo "<br />";
echo array_search("",$saisie);
echo "<br />";
if(array_search("",$saisie)===0){
echo "il y a des champs vides";
}
else{
echo "il y a ".count($saisie). " champs remplis";
}
Merci beaucoup pour votre aide, vos solutions m'ont été d'un grand secours !
Je considère que mon problème est réglé, merci beaucoup!
Anthony
Anthotill a écrit :Pour vous, qu'elle est la meilleure solution ? la plus optimisée / sécurisée ?
Je suis bien incapable de me prononcer quant à aucun des deux critères.
Ce qui est curieux avec votre solution, c'est que si je rempli le premier champ et pas les autres elle renvoie FALSE, mais si je rempli le deuxième champ est pas les autres ça renvoi TRUE
Bonjour et merci pour vos réponses!
Les solutions que vous proposez fonctionnent toutes les deux apparemment, je vous remercie sincèrement!
Maintenant il faut que je face des tests
Pour vous, qu'elle est la meilleure solution ? la plus optimisée / sécurisée ?
Merci à vous en tout cas!
Bon, là rien n'a été saisi.
As-tu essayé de tester avec la fonction array_search ?Sinon ton code est bizarre, pourquoi initialiser $i='0' puis for($i = 0;...
D'autre part, dans le DOM un id doit être UNIQUE, or toi tu en crées autant que d'itérations de ta structure for
Avec une saisie :
Je n'ai pas l'impression que array_search renvoi quelque chose, rien ne s'affiche si je valide le formulaire ...
Pour mon code, le champ quantity peut changer, il peut être de 6 pour un utilisateur et de 3 pour un autre, ou même de 1 (jamais 0). le $i = 0 est surement une erreur, car je ne vois pas à quoi il sert ...
Du coup, pour générer le nombre de champ "numero" correspondant à la valeur de quantity je fait la boucle for.
J'ai beaucoup de mal à comprendre comment faire pour contrôler un formulaire de ce type ...
J'espère m'exprimer de façon convenable ...
Saluton,
Peux-tu nous montrer le résultat d'un var_dump($_POST["numero"]), STP
Bonjour :-)
Voici:
Merci pour votre aide
Antho
Bonjour à tous,
Je génère un formulaire en fonction d'une quantité stockée dans Mysql comme ceci:
Je sais récupérer les données de ce formulaire (même si $DETAILS['quantity'] vaut 5 par exemple) mais je n'arrive pas à arrêter l'envoi du formulaire si un des champs n'est pas rempli.
Pour récupérer les données :
Mais si $DETAILS['quantity'] vaut 5 et que seulement quatre champs sont remplis la je bloque, je ne sais pas arrêter le formulaire comme on le ferai pour un formulaire "normal" avec :
Merci beaucoup pour votre aide précieuse !
Antho