Problème de while?

Petit nouveau ! | 9 Messages

12 juin 2010, 19:53

Bonjour,
Voilà: je tente de créer une page pour des frais d'expédition. Dans mon idée, ils doivent s'afficher en fonction du poids et en fonction du continent dans lequel s'affectuera la livraison (c'est ainsi que j'ai créé ma table frais-de port: id- continent- nom-type-poids-prix). :roll:
Bon, pour le poids, je ne rencontre pas de problème... J'ai fais des if- else-etc... et ça fonctionne impeccable. Seulement pour "en fonction de la destination, là c'est la galère totale. :oops: Je m'explique: j'ai une table "commande" avec id- client- frais expédition - ad_continent...
J'ai fait ma jointure sql "frais-de-port" comme suit:
SELECT frais_de_port.continent, frais_de_port.nom, frais_de_port.type, frais_de_port.poids, frais_de_port.prix, commande.ad_continent, commande.id
FROM frais_de_port INNER commande
WHERE commande.ad_continent= frais_de_port.continent
Ensuite, j'ai écrit le php ainsi:
<?php while ($row_frais = mysql_fetch_assoc($frais))
{
   if(($row_frais['poids']=='200') && ($row_frais['continent']==$row_commande['ad_continent']))
   {  echo $row_frais['continent']; ?>
   <tr>
      <td><?php echo $row_frais['nom']; ?></td>>
      <td><?php echo $row_frais['type']; ?></td>
      <td><?php echo $row_frais['prix']; ?></td>
      <td>&nbsp;</td>
    </tr>
<?php ;} } ?>
Le souci: au lieu de m'afficher les frais de port en fonction de ces critères et de la commande en cours, il me renvoie tous les frais de port pour toutes les commandes de mon client (s'il a passé plusieurs commandes, avec différents poids par exemple, mais même sans: il me renvoie toutes les possibilités pour toutes les lignes où le client est le même)...
Je dois peut-être précisé: "pour ce numéro de commande..." Mais je ne sais pas comment faire... je dois l'inclure dans mon while?
Merci pour votre aide... :D

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

12 juin 2010, 21:34

Effectivement, si tu ne précises pas le numéro de commande, il va te retourner toutes les commandes qu'il va trouver et faire toutes les correspondances possibles. Pour éviter cela, il te suffit d'inclure cette condition directement dans ta requête sql. Quelque chose du genre :
$sql = "SELECT frais_de_port.continent, frais_de_port.nom, frais_de_port.type, frais_de_port.poids, frais_de_port.prix, commande.ad_continent, commande.id
FROM frais_de_port INNER commande
WHERE commande.ad_continent= frais_de_port.continent
AND commande.id= " . $numeroDeCommande;
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 9 Messages

13 juin 2010, 15:59

Re-bonjour,
Merci Ryle, je pressentais quelque chose comme ça... Le problème, c'est que je ne sais pas comment faire cette variable $numeroDeCommande... Je ne comprends pas vraiment comment on s'y prend :oops:
Faut-il poster cette variable à partir d'une autre page? Est-ce moi qui la crée? Comment je l'intitule et en fonction de quoi? 8-|
Merci de votre patience...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 juin 2010, 23:50

Ben d'après ton code, cela correspondrait à l'identifiant de l'enregistrement de la commande de l'utilisateur dans ta base de données... :)

Ou si tu n'as pas encore stocké la commande dans ta base de données, tu peux aussi simplement aller chercher directement l'info qui t'intéresse dans ta base en fonction du continent et du poids :
$sql = "SELECT frais_de_port.continent, frais_de_port.nom, frais_de_port.type, frais_de_port.poids, frais_de_port.prix
FROM frais_de_port 
WHERE continent = " . $continentDeLivraison . "
AND poids <= " . $poidsDeLaCommande . "
ORDER BY poids DESC
LIMIT 1, 0  
L'idée ici est de récupérer un seul enregistrement de la table frais_de_port, correspondant à celui ayant le même continent que celui demandé, et dont le poids est juste inférieur à celui de la commande (en fait, on prends tous les poids possible inférieurs à la commande, on les tri par ordre décroissants, et on ne retourne que le premier pour obtenir la bonne tranche)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...