IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

boucle défaillante (déstockage après commande)


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 97
    Par défaut boucle défaillante (déstockage après commande)
    Bonjour,

    J'ai ouvert une discussion sur le forum débutant, mais comme ça ne donne rien depuis plusieurs jours je me permet d'exposer mon problème ici.


    J'aimerai obtenir ceci :

    1- sélectionner les lignes de la table ligne_commande cad récupérer les produits de la dernière commande d'un client donné.

    2- pour chaque produit commandé : diminuer la quantité en stock de la taille commandée.

    J'arrive à le faire pour 1 mais dès que j'insère ma boucle ça fonctionne sauf pour le premier produit de la commande.
    (j'ai testé avec un ORDER BY id DESC et ASC : c'est le même produit qui n'est pas traité.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    $order_id = 146;
    mysql_select_db($database_xxx, $xxx);
    $query_num = sprintf("SELECT ligne_commande.*, produit.* 
    					FROM ligne_commande 
    					INNER JOIN produit 
    					ON produit.id = ligne_commande.produit 
    					WHERE ligne_commande.num_commande = ". $order_id ." 
    					ORDER BY ligne_commande.id ASC");
    $num = mysql_query($query_num, $xxx) or die(mysql_error());
    $row_num = mysql_fetch_assoc($num);
     
    $totalRows_num = mysql_num_rows($num);
    echo ' nombres darticles ';
    echo $totalRows_num ;
     
    $compteurlignes = 0;
     
    while ($compteurlignes < $totalRows_num) {	
     
    echo ' nb compteur ';
    echo $compteurlignes ;
     
    if ($row_num['taille'] == "unique"){
    $stock_tu = $row_num['taille_unique'] - $row_num['quantite'];
    $prdt_tu = $row_num['id'];
    $query_tu = sprintf("UPDATE produit SET taille_unique=%s WHERE id=%s",
                           GetSQLValueString($stock_tu, "int"),
                           GetSQLValueString($prdt_tu, "int"));
      mysql_select_db($database_xxx, $xxx);
      $Result2 = mysql_query($query_tu, $xxx) or die(mysql_error());
     
      echo 'TU ok <br>';
    }
     
    if ($row_num['taille'] == "36 (XS"){
    $stock_36 = $row_num['36_XS'] - $row_num['quantite'];
    $prdt_36 = $row_num['id'];
    $query_36 = sprintf("UPDATE produit SET 36_XS=%s WHERE id=%s",
                           GetSQLValueString($stock_36, "int"),
                           GetSQLValueString($prdt_36, "int"));
      mysql_select_db($database_xxx, $xxx);
      $Result3 = mysql_query($query_36, $xxx) or die(mysql_error());
     
      echo '36 ok <br>';
    }
     
    if ($row_num['taille'] == "38 (S)"){
    $stock_38 = $row_num['38_S'] - $row_num['quantite'];
    echo 'npuveau stock en 38';
    echo $stock_38 ;
    $prdt_38 = $row_num['id'];
    $query_38 = sprintf("UPDATE produit SET 38_S=%s WHERE id=%s",
                           GetSQLValueString($stock_38, "int"),
                           GetSQLValueString($prdt_38, "int"));
      mysql_select_db($database_xxx, $xxx);
      $Result4 = mysql_query($query_38, $xxx) or die(mysql_error());
     
    echo '38 ok <br>';
    }
     
    if ($row_num['taille'] == "40 (M)"){
    $stock_40 = $row_num['40_M'] - $row_num['quantite'];
    $prdt_40 = $row_num['id'];
    $query_40 = sprintf("UPDATE produit SET 40_M=%s WHERE id=%s",
                           GetSQLValueString($stock_40, "int"),
                           GetSQLValueString($prdt_40, "int"));
      mysql_select_db($database_xxx, $xxx);
      $Result5 = mysql_query($query_40, $xxx) or die(mysql_error());
     
    echo '40 ok <br>';
    }
     
    if ($row_num['taille'] == "42 (L)"){
    $stock_42 = $row_num['42_L'] - $row_num['quantite'];
    $prdt_42 = $row_num['id'];
    $query_42 = sprintf("UPDATE produit SET 42_L=%s WHERE id=%s",
                           GetSQLValueString($stock_42, "int"),
                           GetSQLValueString($prdt_42, "int"));
      mysql_select_db($database_xxx, $xxx);
      $Result6 = mysql_query($query_42, $xxx) or die(mysql_error());
     
    echo '42 ok <br>';
    }
     
    if ($row_num['taille'] == "44 (XL"){
    $stock_44 = $row_num['44_XL'] - $row_num['quantite'];
    $prdt_44 = $row_num['id'];
    $query_44 = sprintf("UPDATE produit SET 44_XL=%s WHERE id=%s",
                           GetSQLValueString($stock_44, "int"),
                           GetSQLValueString($prdt_44, "int"));
      mysql_select_db($database_xxxk, $xxx);
      $Result7 = mysql_query($query_44, $xxx) or die(mysql_error());
    echo '44 ok <br>';
    } 
    $compteurlignes = $compteurlignes+1;
    }
    Ce qui s'affiche:
    nombres d'articles 5
    36 ok
    42 ok
    44 ok
    TU ok
    PROBLEME : Il n'y a que 4 tailles passées en revue alors qu'il y 5 produits de tailles différentes qui ont été commandés.


    Et si je remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ($row_num = mysql_fetch_assoc($num) and $compteurlignes < $totalRows_num + 1)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ($compteurlignes < $totalRows_num)
    Voici ce qui s'affiche :
    nombres d'articles 5
    38 ok
    38 ok
    38 ok
    38 ok
    38 ok
    Là ce qui marche c'est que la boucle recommence autant de fois qu'il y a de produits commandés. Mais voici les problèmes :

    n°1 : c'est que dans cette commande il y a 1 article commandé en taille 42 et 1 autre en 44. J'ai testé avec d'autres commandes et il n'y a qu' 1 ligne de commande lue (et répétée) à chaque fois.

    n°2 : le stock n'est diminué qu'une seule fois (au 1er passage de la boucle).

    Table: ligne_commande
    id.......................int(11)
    num_commande....int(10)
    produit................int(10)
    prix....................float(5,2)
    quantite..............int(11)
    taille..................varchar(6)
    ss_ss_total_ttc.....float(7,2)

    LES VALEURS DE TAILLE : "unique", "36 (XS", "38 (S)", "40 (M)", "42(L)", "44 (XL"

    Table: produit
    id......................int(20)
    ...
    taille_unique........int(11)
    36_XS................int(11)
    38_S..................int(11)
    40_M..................int(11)
    42_L...................int(11)
    44_XL.................int(11)


    Je suis coincée depuis plusieurs jours, j'aurai bien besoin d'aide...

    Merci

  2. #2
    Membre émérite Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Par défaut
    En conservant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ($row_num = mysql_fetch_assoc($num) and $compteurlignes < $totalRows_num + 1)
    (D'ailleurs, je ne suis pas sûr du "+1", ni de l'utilité du test sur $compteurlignes)

    Mais en supprimant le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $row_num = mysql_fetch_assoc($num);
    avant ce while, ça devrait mieux fonctionner.
    Fred

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 97
    Par défaut
    je l'ai déjà testé je l'ai écrit dans mon message.

    il n'y a qu' 1 ligne de commande lue (et répétée) à chaque fois et le stock n'est diminué qu'une seule fois (au 1er passage de la boucle).
    Si quelqu'un à une autre idée...

  4. #4
    Membre émérite Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Par défaut
    Citation Envoyé par Creanet Voir le message
    je l'ai déjà testé je l'ai écrit dans mon message :
    il n'y a qu' 1 ligne de commande lue (et répétée) à chaque fois et le stock n'est diminué qu'une seule fois (au 1er passage de la boucle).
    Si quelqu'un à une autre idée...
    Tu n'as pas compris ce que je te propose de faire.
    Voici ce à quoi je pensais et que tu peux copier/coller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    $order_id = 146;
    mysql_select_db($database_xxx, $xxx);
    $query_num = sprintf("SELECT ligne_commande.*, produit.* 
    					FROM ligne_commande 
    					INNER JOIN produit 
    					ON produit.id = ligne_commande.produit 
    					WHERE ligne_commande.num_commande = ". $order_id ." 
    					ORDER BY ligne_commande.id ASC");
    $num = mysql_query($query_num, $xxx) or die(mysql_error());
     
    $totalRows_num = mysql_num_rows($num);
    echo ' nombres darticles ';
    echo $totalRows_num ;
     
    $compteurlignes = 0;
     
    while ($row_num = mysql_fetch_assoc($num)) {	
     
    echo ' nb compteur ';
    echo $compteurlignes ;
     
    if ($row_num['taille'] == "unique"){
    $stock_tu = $row_num['taille_unique'] - $row_num['quantite'];
    $prdt_tu = $row_num['id'];
    $query_tu = sprintf("UPDATE produit SET taille_unique=%s WHERE id=%s",
                           GetSQLValueString($stock_tu, "int"),
                           GetSQLValueString($prdt_tu, "int"));
      mysql_select_db($database_xxx, $xxx);
      $Result2 = mysql_query($query_tu, $xxx) or die(mysql_error());
     
      echo 'TU ok <br>';
    }
     
    if ($row_num['taille'] == "36 (XS)"){
    $stock_36 = $row_num['36_XS'] - $row_num['quantite'];
    $prdt_36 = $row_num['id'];
    $query_36 = sprintf("UPDATE produit SET 36_XS=%s WHERE id=%s",
                           GetSQLValueString($stock_36, "int"),
                           GetSQLValueString($prdt_36, "int"));
      mysql_select_db($database_xxx, $xxx);
      $Result3 = mysql_query($query_36, $xxx) or die(mysql_error());
     
      echo '36 ok <br>';
    }
     
    if ($row_num['taille'] == "38 (S)"){
    $stock_38 = $row_num['38_S'] - $row_num['quantite'];
    echo 'npuveau stock en 38';
    echo $stock_38 ;
    $prdt_38 = $row_num['id'];
    $query_38 = sprintf("UPDATE produit SET 38_S=%s WHERE id=%s",
                           GetSQLValueString($stock_38, "int"),
                           GetSQLValueString($prdt_38, "int"));
      mysql_select_db($database_xxx, $xxx);
      $Result4 = mysql_query($query_38, $xxx) or die(mysql_error());
     
    echo '38 ok <br>';
    }
     
    if ($row_num['taille'] == "40 (M)"){
    $stock_40 = $row_num['40_M'] - $row_num['quantite'];
    $prdt_40 = $row_num['id'];
    $query_40 = sprintf("UPDATE produit SET 40_M=%s WHERE id=%s",
                           GetSQLValueString($stock_40, "int"),
                           GetSQLValueString($prdt_40, "int"));
      mysql_select_db($database_xxx, $xxx);
      $Result5 = mysql_query($query_40, $xxx) or die(mysql_error());
     
    echo '40 ok <br>';
    }
     
    if ($row_num['taille'] == "42 (L)"){
    $stock_42 = $row_num['42_L'] - $row_num['quantite'];
    $prdt_42 = $row_num['id'];
    $query_42 = sprintf("UPDATE produit SET 42_L=%s WHERE id=%s",
                           GetSQLValueString($stock_42, "int"),
                           GetSQLValueString($prdt_42, "int"));
      mysql_select_db($database_xxx, $xxx);
      $Result6 = mysql_query($query_42, $xxx) or die(mysql_error());
     
    echo '42 ok <br>';
    }
     
    if ($row_num['taille'] == "44 (XL"){
    $stock_44 = $row_num['44_XL'] - $row_num['quantite'];
    $prdt_44 = $row_num['id'];
    $query_44 = sprintf("UPDATE produit SET 44_XL=%s WHERE id=%s",
                           GetSQLValueString($stock_44, "int"),
                           GetSQLValueString($prdt_44, "int"));
      mysql_select_db($database_xxxk, $xxx);
      $Result7 = mysql_query($query_44, $xxx) or die(mysql_error());
    echo '44 ok <br>';
    } 
    $compteurlignes++;
    }
    J'ai supprimé le $row_num = mysql_fetch_assoc($num); que tu avais codé avant le while.
    Ce code te lisait le premier enregistrement (taille 38).
    Ensuite soit tu faisais un while ($row_num = mysql_fetch_assoc($num)) et alors ta boucle commençait avec le deuxième enregistrement (taille 36), soit tu faisais while ($compteurlignes < $totalRows_num) et là tu bouclais sur ce 1er enregistrement (taille 38) sans lire les suivants.

    Donc je me suis contenté d'une boucle while ($row_num = mysql_fetch_assoc($num)) qui cette fois-ci devrait attaquer dès le premier enregistrement.

    Et puis,
    comme j'aime bien optimiser le code,
    voici une autre version
    dans laquelle
    la mise à jour du stock se fait toujours par le même code,
    quelle que soit la taille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    $order_id = 146;
    mysql_select_db($database_xxx, $xxx);
     
    $query_num = sprintf("SELECT ligne_commande.*, produit.* 
    					FROM ligne_commande 
    					INNER JOIN produit 
    					ON produit.id = ligne_commande.produit 
    					WHERE ligne_commande.num_commande = ". $order_id ." 
    					ORDER BY ligne_commande.id ASC");
    $num = mysql_query($query_num, $xxx) or die(mysql_error());
     
    $totalRows_num = mysql_num_rows($num);
    echo ' nombres d\'articles : '.$totalRows_num.'<br/>';
     
    $compteurlignes = 0;
    $tailles = array(
    	'unique'=>'taille_unique',
    	'36 (XS)' => '36_XS',
    	'38 (S)' => '38_S',
    	'40 (M)' => '40_M',
    	'42 (L)' => '42_L',
    	'44 (XL)' => '44_XL'
    }
     
    while ($row_num = mysql_fetch_assoc($num)) {	
     
    	if (in_array($row_num['taille'],$tailles)) { 
    		echo ' nb compteur '.$compteurlignes++.' -> ';
    		$prdt = $row_num['id'];
    		$taille = $tailles[$row_num['taille']];
    		$stock = $row_num[$taille] - $row_num['quantite'];
    		$query = sprintf("UPDATE produit SET %s=%s WHERE id=%s",
    							   $taille,
    							   GetSQLValueString($stock_tu, "int"),
    							   GetSQLValueString($prdt_tu, "int"));
    		mysql_select_db($database_xxx, $xxx);
    		$Result2 = mysql_query($query, $xxx) or die(mysql_error());
    		echo $taille.' ok <br>';
    	} else {
    		echo ' taille inattendue<br/>';
    	}
    }
    Fred

Discussions similaires

  1. [MySQL] Redirection automatique après commande
    Par mikael2235 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 24/06/2010, 08h55
  2. Réponses: 7
    Dernier message: 13/05/2009, 13h02
  3. fichier vide après command cp (unix)
    Par leo77 dans le forum C
    Réponses: 6
    Dernier message: 17/04/2009, 14h57
  4. recuperation apres commande telnet
    Par eozenn dans le forum VBScript
    Réponses: 0
    Dernier message: 21/04/2008, 10h47
  5. MSGBOX aprés commande DOS
    Par urbanspike dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 27/01/2007, 08h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo