Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème id dans un script.

    3 août 2018 à 18:37:20

    Salut à tous, petit problème dans mon script que je viens de me rendre compte et que malheureusement je ne comprends pas !

    Cela ne me semble pas logique que mon script fasse cela.. 

    Donc voila mon script : 

    if (date('t') == date('d')){
     
    	$date = date('d'); 
     
    	$stmtUsers = $db->query("SELECT user_id from TAB where date >= '$date'");
    	$user_ids= $stmtUsers->fetchAll(PDO::FETCH_COLUMN, 0);
     
    	// pour chaque utilisateur dont la date de renouvellement est plus tard que le dernier jour du mois actuel
    	foreach ($user_ids as $user_id) {
    	    //Selection du prix de l'objet par rapport au numéro client
    	    $select = $db->query("SELECT prix FROM TAB WHERE user_id='$user_id'");
    	    $r = $select->fetch(PDO::FETCH_OBJ);
    	    $price = $r->prix;
     
    	    // Modification du solde de l'user
    	    $selectsolde = $db->query("SELECT solde FROM users WHERE id='$user_id'");
    	    $r2 = $selectsolde->fetch(PDO::FETCH_OBJ);
    	    $solde = $r2->solde;
    	    $soldenew = $solde-$price;
    	    $update = $db->query("UPDATE users SET solde='$soldenew' WHERE id='$user_id'");
    
    
    	    $price2 ='-'.$price;
    	    
    	    date_default_timezone_set('Europe/Paris');
    		setlocale(LC_TIME, 'fr_FR.utf8','fra');
    		$date2 = strftime('%Y/%m/%d 23:59:59');
    	    $db->query("INSERT INTO transactions (name, street, city, country, date, transaction_id, amount, currency_code, user_id, raison) VALUES('NA', 'NA', 'NA', 'NA', '$date2', 'Débit', '$price2', 'NA', '$user_id' ,'RENEW')");
    
    
    
    
    
    
    	    
    
    
    
    
    
    	}}else{
     
    		$date = date('d');
    		$stmtUsers = $db->query("SELECT user_id from TAB where date = '$date'");
    		$user_ids= $stmtUsers->fetchAll(PDO::FETCH_COLUMN, 0);
     
    	// pour chaque utilisateur dont la date de renouvellement est aujourd'hui
    	foreach ($user_ids as $user_id) {
    	    //Selection du prix de l'objet par rapport au numéro client
    	    $select = $db->query("SELECT prix FROM TAB WHERE user_id='$user_id'");
    	    $r = $select->fetch(PDO::FETCH_OBJ);
    	    $price = $r->prix;
     
    	    // Modification du solde du client
    	    $selectsolde = $db->query("SELECT * FROM users WHERE id='$user_id'");
    	    $r2 = $selectsolde->fetch(PDO::FETCH_OBJ);
    	    $solde = $r2->solde;
     
    	    $soldenew = $solde-$price;
    	    $update = $db->query("UPDATE users SET solde='$soldenew' WHERE id='$user_id'");
    
    
    	   
    
    
    	    $price2 ='-'.$price;
    	    //TEST
    	    date_default_timezone_set('Europe/Paris');
    		setlocale(LC_TIME, 'fr_FR.utf8','fra');
    		$date2 = strftime('%Y/%m/%d 23:59:59');
    	    $db->query("INSERT INTO transactions (name, street, city, country, date, transaction_id, amount, currency_code, user_id, raison) VALUES('NA', 'NA', 'NA', 'NA', '$date2', 'Débit', '$price2', 'NA', '$user_id' ,'RENEW')");
    
    
    	    
     
     
     
    	}}

    Résumé : Le script s'occupe d'abaisser le solde de l'user lorsque l'on le lance, il vérifie alors que l'on" est le jour egal à aujourd'hui".

    Le problème : 

     Dans ma table "TAB" j'ai deux lignes avec le même ID ! Mais dont le prix est différent, et malheureusement le problème n'est pas qu'il n’exécute pas son traitement , mais qu'il execute son traitement avec le prix de la première ligne ! 

    Et par conséquent ma question est " Quel est la partie du code dans mes requêtes causant la non récupération du prix de la nouvelle ligne concernée.. " ?

    Merci !

    • Partager sur Facebook
    • Partager sur Twitter
      5 août 2018 à 10:36:15

      Bonjour,

      On pourrait beaucoup simplifier ton code, mais pour ton problème en particulier, ton résultat est normal dans la mesure où tu ne boucles pas sur cette requête :

         $select = $db->query("SELECT prix FROM TAB WHERE user_id='$user_id'");

      Donc forcément tu ne récupères que la première ligne.

      • Partager sur Facebook
      • Partager sur Twitter
        5 août 2018 à 12:33:34

        Heu, donc si j'ai bien compris il faudrait faire une nouvelle boucle for earch avec cette requête ?

        Beaucoup le simplifier ? Je suis ouvert :)

        • Partager sur Facebook
        • Partager sur Twitter
          5 août 2018 à 15:14:05

          Et bien déjà tu pourrais faire les deux premières requêtes en une seule :

          <?php $stmtUsers = $db->query("SELECT user_id, prix from TAB where date >= '$date'");
            
              // pour chaque utilisateur dont la date de renouvellement est plus tard que le dernier jour du mois actuel
          while($r = $select->fetch(PDO::FETCH_OBJ) {
          $price = $r->prix;
          $user_id = $r->user_id;
          Ensuite, si tu as des prix différents pour le même user_id, comme tu gères le solde ?

          -
          Edité par philodick 5 août 2018 à 15:14:27

          • Partager sur Facebook
          • Partager sur Twitter
            5 août 2018 à 15:24:48

            La table TAB regroupe les services souscrits par l'user_id.

            Donc si l'utilisateurs à souscrits à deux services alors chaque mois, son solde est débité de chacuns de ses services.

            Donc avec mon code actuel il est bien débité de ses services mais le problème est qu'il est débité du prix du service 1 car le prix n'est pas re selectionné.

            En premier mon but n'est pas de le réduire mais simplement de le rendre fonctionnel..

            • Partager sur Facebook
            • Partager sur Twitter
              5 août 2018 à 15:32:11

                      $selectsolde = $db->query("SELECT * FROM users WHERE id='$user_id'");
                      while($r2 = $selectsolde->fetch(PDO::FETCH_OBJ)) {
                      $solde = $r2->solde;
                
                      $soldenew = $solde-$price;
                      $update = $db->query("UPDATE users SET solde='$soldenew' WHERE id='$user_id'");
              Ton but devrait toujours être d'améliorer ton code.
              • Partager sur Facebook
              • Partager sur Twitter
                5 août 2018 à 15:33:40

                Mon but est d'améliorer mon code ! Mais on m'a toujours dis qu'il vaut mieux quelque chose qui fonctionne que quelque chose de beau ;).

                Une fois qu'il fonctionnera alors on passera à l'esthétique ;)

                • Partager sur Facebook
                • Partager sur Twitter
                  5 août 2018 à 15:37:57

                  On est un peu que dans l'esthétique là, mais bon... ça fonctionne comme tu veux alors ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 août 2018 à 15:40:46

                    if (date('t') == date('d')){
                     
                    	$date = date('d'); 
                     
                    	$stmtUsers = $db->query("SELECT user_id, prix from TAB where date >= '$date'");
                       
                        // pour chaque utilisateur dont la date de renouvellement est plus tard que le dernier jour du mois actuel
                    		while($r = $select->fetch(PDO::FETCH_OBJ) {
                    		$price = $r->prix;
                    		$user_id = $r->user_id;
                     
                    	    // Modification du solde du client
                    	    $selectsolde = $db->query("SELECT * FROM users WHERE id='$user_id'");
                    		while($r2 = $selectsolde->fetch(PDO::FETCH_OBJ)) {
                    		$solde = $r2->solde;
                    		 
                    		$soldenew = $solde-$price;
                    		$update = $db->query("UPDATE users SET solde='$soldenew' WHERE id='$user_id'");
                    
                    
                    	    $price2 ='-'.$price;
                    	    //TEST
                    	    date_default_timezone_set('Europe/Paris');
                    		setlocale(LC_TIME, 'fr_FR.utf8','fra');
                    		$date2 = strftime('%Y/%m/%d 23:59:59');
                    	    $db->query("INSERT INTO transactions (name, street, city, country, date, transaction_id, amount, currency_code, user_id, raison) VALUES('NA', 'NA', 'NA', 'NA', '$date2', 'Débit', '$price2', 'NA', '$user_id' ,'Renouvellement Seedbox')");
                    
                    
                    
                    
                    
                    
                    	    //END
                    
                    
                    
                    
                    
                    	}}

                    Si j'apporte les modifications que tu m'a proposé on est d'accord que le code donne cela ou non ?

                    Après avoir essayé je tombe sur une erreur HTTP 500.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      5 août 2018 à 16:12:51

                      Avec la parenthèse l'erreur est identique
                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 août 2018 à 17:02:49

                        Après un tas de tentatives, il reste toujours un coquillage dans le potager.

                        if (date('t') == date('d')){
                         
                        	$date = date('d'); 
                         
                        	$stmtUsers = $db->query("SELECT user_id from TAB where date >= '$date'");
                        	$user_ids= $stmtUsers->fetchAll(PDO::FETCH_COLUMN, 0);
                         
                        	// pour chaque utilisateur dont la date de renouvellement est plus tard que le dernier jour du mois actuel
                        	foreach ($user_ids as $user_id) {
                        	    //Selection du prix de l'objet par rapport au numéro client
                        	    $select = $db->query("SELECT prix FROM TAB WHERE user_id='$user_id'");
                        	    $r = $select->fetch(PDO::FETCH_OBJ);
                        	    $price = $r->prix;
                         
                        	    // Modification du solde du client
                        	    $selectsolde = $db->query("SELECT solde FROM users WHERE id='$user_id'");
                        	    $r2 = $selectsolde->fetch(PDO::FETCH_OBJ);
                        	    $solde = $r2->solde;
                        	    $soldenew = $solde-$price;
                        	    $update = $db->query("UPDATE users SET solde='$soldenew' WHERE id='$user_id'");
                        
                        
                        	    $price2 ='-'.$price;
                        	    //TEST
                        	    date_default_timezone_set('Europe/Paris');
                        		setlocale(LC_TIME, 'fr_FR.utf8','fra');
                        		$date2 = strftime('%Y/%m/%d 23:59:59');
                        	    $db->query("INSERT INTO transactions (name, street, city, country, date, transaction_id, amount, currency_code, user_id, raison) VALUES('NA', 'NA', 'NA', 'NA', '$date2', 'Débit', '$price2', 'NA', '$user_id' ,'Renouvellement')");
                        
                        
                        
                        
                        
                        
                        	    //END
                        
                        
                        
                        
                        
                        	}}else{
                         
                        		
                            $date = date('d');
                          
                            $stmtUsers = $db->query("SELECT user_id, prix from TAB where date = '$date'");
                            
                            // pour chaque utilisateur dont la date de renouvellement est plus tard que le dernier jour du mois actuel
                                while($r = $select->fetch(PDO::FETCH_OBJ)) {
                                $price = $r->prix;
                                $user_id = $r->user_id;
                          
                                // Modification du solde du client
                                $selectsolde = $db->query("SELECT * FROM users WHERE id='$user_id'");
                                while($r2 = $selectsolde->fetch(PDO::FETCH_OBJ)) {
                                $solde = $r2->solde;
                                  
                                $soldenew = $solde-$price;
                                $update = $db->query("UPDATE users SET solde='$soldenew' WHERE id='$user_id'");
                         
                         
                                $price2 ='-'.$price;
                                //TEST
                                date_default_timezone_set('Europe/Paris');
                                setlocale(LC_TIME, 'fr_FR.utf8','fra');
                                $date2 = strftime('%Y/%m/%d 23:59:59');
                                $db->query("INSERT INTO transactions (name, street, city, country, date, transaction_id, amount, currency_code, user_id, raison) VALUES('NA', 'NA', 'NA', 'NA', '$date2', 'Débit', '$price2', 'NA', '$user_id' ,'Renouvellement Seedbox')");
                         
                         
                         
                         
                         
                         
                                //END
                         
                         
                         
                         
                         }}}

                        Le script plante toujours et uniquement lorsque j'y met ta partie, l'erreur est toujours "HTTP ERROR 500"

                        EDIT : Pour info il plante dès le premier while (while($r$select->fetch(PDO::FETCH_OBJ)) {)

                        EDIT : Nickel il me semble que sa fonctionne à merveille !

                        PS : l'erreur est bien au premier while, ce n'est pas select mais stmtUsers ;)    

                        Je confirme sa fonctionne nickel ! Merci beaucoup :)

                        -
                        Edité par WhisperDark 5 août 2018 à 18:38:17

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Problème id dans un script.

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown