Décrémentation + boucle while

WRInaute passionné
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.
 
WRInaute occasionnel
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.
 
WRInaute occasionnel
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:
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
 
WRInaute passionné
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 ?
 
WRInaute passionné
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....
 
WRInaute impliqué
chtipepere a dit:
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 ?
 
WRInaute occasionnel
Il a intérêt à être en forme ton serveur Mysql parce que s'il faut 1000 requête pour trouver le premier prix...
 
WRInaute passionné
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...) ?
 
WRInaute occasionnel
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 )
 
WRInaute occasionnel
Morph1er a dit:
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..
 
Nouveau WRInaute
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:
SELECT * FROM ta_table
WHERE prix_article < 4000
ORDER BY prix_article DESC
 
WRInaute passionné
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 ?
 
WRInaute passionné
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
 
Nouveau WRInaute
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:
<?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
 
WRInaute passionné
Merci baptiste911 pour ta proposition mais ta requête ne marche pas tout le temps, il y a certains budgets qui ne renvoient pas de réponse.

J'ai presque trouvé une solution mais j'ai quelques soucis pour limiter le nombre de résultats dans ma boucle while.

J'ai crée en faites une autre table qui se nomme "poids" et dans laquelle j'ai mis tous les poids qui m'intéressent (quelques milliers) de 0.01, 0.02, 0.03, 0.04, 0.05,... 1.01, 1.02, 1.03, etc.... et qui me serviront à multiplier chaque poids de cette table par le prix correspondant dans la table "prix".

J'utilise cette requete :

$result = mysql_query("SELECT poids FROM poids");
while($poids = mysql_fetch_array($result))
{
$result2 = mysql_query("SELECT (".$poids[poids]."*prix) AS prix22, prix, poids_inf, poids_sup, FROM prix WHERE poids_inf<='".$poids[poids]."' AND poids_sup>='".$poids[poids]."' ORDER BY prix22 DESC LIMIT 1");
$prix1 = mysql_fetch_array($result2);
if($budget>=$prix1[prix22]){
$poids_maxi = str_replace(",",".",number_format($poids[poids]*$prix1[prix]),2,",",""));
echo "poids : ".$poids[poids]." ==> prix : $poids_maxi<br>";
}
}

Le problème c'est que la boucle while me liste tous les poids du plus petit jusqu'au plus grand (cette dernière réponse correspond à la bonne réponse : au poids le plus grand en fonction du budget entré), comment faire pour afficher uniquement la dernière réponse et pas celles d'avant ?

Le "LIMIT 1" ne fonctionne pas dans ma deuxième requête ! Comment faire :roll:

Merci pour votre aide.
 
Discussions similaires
Haut