Décrémentation + boucle while

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics

poupilou
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 139
Inscription: Lun Fév 09, 2004 16:18

Décrémentation + boucle while

Message le Ven Juil 13, 2007 15:06

Salut,

Un peu d'aide SVP, je souhaiterais décrémenter un budget de -1, recalculer la prochaine valeur via une requete mysql (boucle while) et ce jusqu'à obtenir un résultat, comment faire cela ?

Voici les infos que je peux vous donner :

$budget_depart = 4000;

je fais une requête mysql qui calcul s'il y a une résulat avec ce budget de départ, ensuite je fais :

$nb_resultat = mysql_num_rows($result);

if($nb_resultat==1){
// j'affiche le résultat : pas de problème
}

else{
// mais dans ce cas là il faudrait décrémenter $budget_depart de -1 le repasser dans ma requete mysql et ce jusqu'à obtenir un résultat (quelqu'un a-t-il une solution à proposer ?)
}


Merci pour votre aide et vos conseils.


erestrebian
WRInaute impliqué
WRInaute impliqué
 
Messages: 394
Inscription: Ven Juin 15, 2007 12:55

Message le Ven Juil 13, 2007 15:25

je comprends bien ce que tu veux (ce n'est pas très clairement expliqué)

pourquoi tu ne décrémentes pas jusqu'à ce que tu aies ce que tu veux et une fois que tu as le bon résultat, tu mets la base de données à jour.

ou alors si tu entends par résultat le résultat de la requête et pas celui du budget.

plutôt que de faire 4000 requêtes, fais-en une ou tu demande l'ensemble de la table et tu traites les résultats un par un jusqu'à ce que tu es le bon.

chtipepere
WRInaute impliqué
WRInaute impliqué
 
Messages: 484
Inscription: Jeu Jan 08, 2004 16:15

Message le Ven Juil 13, 2007 15:27

Grâce à une fonction récursive : ici
Le principe c'est de mettre le tout dans une fonction dans laquelle tu rapelleras ta fonction.

Code: Tout sélectionner
function fonction($arg)
{
   //On fait une action
   $arg++;

   // On fait une boucle
   while ($arg < 100)
   {
      //On rappelle la fonction
      fonction($arg);
   }
   if($arg == 100)
      return $arg;

}
//On appelle la fonction
$var = 0;
echo fonction($var);


Ceci n'est qu'un exemple (la fonction n'a aucun intérêt en soit et est mal conçue), mais sur le principe c'est correct.
Bon courage

poupilou
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 139
Inscription: Lun Fév 09, 2004 16:18

Message le Ven Juil 13, 2007 15:50

merci pour vos réponses.

je vais essayer de mieux expliquer ce que je cherche à faire.

Un internaute va entrer dans le champs d'un formulaire un budget en euro (je ne connais pas à l'avance le montant de ce budget), une fois ce formulaire posté je récupère cette variable "budget" que j'ai appelé dans mon exemple ici $budget_depart nous supposons pour cet exemple que l'internaute à tapé le chiffre "4000" (soit 4000 euros).

Ensuite, je fais une requête mysql assez complexe qui va calculer avec ce budget de 4000 euros ce que l'internaute va pouvoir acheter sur mon site, le problème c'est que parfois, avec certains budget, il n'y a pas de réponse, la requete retourne 0 réponse. Je voudrais donc diminuer son budget d'un pas de 1 (4000-1 = 3999 euros ; 3999-1 = 3998 ; etc...) repasser ce nouveau budget (qui a été diminué de 1) dans ma requête mysql jusqu'à ce que ma requete me retourne une réponse.

Comment faire cela ?

chtipepere
WRInaute impliqué
WRInaute impliqué
 
Messages: 484
Inscription: Jeu Jan 08, 2004 16:15

Message le Ven Juil 13, 2007 15:52

Heu, s'il ne peut rien acheter avec 4.000€, comment fait-il pour acheter quelque chose avec moins d'argent?

poupilou
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 139
Inscription: Lun Fév 09, 2004 16:18

Message le Ven Juil 13, 2007 16:00

oui je sais, ça peut paraitre un peu bizarre mais en faite c'est du au calcul qui est effectué dans ma requete mysql qui est assez complexe car il y a des milliers de prix différents en fonction des différentes catégories de produits que je propose....

nifrou
WRInaute passionné
WRInaute passionné
 
Messages: 664
Inscription: Jeu Juin 15, 2006 1:11

Message le Dim Juil 15, 2007 1:48

chtipepere a écrit:Heu, s'il ne peut rien acheter avec 4.000€, comment fait-il pour acheter quelque chose avec moins d'argent?

Je croit qu'il veut faire comme cela :

Rentrez votre budget : 4000€
recherche si il y à un article à 4000 € -> non
recherche si il y à un article à 3999 €-> non
recherche si il y à un article à 4998 €-> non
recherche si il y à un article à 4997 €-> non
recherche si il y à un article à 4996 €->
Oui, alors on arrête la recherche et on répond 'nous vous proposons l'article gold-trucmuche à 4996€

Et on fait pas d'autre proposition

Il s'appelle comment le site ?

Morph1er
WRInaute impliqué
WRInaute impliqué
 
Messages: 307
Inscription: Mer Juil 07, 2004 14:05

Message le Dim Juil 15, 2007 12:57

Il a intérêt à être en forme ton serveur Mysql parce que s'il faut 1000 requête pour trouver le premier prix...

poupilou
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 139
Inscription: Lun Fév 09, 2004 16:18

Message le Mar Juil 17, 2007 14:23

nifrou a très bien résumé ce que je souhaite faire :
Rentrez votre budget : 4000€

recherche si il y à un article à 4000 € -> non
recherche si il y à un article à 3999 €-> non
recherche si il y à un article à 3998 €-> non
recherche si il y à un article à 3997 €-> non
recherche si il y à un article à 3996 €-> oui (on stop la requête mysql)


Les prix de mes produits sont calculés de telle manière qu'il y a des "trous". Par exemple, on peut acheter un produit pour 3500 euros mais pas pour 3600 euros (parce qu'il n'y a pas de produits qui soit vendu à ce prix là, le produit suivant sera vendu par exemple 3800 euros), donc il y a un "trou" entre 3501 et 3799 euros, s'il tape un chiffre comprix entre 3501 et 3799 euros il n'y aura pas de réponse. Dans ce cas là, en décrémentant le prix que l'internaute a entré on finira par tomber sur le produit qui correspondra juste au prix en dessous de son budget.

Question : comment décrémenter ce prix via une boucle (while, for, etc...) ?

NextGeneration
WRInaute impliqué
WRInaute impliqué
 
Messages: 425
Inscription: Mer Sep 27, 2006 18:34

Message le Mer Juil 18, 2007 9:59

Tu préviendras quand tu mettras le script en exploitation, on ouvrira une société de maintenance pour les serveurs sql, ( on va etre riches )

i-liquid
WRInaute passionné
WRInaute passionné
 
Messages: 662
Inscription: Jeu Sep 08, 2005 17:51

Message le Mer Juil 18, 2007 10:16

Morph1er a écrit:Il a intérêt à être en forme ton serveur Mysql parce que s'il faut 1000 requête pour trouver le premier prix...


+1

jamais ca passerais j'ai déjà testé ce genre de requete pour voir les possibilités de mysql et fais moi confiance ca va etre très lent..

au fait j'ai apris un truc je savais pas qu'on savais faire des fonctions récursives avec php tiens... Mais bon c'est pas très clean ds le code tout ca faut mieux faire 2 boucles..

Genova
Nouveau WRInaute
 
Messages: 34
Inscription: Sam Sep 30, 2006 22:21

Message le Mer Juil 18, 2007 11:05

Il y a beaucoup plus simple.

Si tu entres un budget de 4000€, tu vas commencer par chercher le plus grand prix juste avant le palier 4000€.

Une simple requête de ce genre suffirait :
Code: Tout sélectionner
SELECT * FROM ta_table
WHERE prix_article < 4000
ORDER BY prix_article DESC

poupilou
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 139
Inscription: Lun Fév 09, 2004 16:18

Message le Mer Juil 18, 2007 21:38

Merci Genova mais le problème c'est que je n'ai pas dans ma table un prix fixe tel que tu le décris, je vais vous donner une structure de table comparable à la mienne afin que vous vous visualisiez un peu mieux ce que j'essaie de faire. Supposons la table "prix" ci-dessous :

CREATE TABLE prix (
num int(10) NOT NULL auto_increment,
article varchar(200) NOT NULL,
poids_inf decimal(4,2) DEFAULT '0.00' NOT NULL,
poids_sup decimal(4,2) DEFAULT '0.00' NOT NULL,
prix int(6) DEFAULT '0' NOT NULL,
PRIMARY KEY (num)
);

INSERT INTO prix VALUES ('', 'pomme', '1', '3', '850');
INSERT INTO prix VALUES ('', 'pomme', '4', '6', '650');
INSERT INTO prix VALUES ('', 'pomme', '7', '9', '550');
INSERT INTO prix VALUES ('', 'pomme', '10', '13', '450');
etc...
INSERT INTO prix VALUES ('', 'pomme', '45', '50', '250');
INSERT INTO prix VALUES ('', 'poire', '1', '3', '950');
INSERT INTO prix VALUES ('', 'poire', '4', '6', '750');
INSERT INTO prix VALUES ('', 'poire', '7', '9', '650');
INSERT INTO prix VALUES ('', 'poire', '10', '13', '550');
etc...
INSERT INTO prix VALUES ('', 'poire', '45', '50', '350');


Les champs "poids_inf" et "poids_sup" représentent des kilogrammes.

Je souhaiterai pouvoir calculer et afficher la quantité maximale (en kg) qu'un client pourrait acheter en fonction de son budget ?

Autrement dit si un client a un budget de 4000 euros quelle quantité maxi de pomme peut-il acheter ?

Si le poids est de 2 kg le prix pour ces 2 kg sera de 2 x 850 = 1700 euros mais si le poids est de 7 kilos le prix sera alors de 7 x 550 = 3850 euros, peut-il acheter 8 kilos, réponse non car 8 x 550 = 4400 euros, on dépasse son budget initial de 4000 euros, donc dans ce cas là le nombre maxi de kilos qu'il peut acheter est bien de 7 kg.

Quelqu'un pourrait-il m'aider à trouver la requête qu'il faudrait faire pour obtenir le nombre de kilos ?


rog
WRInaute accro
WRInaute accro
 
Messages: 1662
Inscription: Jeu Sep 21, 2006 2:32

Message le Jeu Juil 19, 2007 1:58

j'ai pas tout lu parce que ça m'a gavé grave

mais une boucle décrémentée ressemble à ça

for($i = $max; $i > 0; $i--)

rog

baptiste911
Nouveau WRInaute
 
Messages: 3
Inscription: Lun Juil 09, 2007 17:35

Message le Jeu Juil 19, 2007 16:26

si un client a un budget de 4000 euros quelle quantité maxi de pomme peut-il acheter ?


J'ai fait un script qui répond a ton problème, ce n'est peut être pas la meilleur manière de faire mais ça marche. :D

Code: Tout sélectionner
<?php
$budget = 10000; // A entrer par l'utilisateur

mysql_connect("localhost", "root", "");
mysql_select_db("testprix");
// IMPORTANT:  classé par prix au kilo croissant
$reponse = mysql_query("SELECT * FROM prix ORDER BY prix") or die(mysql_error());

while ($donnees = mysql_fetch_array($reponse) )
{
// On récupère les données
$poids_inf = $donnees['poids_inf'];
$poids_sup = $donnees['poids_sup'];
$prix_au_kilo = $donnees['prix'];

$cout_mini = $poids_inf * $prix_au_kilo;


   if ($budget >= $cout_mini)
   {
   $nombre_de_kilo = $budget / $prix_au_kilo;
   echo 'Vous pouvez acheter ' . $nombre_de_kilo . ' kg. (Prix au kilo: ' . $prix_au_kilo . ')<br />'; // nombre decimal
   echo 'Vous pouvez acheter ' . floor($nombre_de_kilo) . ' kg. (Prix au kilo: ' . $prix_au_kilo . ')<br />';// nombre entier
   break;
   }
}
mysql_close();
?>


La requête mysql est effectuée en triant par le prix de façon à retourner le cas le plus favorable pour le client (au cas où il y ait plusieurs réponses possibles)
Je renvoye une valeur décimale et la même valeur entière selon ce que tu souhaite :wink:


Après les valeurs des champs "poids_inf" et "poids_sup" me paraissent incomplets si on prend les décimales en compte
Pour
INSERT INTO prix VALUES ('', 'pomme', '1', '3', '850');
INSERT INTO prix VALUES ('', 'pomme', '4', '6', '650');


Entre 3 kg et 4 kg il n'y a rien :!:
Ne serait-il pas préferable de mettre 3,99 à la place de 3 par exemple ?
Si tu gère les décimales bien sur :wink:

EDIT pour corriger le code
Dernière édition par baptiste911 le Ven Juil 20, 2007 23:22, édité 1 fois.

Décrémentation + boucle while

Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités