probleme avec une variable de session

probleme avec une variable de session - PHP - Programmation

Marsh Posté le 05-10-2004 à 16:05:58    

bonjour !
voila j'ai de grosses difficultés avec une variable de session
$_SESSION['prix_general'];
elle permet d'additionner le somme d'un caddie avec les frais de livraison.
mais voila a l'affichage tout ce passe bien grace a la fonction affiche_somme_total dans laquelle il n'y a qu'un echo  $_SESSION['prix_general'];
et dans le print_r($_SESSION); de la page recap.php il recuperere bien  'prix_general'
ex :
Array ( [caddy] => Array ( [1] => 1 ) [produits] => 1 [prix_total] => 200000000 [prix_general] => 200000119 )

Code :
  1. //recap.php
  2. <?php
  3.   session_start();
  4.   $nom = $_POST['nom'];
  5.   $prenom = $_POST['prenom'];
  6.   $test = $_SESSION['prix_general'];
  7.   // si le formulaire est rempli
  8.   if($_SESSION['caddy']&&$nom&&$prenom&&$test)
  9.   {
  10.     // on peut inserer les données dans la base de donnée
  11.     if( inserer_commande($_POST)!=false )
  12.     {
  13. $livraison = calculer_livraison($_SESSION['caddy'], $id_pays );
  14. afficher_livraison($livraison);
  15. $_SESSION['prix_general']=$livraison+$_SESSION['prix_total'];
  16. affiche_somme_total();
  17. //echo print_r($_SESSION);
  18. }}
  19. ?>


mais si je veux inserer inserer la commande dans ma base de donnée, tout fonctionne sauf pour $test qui est egal a $_SESSION['prix_general'];, il iinsere comme valeur 0.00

Code :
  1. <?php
  2. function inserer_commande($commande_details)
  3. {
  4.   extract($commande_details);
  5.   $query = "insert into commandes values
  6.             ('', $client_id, ".$_SESSION['prix_general'].", '$test', '$nom', '$prenom')";
  7.   $result = mysql_query($query);
  8.   if (!$result)
  9.     return false;
  10.   $query = "select commande_id from commandes where
  11.                client_id = $client_id and
  12.                calcul > ".$_SESSION['prix_general']."-.001 and calcul < ".$_SESSION['prix_general']."+.001 and
  13.                calcul_livraison = '$test' and
  14.                nom = '$nom' and prenom = '$prenom' ";
  15.   $result = mysql_query($query);
  16.   if(mysql_numrows($result)>0)
  17.     $commande_id = mysql_result($result, 0, 'commande_id');
  18.   else
  19.     return false;
  20. ?>


0.00 qu'on retrouve dans le caddie parce que si je ne declare pas $_SESSION['prix_general'] ='0.00'; alors  ma fonction affiche_somme_total ne marche pas
j'ai un Undefined index: prix_general a la ligne $test = $_SESSION['prix_general']; de la page recap.php
et ne peut donc pas le recuperer exemple :
Array ( [caddy] => Array ( [1] => 1 ) [produits] => 1 [prix_total] => 200000000 )
 

Code :
  1. //caddie.php
  2. <?php
  3.   session_start();
  4.   @ $new = $_GET['new'];
  5. if($new)
  6.   {
  7.     if(!isset($_SESSION['caddy']))
  8.     {
  9.       $_SESSION['caddy'] = array();
  10.       $_SESSION['produits'] = 0;
  11.       $_SESSION['prix_total'] ='0.00';
  12.       $_SESSION['prix_general'] ='0.00';
  13.     }
  14.     if(isset($_SESSION['caddy'][$new]))
  15.       $_SESSION['caddy'][$new]++;
  16.     else
  17.     $_SESSION['caddy'][$new] = 1;)
  18.     $_SESSION['prix_total'] = calculer_prix($_SESSION['caddy']);
  19.     $_SESSION['produits'] = calculer_produits($_SESSION['caddy']);
  20.   }
  21.   if(isset($_POST['save']))
  22.   { 
  23.     foreach ($_SESSION['caddy'] as $ref => $quantite)
  24.     {
  25.       if($_POST['referenceno'.$ref]=='0')
  26.         unset($_SESSION['caddy'][$ref]);
  27.       else
  28.         $_SESSION['caddy'][$ref] = $_POST['referenceno'.$ref];
  29.     }
  30.     $_SESSION['prix_total'] = calculer_prix($_SESSION['caddy']);
  31.     $_SESSION['produits'] = calculer_produits($_SESSION['caddy']);
  32.   }
  33.   if($_SESSION['caddy']&&array_count_values($_SESSION['caddy']))
  34.     afficher_caddy($_SESSION['caddy']);
  35. ?>


 
voila j'espere avoir ete clair, je n'arrive pas du tout a trouver mon erreur ... merci de votre aide
 
ps : si vous avez besoin d'infos complementaires n'hesitez pas !
 
merci


Message édité par attentio le 24-03-2005 à 21:09:43

---------------
L'ordinateur a de la mémoire mais aucun souvenir ...
Reply

Marsh Posté le 05-10-2004 à 16:05:58   

Reply

Marsh Posté le 05-10-2004 à 17:30:30    

Bon, là, faudrait quand même que tu lises les réponses qu'on te donne à tes (nombreux) autres topics concernant le même problème :
 
Comment veux tu que php utilise $_SESSION['prix_général'] à la ligne 12 alors qu'il ne sera défini qu'à la ligne 16 de recap.php ? Si tu as toujours pas compris où est le problème, sérieux, on peut absolument rien pour toi.

Reply

Marsh Posté le 05-10-2004 à 18:05:30    

je suis desolé .. je les ai lu  :ouch: ... mais moi etre debutant donc moi pas toujours comprendre  du premier coup:(  
 
alors si je comprends a peu pret :
cela signifie que je dois metre prix_general avant le if, non???
ce qui donne :

Code :
  1. $_SESSION['prix_general']=$livraison+$_SESSION
  2. if( inserer_commande($_POST)!=false )
  3.     {
  4. [...]
  5.     }


mais si je fais ca j'ai un Undefined variable: test dans la fonction inserer_commande et le calcul ne se fait donc plus dans affiche_somme_total();  
 
...(mais qu'il est bete!!!...mais qu'il est bete!!!)
 
voila, donc explique moi precisemment ce que je dois faire(tu me l'a sans doute deja expliqué)mais ne comprends  pas  ( rassure toi : G tous les neuronnes ! :pt1cable: )
 
merci encore a toi de ta patience

Reply

Marsh Posté le 05-10-2004 à 19:15:42    

Non, mais c'est la logique même de ton script qui est boiteux,  ça ira presque plus vite de le recommencer que de le corriger :)
 
Regarde :
1. Tu insères ta commande en utilisant $_SESSION['prix_general'] mais tu ne définis celui çi qu'après l'insertion
2. En calculant $_SESSION['prix_general'] comme tu le fais dans ta réponse, tu utilises $livraison qui ne sera lui aussi défini que plus tard
3. Ton $test ne sert strictement à rien dans ta fonction, il est normal que php ne le trouve pas, tu ne le passes ni en argument, ni comme variable globale.
4. Pas la peine de passer $_POST comme argument d'une fonction, c'est un tableau global :)
5. C'est plus rapide de faire if(inserer_commande()) que if(inserer_commande()!=false)
6. print_r est une instruction provoquant un affichage, mettre un echo juste devant ne sert pas à grand chose :)
 
Bref, reprends les choses depuis une page blanche et fait les choses dans l'ordre :
a)De quoi as-tu besoin pour l'insertion dans la db ?
b)Qu'est ce que tu as déjà au début du script et que dois-tu calculer ? As-tu les infos qu'il te faut pour les calculs ?
c)Au moment de l'insertion, as-tu toutes les données que tu as listée en a ?
 
Et en y allant étape par étape, tu comprendras mieux ce que tu fais, pourquoi tu dois le faire (et ce sera bien mieux pour le futur que si je te donne une solution toute faite :))

Reply

Marsh Posté le 05-10-2004 à 20:16:46    

MERCI ... C vraiment gentil !!! :D  
 
bilan des choses (dis moi ce qu'il va pas):  
 1 - en ce qui concerne la page recap.php
J'ai fait

Code :
  1. <?
  2.   if($_SESSION['caddy']&&$nom&&$prenom)
  3.   {
  4.   $livraison = calculer_livraison($_SESSION['caddy'], $id_pays );
  5.   $_SESSION['prix_general']=$livraison+$_SESSION['prix_total'];
  6.     if( inserer_commande())
  7.     {
  8. afficher_caddy($_SESSION['caddy'], false, 1);
  9. afficher_livraison($livraison);
  10. affiche_somme_total();
  11.     }
  12. else
  13. echo'ca marche pas';
  14. }


...bien entendu ca m'ecrit "ca marche pas" :fou: .j'ai poutant mis les choses a plat comme tu m'as conseillé(j'ai meme parlé a voix haute  :pt1cable: )
rien a faire!!!
 
2 - en ce qui concerne print_r, je savais pas ...merci!
3 - j'ai viré mon $test qui en effet ne servait a rien
 
 ....  etc etc
merci encore de ton aide
 
ps : dis moi tout :sol:  

Reply

Marsh Posté le 05-10-2004 à 20:57:07    

7. utilise mysql_insert_id à la place du select et du test dans la fonction inserer_commande (j'imagines que tu veux récupérer l'id de la ligne que tu viens d'ajouter ? :))
 
Bon, pour ton problème, est ce que ton enregistrement est bien inséré dans ta db ? si non, fait un echo du $query d'insertion pour vérifier que la requête est correcte, si oui, euh, le remplacement suggéré en 7 devrait résoudre le problème :)

Reply

Marsh Posté le 05-10-2004 à 21:34:25    

... et bien en faite mon enregistrement ne peut etre inséré comme c'est des l'ouverture de la page recap.php (celle qui affiche le recapitulatif de la commande)que ca bug ... chose que je n'avait pas avant quand tout etait dans le if( inserer_commande($_POST))  ... je vois pas :??:

Reply

Marsh Posté le 05-10-2004 à 21:49:10    

et si je remplace le select par mysql_insert_id j'ai un
Warning: mysql_numrows(): supplied argument is not a valid MySQL result resource

Reply

Marsh Posté le 05-10-2004 à 22:10:01    

attentio a écrit :

... et bien en faite mon enregistrement ne peut etre inséré comme c'est des l'ouverture de la page recap.php (celle qui affiche le recapitulatif de la commande)que ca bug ...  


 
Oui, bon, et le echo de la requête il donne quoi ? :)
 

Citation :

et si je remplace le select par mysql_insert_id j'ai un
Warning: mysql_numrows(): supplied argument is not a valid MySQL result resource


 
RTFM
mysql_insert_id remplace TOUTE ta structure select + test
 
Là, à l'heure actuelle, ton code devrait être

Code :
  1. /**
  2. * Insère la commande dans la db
  3. * Retourne l'id de la commande si ok
  4. * Retourne false sinon
  5. */
  6. function inserer_commande($commande_details)
  7. {
  8.   extract($commande_details); // j'aime pas cette manière de faire :)
  9.   $query = "insert into commandes values
  10.             ('', $client_id, ".$_SESSION['prix_general'].", '$test', '$nom', '$prenom')";
  11.   echo $query;
  12.   $result = mysql_query($query);
  13.   if (!$result){
  14.     return false;
  15.   }
  16.   if($commande_id = mysql_insert_id()){
  17.     return $commande_id;
  18.   } else {
  19.     return false;
  20.   }
  21. }


Message édité par naceroth le 05-10-2004 à 22:10:58
Reply

Marsh Posté le 05-10-2004 à 22:31:34    

et bien en fait je ne vois pas vraiment de koi tu parles quand tu me kose de test etant donné que je l'ai viré comme elle servait a rien :sarcastic:  
ma fonction est un peu plus complexe que ca, la voici dans son integralité (avec des selects) :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:  

Code :
  1. <?
  2. function inserer_commande($commande_details)
  3. {
  4. extract($commande_details);
  5.   //si l'adresse de livraison est la meme que l'adresse de facturation
  6.   if(!$nom_livraison&&!$prenom_livraison&&!$adresse_livraison&&!$mail_livraison&&!$telephone_livraison&&!$civile_livraison&&!$ville_livraison&&!$etat_livraison&&!$cp_livraison&&!$pays_livraison)
  7.   {
  8.     $nom_livraison = $nom;
  9. $prenom_livraison = $prenom;
  10.     $adresse_livraison = $adresse;
  11. $mail_livraison = $mail;
  12. $telephone_livraison = $telephone;
  13. $civile_livraison = $civile;
  14.     $ville_livraison = $ville;
  15.     $etat_livraison = $etat;
  16.     $cp_livraison = $cp;
  17.     $pays_livraison = $pays;
  18.   }
  19.   $conn = db_connect();
  20.   //inserer l'adresse d'un client
  21.   $query = "select client_id from clients where 
  22.             nom = '$nom' and prenom = '$prenom' and adresse = '$adresse' and mail = '$mail' and telephone = '$telephone' and civile = '$civile'
  23.             and ville = '$ville' and etat = '$etat'
  24.             and cp = '$cp' and pays = '$pays'";
  25.   $result = mysql_query($query);
  26.   if(mysql_numrows($result)>0)
  27.   {
  28.     $client_id = mysql_result($result, 0, 'client_id');
  29.   }
  30.   else
  31.   {
  32.     $query = "insert into clients values
  33.             ('', '$nom','$prenom','$adresse','$mail','$telephone','$civile','$ville','$etat','$cp','$pays')";
  34.     $result = mysql_query($query);
  35.     if (!$result)
  36.        return false;
  37.   }
  38.   $query = "select client_id from clients where 
  39.             nom = '$nom' and prenom = '$prenom' and adresse = '$adresse' and mail = '$mail' and telephone = '$telephone' and civile = '$civile'
  40.             and ville = '$ville' and etat = '$etat'
  41.             and cp = '$cp' and pays = '$pays'";
  42.   $result = mysql_query($query);
  43.   if(mysql_numrows($result)>0)
  44.     $client_id = mysql_result($result, 0, 'client_id');
  45.   else
  46.     return false;
  47.   $date = date('Y-m-d');
  48.   $query = "insert into commandes values
  49.             ('', $client_id, ".$_SESSION['prix_total'].", ".$_SESSION['prix_general'].",'$date', 'PARTIAL', '$nom_livraison','$prenom_livraison',
  50.              '$adresse_livraison','$mail_livraison','$telephone_livraison','$civile_livraison','$ville_livraison','$etat_livraison','$cp_livraison',
  51.               '$pays_livraison')";
  52.   $result = mysql_query($query);
  53.   if (!$result)
  54.     return false;
  55.   $query = "select commande_id from commandes where
  56.                client_id = $client_id and
  57.                calcul > ".$_SESSION['prix_total']."-.001 and
  58.                calcul < ".$_SESSION['prix_total']."+.001 and
  59.                calcul_livraison > ".$_SESSION['prix_general']."-.001 and
  60.                calcul_livraison < ".$_SESSION['prix_general']."+.001 and
  61.              
  62.        
  63.        
  64.                date = '$date' and
  65.                etat = 'PARTIAL' and
  66.                nom_livraison = '$nom_livraison' and
  67.      prenom_livraison = '$prenom_livraison' and
  68.                adresse_livraison = '$adresse_livraison' and
  69.      mail_livraison = '$mail_livraison' and
  70.      telephone_livraison = '$telephone_livraison' and
  71.      civile_livraison = '$civile_livraison' and
  72.                ville_livraison = '$ville_livraison' and
  73.                etat_livraison = '$etat_livraison' and
  74.                cp_livraison = '$cp_livraison' and
  75.                pays_livraison = '$pays_livraison'";
  76.   $result = mysql_query($query);
  77.   if(mysql_numrows($result)>0)
  78.     $commande_id = mysql_result($result, 0, 'commande_id');
  79.   else
  80.     return false;
  81.   // insere chaque article
  82.   foreach($_SESSION['caddy'] as $ref => $quantite)
  83.   {
  84.     $detail = recuperer_article_details($ref);
  85.     $query = "delete from commande_articles where 
  86.               commande_id = '$commande_id' and ref =  '$ref'";
  87.     $result = mysql_query($query);
  88.     $query = "insert into commande_articles values
  89.               ('$commande_id', '$ref', ".$detail['prix'].", $quantite)";
  90.     $result = mysql_query($query);
  91.     if(!$result)
  92.       return false;
  93.   }
  94.   return $commande_id;
  95. }
  96. ?>


 

Reply

Marsh Posté le 05-10-2004 à 22:31:34   

Reply

Marsh Posté le 05-10-2004 à 23:01:56    

Non mais là, ça devient n'importe quoi, je veux bien aider, mais faudrait voir à pas te foutre du monde non plus, on ne va pas deviner les infos que tu juges pas utile de donner...
 
Et tu peux garder ce genre de commentaire :

Citation :


et bien en fait je ne vois pas vraiment de koi tu parles quand tu me kose de test etant donné que je l'ai viré comme elle servait a rien


 
parce que mon ami, je te kosais du test (oui, un IF c'est à ça que ça sert...), pas d'une variable $test...

Reply

Marsh Posté le 06-10-2004 à 00:09:25    

je suis vraiment désolé  :( ...je pensais bien faire en ne mettant pas toute la fonction(15 km de code ca peut effrayer) quant au test on s'est mal compris ... excuse moi ...


Message édité par attentio le 06-10-2004 à 01:22:17
Reply

Marsh Posté le 06-10-2004 à 02:04:17    

...pour en revenir a mon probleme (si tu est bien daccord pour m'aider,STP :ange: )je ne pense pas que ca vienne de inserer_commande mais plutot de cette foutue variable prix_general:
avant j'avais :

Code :
  1. //
  2. //page recap.php
  3. //
  4. <?
  5.     if( inserer_commande($_POST))
  6.     {
  7. afficher_caddy($HTTP_SESSION_VARS['caddy'], false, 0);
  8. afficher_livraison(calculer_livraison());
  9.     }
  10. ?>
  11. //
  12. //fonction inserer_commande
  13. //
  14. <?
  15. ...
  16.   $query = "select commande_id from commandes where
  17. client_id = $client_id and
  18. calcul > ".$HTTP_SESSION_VARS['prix_total']."-.001 and
  19. calcul < ".$HTTP_SESSION_VARS['prix_total']."+.001 and
  20. calcul_livraison> ".$HTTP_SESSION_VARS['prix_total']."-.001 and
  21. calcul_livraison < ".$HTTP_SESSION_VARS['prix_total']."+.001 and ...
  22. ?>


...tout marchait, sauf qu'il ne m'inserais que la somme du caddie
 
 
donc maintenant G un truc du genre

Code :
  1. //
  2. //page recap.php
  3. //
  4. <?
  5. ...
  6. $livraison = calculer_livraison($_SESSION['caddy'], $id_pays );
  7. $_SESSION['prix_general']=$livraison+$_SESSION['prix_total'];
  8.     if( inserer_commande($_POST))
  9.     {
  10. afficher_caddy($_SESSION['caddy'], false, 1);
  11. afficher_livraison($livraison);
  12. affiche_somme_total();
  13.     }
  14. ?>
  15. //
  16. //fonction inserer_commande
  17. //
  18. <?
  19. ...
  20.   $query = "select commande_id from commandes where
  21. client_id = $client_id and
  22. calcul > ".$HTTP_SESSION_VARS['prix_total']."-.001 and
  23. calcul < ".$HTTP_SESSION_VARS['prix_total']."+.001 and
  24. calcul_livraison> ".$HTTP_SESSION_VARS['prix_general']."-.001 and
  25. calcul_livraison < ".$HTTP_SESSION_VARS['prix_general']."+.001 and ...
  26. ?>


... et il me fait un sale coup  :fou:  
 
donc petite reflexion de ma part,  :??:  est ce que ca ne peut pas venir des arguments passés dans la fonction? parce que $_post recupere actuellement les donnees qui ont ete precedament passé dans un formulaire  
 
ancien code complet de la page recap.php

Code :
  1. <?
  2.   session_start();
  3.   $nom = $HTTP_POST_VARS['nom'];
  4.   $adresse = $HTTP_POST_VARS['adresse'];
  5.   $ville = $HTTP_POST_VARS['ville'];
  6.   $cp = $HTTP_POST_VARS['cp'];
  7.   $pays = $HTTP_POST_VARS['pays'];
  8.   if($HTTP_SESSION_VARS['caddy']&&$nom&&$adresse&&$ville&&$cp&&$pays)
  9.   {
  10.     if( inserer_commande($HTTP_POST_VARS)!=false )
  11.     {
  12.       afficher_caddy($HTTP_SESSION_VARS['caddy'], false, 0);
  13.       afficher_livraison(calculer_livraison()); 
  14.     }
  15.     else
  16.     {
  17.       echo 'ya pb avec inserer commande';
  18.     }
  19.   }
  20.   else
  21.   {
  22.     echo 'ya pb';
  23.   }
  24. ?>


 
merci encore mille fois


Message édité par attentio le 06-10-2004 à 02:07:52
Reply

Marsh Posté le 06-10-2004 à 03:08:01    

INFORMATION POSITIVE !!!!
en fesant :

Code :
  1. <?
  2. $livraison = calculer_livraison($_SESSION['caddy'], $id_pays );
  3. $_SESSION['prix_general']=$livraison+$_SESSION['prix_total'];
  4. // si le formulaire est rempli
  5.   if($_SESSION['caddy']&&$nom&&$prenom&&$adresse&&$mail&&$telephone&&$civile&&$ville&&$cp&&$pays)
  6.   {
  7. // on peut inserer les données dans la base de donnée
  8.     if( inserer_commande($_POST))
  9.     {
  10.    afficher_caddy($_SESSION['caddy'], false, 1);
  11.       afficher_livraison($livraison);
  12.       affiche_somme_total();
  13.     }
  14.     else
  15.     {
  16.       echo 'probleme avec inserer_commander';
  17. }
  18.   }
  19. else
  20.   {
  21. echo 'ca marche pas';
  22.   }


j'arrive a inserer une commande ...mais par contre il m'affiche toujours
'probleme avec inserer_commander'.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed