Problème de condition

Résolu/Fermé
mc69360 Messages postés 19 Date d'inscription vendredi 4 août 2017 Statut Membre Dernière intervention 9 août 2017 - 7 août 2017 à 21:51
mc69360 Messages postés 19 Date d'inscription vendredi 4 août 2017 Statut Membre Dernière intervention 9 août 2017 - 9 août 2017 à 16:31
Bonjour,

Voilà mon code:

<?php
    //Rien de reçu => on bosse pas
    if (!empty($_POST)) {
        //Je mets tout dans un T/C
        try {
            //TOUJOURS ACTIVER LES EXCEPTIONS
            $bdd = new PDO('mysql:host=localhost;dbname=crealis;charset=utf8', 'root', 'lionel0769',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
            $toutes_tables = $bdd->prepare("SELECT volume FROM table_stockage WHERE ROUND(hauteur,2) = ROUND(:hauteur,2)");
            $toutes_tables->bindParam(':hauteur',$mesure, PDO::PARAM_STR);
            $toutes_donnees = $bdd->query('SELECT * FROM stock_antigel')->fetchAll();
            $requeteUpdate = "UPDATE stock_antigel SET mesure_observee = :mesure_observee,stock_reel = :stock_reel WHERE id = :id";
            $stmt = $bdd->prepare($requeteUpdate);
            $stmt->bindParam(':mesure_observee', $mesure, PDO::PARAM_STR);
            $stmt->bindParam(':stock_reel', $stock_reel, PDO::PARAM_STR);
            $stmt->bindParam(':id', $id, PDO::PARAM_INT);
            foreach($toutes_donnees as $donnees){
                $id = $donnees['id'];
                $mesure = $_POST["mesure_observee$id"];
                $cent = $mesure * 100;
                $dernier_chiffre= substr($cent, -1);
                $checkbox = $donnees["checkbox"];
                if($checkbox == 1){
                $stock_reel = $mesure;
                }
                else{
                        if($donnees['facteur_conversion_mesureareel'] != 0){
                            $stock_reel = $mesure * $donnees['facteur_conversion_mesureareel'];
                        }
                        else{
                                $toutes_tables->execute();
                                $resultat_toutes_tables=$toutes_tables->fetchAll();
                                foreach($resultat_toutes_tables as $table){
                                    if($dernier_chiffre == 0 OR $dernier_chiffre == 5){
                                        
                                        $stock_reel = $table['volume'];
                                    }
                                    else{
                                        //$mesure = round($mesure * 20) / 20;
                                        //$stock_reel1 =$table['volume'];
                                        $stock_reel = 12;
                                    }
                                    if (is_null($stock_reel)) {
                                        throw new Exception('Pas trouvé $stock_reel (ID '.$id.')');
                                    }
                                }
                        }
               }
                //je test si $toutes_tables est exécuté sinon message d'erreur                
                if (!$stmt->execute() or !$toutes_tables->execute()) {
                    throw new Exception('ERREUR UPDATE (ID '.$_POST['id'].')');
                }
            } //fin foreach
            header('Location: index.php');
         }catch (PDOException $pdoE) {
            echo 'Exception PDO: '.$pdoE->getMessage();
        } catch (Exception $e) {
            echo 'Exception Autre: '.$e->getMessage();
        }
    }
?>


Lorsque checkbox = 0 , facteur_conversion_mesureareel = 0, je passe dans la condition
 if($dernier_chiffre == 0 OR $dernier_chiffre == 5)
, lorsque $dernier chiffre =0 0u 5 , $stock_reel est bien calculé, par contre lorsque $dernier chiffre est différent de 0 et 5, ca me retourne pas 12, mais me récupère la valeur de stock reel d'une autre id:
https://img4.hostingpics.net/pics/978553snapshot12.png

Pourriez vous m' expliquez ce qu'il se passe?

4 réponses

Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
Modifié le 8 août 2017 à 14:14
Salut,

Ta condition est correcte et je ne vois pas de problème à première vue.

Es tu sur que lorsque la variable $dernier_chiffre est différente de 0 ou 5, que les variables $checkbox et $donnees['facteur_conversion_mesureareel'] sont bien égale à 0 ?

Tu peux éventuellement afficher ces variables à la fin de la boucle pour le vérifier :
        echo 'stock_reel : ' . $stock_reel . ' checkbox : ' . $checkbox . ' facteur_conversion_mesureareel : ' . $donnees['facteur_conversion_mesureareel'] . ' dernier_chiffre : ' . $dernier_chiffre . '<br>';
    } //fin foreach
// on désactive la redirection le temps des tests
// header('Location: index.php');



Bonne journée,
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
8 août 2017 à 14:40
Bonjour,

Je vois que tu as utilisé des PREPARE ... .. mais... où se trouvent les EXECUTE ??
Ah si.. tu l'as mis
De plus.. il est conseillé de placer CHAQUE REQUETE dans un bloc TRY/CATCH différent pour mieux "tracer" où se situe l'erreur.

Ensuite... je ne comprend pas ce que tu cherches à faire avec ton code...
Surtout que tu sembles avoir à la fois un id récupéré par POST mais tu récupères aussi des id dans ta boucle while ...


Tu dois également retirer la redirection (ou la mettre en commentaire) le temps des tests ... sinon tu sera redirigé sur ton autre page sans avoir pu lire les éventuels messages d'erreur.


0
mc69360 Messages postés 19 Date d'inscription vendredi 4 août 2017 Statut Membre Dernière intervention 9 août 2017
Modifié le 8 août 2017 à 16:38
Salut jordane,
je n'ai pas de while dans mon code, je ne vois pas de quoi tu parles
Pour t' expliquer ce que je cherche à faire, c'est d' avoir une page avec la contenance de différentes cuves en litre.
Le problème c'est que toutes les cuves ne sont pas identiques et le relevé de leur valeur n'est pas identique.
- des cuves ou la hauteur est relevé par lecture direct du volume contenu, c'est la que j'utilise la checkbox pour les reconnaitre lors de la saisi dans mon formulaire ou je créé les différentes cuves.
               if($checkbox == 1){
                $stock_reel = $mesure;
                }


-des cuves ou le volume est déterminé selon une hauteur, dans ce cas je multiplie par un facteur pour connaitre le volume en litre.
                        if($donnees['facteur_conversion_mesureareel'] != 0){
                            $stock_reel = $mesure * $donnees['facteur_conversion_mesureareel'];


-des cuves dont la forme ne permet pas de calculer le volume selon une simple multiplication, je me sert de la hauteur lue et vais chercher dans un abaques qui me donne tous les 5 cm le volume:
Dans ce cas 2 possibiltés:
- la hauteur mesuré fini par 0 ou 5, je peux aller chercher la valeur directement dans ma table table_stockage:
   if($dernier_chiffre == 0 OR $dernier_chiffre == 5){
                                        
                                        $stock_reel = $table['volume'];


- la hauteiur mesuré ne fini pas par 0 ou 5, je vais donc faire un produit en croix entre ma hauteur mesuré et la hauteur de ma table la plus proche de ma mesure pour avoir une valeur du volume proche, c'est la ou tu peux lire le $stock_reel = 12; valeur que j'utilise pour mes tests.

Je ne sais pas si j'ai été bien clair ...

Quand je cherche les erreurs , je commente bien la redirection, je l'ai enlevé au moment ou j'ai copié mon code, et je n'ai aucune erreur signalé.

Enfin, oui je suis sur que checkbox et facteur de conversion sont à 0 , tu peux voir ma table dans le lien que j'ai mis dans mon premier message.

Merci pour ta réponse
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > mc69360 Messages postés 19 Date d'inscription vendredi 4 août 2017 Statut Membre Dernière intervention 9 août 2017
8 août 2017 à 17:41
While ... foreach.... Ta boucle quoi....


Bref...
Commence par :
- Nous montrer le code html du formulaire de saisie
- Nous faire un print_r de $_POST et nous en afficher le contenu
0
mc69360 Messages postés 19 Date d'inscription vendredi 4 août 2017 Statut Membre Dernière intervention 9 août 2017 > jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024
8 août 2017 à 18:34
Formulaire pour créer/modifier un nouveau stockage, ou se trouve le checkbox
<?php
try {
   // On se connecte à MySQL
   
   $bdd = new PDO('mysql:host=localhost;dbname=crealis;charset=utf8', 'root', 'lionel0769', [
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
   ]);
  
   // On récupère tout le contenu de la table stock_antigel
   
   $toutes_donnees = $bdd->query('SELECT * FROM stock_antigel ORDER BY stock_antigel.id ASC')->fetchAll();
}
  
catch(PDOException $e){
   error_log($e->getMessage());
}
?>

            


	<head>
		<title>Créer/modifier produit</title>

    </head>

    <body>
<?php
include 'header.html';
include 'menu.html';
?>
<?php
 if(isset($toutes_donnees)):?>
        <center><h3>Créer nouvelle matière première</h3></center><br />
		<form action="creer_modifier.php" method="post">

			<p>
				<label for="matiere_premiere">Nom matière première</label> : <input type="text" name="matiere_premiere" id="matiere_premiere" /><br /><br />
				<label for="code_produit">Code Produit</label> : <input type="number" name="code_produit" id="code_produit" /><br /><br />
				<label for="nom_stockage">Nom stockage</label> : <input type="text" name="emplacement" id="emplacement" /><br /><br />
				<label for="volume_stockage">Volume stockage en litre</label> : <input type="number" name="volume_stockage" id="volume_stockage" /><br /><br />
				<label for="facteur_conversion_mesureareel">facteur conversion hauteur/litre</label> : <input type="number" step="0.01" name="facteur_conversion_mesureareel" id="facteur_conversion_mesureareel" /><br /><br />
				<label for="niveau_appro">Niveau appro</label> : <input type="number" name="niveau_appro" id="niveau_appro" /><br /><br />
				<label for="niveau_alarme">Niveau alarme en litre</label> : <input type="number" name="niveau_alarme" id="niveau_alarme" /><br /><br />
				<label for="checked"> Mesure lu </label><input type="checkbox" name="checkbox" id="checkbox"/><br /><br />


				<input type="submit" value="Envoyer" />
			</p>

		</form>
		<br />
		<br />
		
		<center>
		<h3>Modifier/Supprimer matière première</h3>
<table>


   <thead> <!-- En-tête du tableau -->
       <tr class="couleur_tr">
           <th>Matière première</th>
           <th>Code Produit</th>
           <th>Emplacement</th>
            <th>Mesure observée</th>
           <th>Stock réel</th>
            <th>Niveau déclenchement appro</th>
           <th>Niveau alarme</th>
            <th>Action</th>
       </tr>
   </thead>

   <tfoot> <!-- Pied de tableau -->
       <tr class="couleur_tr">
            <th>Matière première</th>
           <th>Code Produit</th>
           <th>Emplacement</th>
            <th>Mesure observée</th>
           <th>Stock réel</th>
            <th>Niveau déclenchement appro</th>
           <th>Niveau alarme</th>
           <th>Action</th>
       </tr>
   </tfoot>
<?php foreach($toutes_donnees as $donnees): ?>
   <tbody> <!-- Corps du tableau -->
       <tr>
           <td><?php echo $donnees['matiere_premiere'];?></td>
           <td><?php echo $donnees['code_produit'];?></td>
           <td><?php echo $donnees['emplacement'];?></td>
            <td><?php echo $donnees['mesure_observee'];?></td>
            <td><?php echo $donnees['stock_reel'];?></td>
            <td><?php echo $donnees['niveau_appro'];?></td>
           <td><?php echo $donnees['niveau_alarme'];?></td>
           <td><a href="stockage_edit_form.php?id=<?php echo $donnees['id'] ?>" >Edit</a>

       | <a onclick="return confirm('Êtes-vous sûr de vouloir supprimer ce stockage?');" 
      href="stockage_del.php?id=<?php echo $donnees['id'] ?>">Delete</a>
       </tr>
       <?php endforeach; ?>

   </tbody>
</table>
</center>

<?php else: ?>
<p>Une erreur a eu lieu avec la base de donnée. Nous vous présentons nos excuses pour la gêne occasionnée.</p>
<?php endif; ?>
		

    </body>

</html>


Formulaire pour éditer les mesures:
<?php
include 'sqlconnect.php';
   // On récupère tout le contenu de la table stock_antigel
   
   $toutes_donnees = $bdd->query('SELECT * FROM stock_antigel')->fetchAll();
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <link rel="stylesheet" href="stock_antigel.css" />
        <title>Relevé de niveaux Stock Antigel</title>
    </head>
    <body>
    <?php
    include 'header.html';
    include 'menu.html';
    ?>
        <?php if(isset($toutes_donnees)): ?>
        <form action="stock_antigel_update.php" method="post">
            <p>
            <?php foreach($toutes_donnees as $donnees): ?>
                <input type="hidden" name="id<?php echo $donnees['id'];?>" value="<?php echo $donnees['id'];?>"/>
                <label for="niveau_matiere_premiere"><?php echo $donnees['matiere_premiere'] . ' :'; ?></label> <input type="number" step="0.01" name="mesure_observee<?php echo $donnees['id']; ?>" id="mesure_observee" value="<?php echo $donnees['mesure_observee']; ?>"/><br /><br />
            <?php endforeach; ?>
   
                <input type="submit" value="Envoyer" />
            </p>
   
        </form>
        <?php else: ?>
        <p>Une erreur a eu lieu avec la base de donnée. Nous vous présentons nos excuses pour la gêne occasionnée.</p>
        <?php endif; ?>
    </body>
</html>



Array ( [id27] => 27 [mesure_observee27] => 17000 [id26] => 26 [mesure_observee26] => 1.5 [id20] => 20 [mesure_observee20] => 1.5 [id25] => 25 [mesure_observee25] => 1.5 [id28] => 28 [mesure_observee28] => 1.54 )
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
Modifié le 8 août 2017 à 19:26
bonjour, il manque
$stock_reel = NULL;
juste avant la ligne 20 dans le code sans nom que tu as présenté au début: tu changes d'ID, tu ne peux pas garder l'ancienne valeur de $stock_reel.

Par ailleurs, au lieu de faire
$toutes_tables->fetchAll()
, tu ferais mieux de faire un fetch et d'en tester le résultat, pour vérifier si ta requête te renvoie un enregistrement.

Encore une autre anomalie: les execute, fetch et foreach devaient être à l'intérieur du
if($dernier_chiffre == 0 OR $dernier_chiffre == 5)


Encore deux choses:
ceci:
if (is_null($stock_reel)) {
                                        throw new Exception('Pas trouvé $stock_reel (ID '.$id.')');
                                    }

devrait être juste avant (non séparé par des accolades):
if (!$stmt->execute()


il faut supprimer ceci:
or !$toutes_tables->execute()
0
mc69360 Messages postés 19 Date d'inscription vendredi 4 août 2017 Statut Membre Dernière intervention 9 août 2017
Modifié le 8 août 2017 à 20:18
Salut yg_be,
apparemment quand tu cites des lignes je ne vois pas les mêmes chez moi, ça m' avait déjà fait le coup sur l' autre sujet,
j'ai remis le
$stock_reel=NULL;
la ou tu m'avais dit de le mettre la première fois donc avant la ligne 17 , il a zappé lors de mes différents refaire/annuler de même que le or !$toutes_tables
$stock_reel = NULL;
            $stmt->bindParam(':stock_reel', $stock_reel, PDO::PARAM_STR);


pour le fetchAll, j'ai fait ainsi:

$toutes_tables->execute();
                                $resultat_toutes_tables=$toutes_tables->fetch();
                               if (is_null($toutes_tables)){
                                  throw new Exception('Erreur: pas trouvé la ligne (ID '.$id.')');}



Pour le is_null stock_reel:
 }
               if (is_null($stock_reel)) {
                                        throw new Exception('Pas trouvé $stock_reel (ID '.$id.')');
                
                if (!$stmt->execute()) {
                    throw new Exception('ERREUR UPDATE (ID '.$_POST['id'].')');


Par contre je saisi pas le fait de mettre le fetch, execute et foreach à l' intérieur de la condition 0 et 5, lorsque je ferme l'accolade de la condition, ça va pas me fermer aussi le fetch, execute et foreach?, du coup il sera pas pris en compte dans le else,non?
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
8 août 2017 à 20:44
moi je cite les lignes telles que publiées sur le site (tu peux les voir aussi, j'espère que ce sont les miennes), pas comme dans ton fichier.

le
=NULL
doit être à l'intérieur du
foreach($toutes_donnees
(par exemple juste après)

le isnull doit être fait sur $resultat_toutes_tables

suggestion pour la position du execute, fetch :
if($dernier_chiffre == 0 OR $dernier_chiffre == 5){
           $toutes_tables->execute();
            $resultat_toutes_tables=$toutes_tables->fetch();
           if (!is_null($resultat_toutes_tables)){
                 $stock_reel = $resultat_toutes_tables['volume'];
           }
}
else{
            //$mesure = round($mesure * 20) / 20;
            //$stock_reel1 =$table['volume'];
             $stock_reel = 12;
}


si cela ne fonctionne pas, sans doute utile de publier ton code.
0
mc69360 Messages postés 19 Date d'inscription vendredi 4 août 2017 Statut Membre Dernière intervention 9 août 2017 > yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024
Modifié le 8 août 2017 à 22:08
<?php
    //Rien de reçu => on bosse pas
    if (!empty($_POST)) {
        //Je mets tout dans un T/C
        try {
            //TOUJOURS ACTIVER LES EXCEPTIONS
            $bdd = new PDO('mysql:host=localhost;dbname=crealis;charset=utf8', 'root', 'lionel0769',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
            $toutes_tables = $bdd->prepare("SELECT volume FROM table_stockage WHERE ROUND(hauteur,2) = ROUND(:hauteur,2)");
            $toutes_tables->bindParam(':hauteur',$mesure, PDO::PARAM_STR);
            $toutes_donnees = $bdd->query('SELECT * FROM stock_antigel')->fetchAll();
            $requeteUpdate = "UPDATE stock_antigel SET mesure_observee = :mesure_observee,stock_reel = :stock_reel WHERE id = :id";
            $stmt = $bdd->prepare($requeteUpdate);
            $stmt->bindParam(':mesure_observee', $mesure, PDO::PARAM_STR);
            $stmt->bindParam(':stock_reel', $stock_reel, PDO::PARAM_STR);
            $stmt->bindParam(':id', $id, PDO::PARAM_INT);
            foreach($toutes_donnees as $donnees){
                $stock_reel = NULL;
                $id = $donnees['id'];
                $mesure = $_POST["mesure_observee$id"];
                $cent = $mesure * 100;
                $dernier_chiffre= substr($cent, -1);
                $checkbox = $donnees["checkbox"];
                if($checkbox == 1){
                $stock_reel = $mesure;
                }
                else{
                        if($donnees['facteur_conversion_mesureareel'] != 0){
                            $stock_reel = $mesure * $donnees['facteur_conversion_mesureareel'];
                        }
                        else{
                                

                            if($dernier_chiffre == 0 OR $dernier_chiffre == 5){
                                $toutes_tables->execute();
                                $resultat_toutes_tables=$toutes_tables->fetch();
                                if (!is_null($resultat_toutes_tables)){
                                    $stock_reel = $resultat_toutes_tables['volume'];
           }
}
else{
            //$mesure = round($mesure * 20) / 20;
            //$stock_reel1 =$table['volume'];
             $stock_reel = 12;
}
                                    
                                }
                        }
               }
               if (is_null($stock_reel)) {
                                        throw new Exception('Pas trouvé $stock_reel (ID '.$id.')');
                
                if (!$stmt->execute()) {
                    throw new Exception('ERREUR UPDATE (ID '.$_POST['id'].')');
                }
            } //fin foreach
           header('Location: index.php');
         }catch (PDOException $pdoE) {
            echo 'Exception PDO: '.$pdoE->getMessage();
        } catch (Exception $e) {
            echo 'Exception Autre: '.$e->getMessage();
        }
    }
?>


Pas d' erreur mais toujours le même problème que dans mon premier message,
lorsque je saisi 1,54 je ne récupère pas la valeur 12 mais la valeur du champ précédent

Edit: ok, j'ai du loupé quelquechose dans mon message précédent, je viens de refaire les modifs pas à pas, et cette fois ça fonctionne, merci encore une fois yg_be.
Je crois que je peux te dire à bientôt... au lieu de au revoir
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471 > mc69360 Messages postés 19 Date d'inscription vendredi 4 août 2017 Statut Membre Dernière intervention 9 août 2017
Modifié le 8 août 2017 à 23:11
il y a un problème avec le code posté 8 août 2017 à 21:40:
il manque l'accolade fermante après:
if (is_null($stock_reel)) {
                                        throw new Exception('Pas trouvé $stock_reel (ID '.$id.')');
il y en a une de trop, probablement, dans la série de 4 juste avant.
0
mc69360 Messages postés 19 Date d'inscription vendredi 4 août 2017 Statut Membre Dernière intervention 9 août 2017 > yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024
9 août 2017 à 06:13
Ok, c' était donc ça l' erreur que j'avais avant mon edit
Par contre une question, le fait d'avoir rajouter le execute et fetch dans le if de
if($dernier_chiffre == 0 OR $dernier_chiffre == 5){

m'oblige à le répéter pour mon calcul dans le else suivant:
 if($dernier_chiffre == 0 OR $dernier_chiffre == 5){
                                        $toutes_tables->execute();
                                        $resultat_toutes_tables=$toutes_tables->fetch();
                                        if (!is_null($resultat_toutes_tables)){
                                        $stock_reel = $resultat_toutes_tables['volume'];
                                        }
}
else{
            $mesure = round($mesure * 20) / 20;
            $toutes_tables->execute();
            $resultat_toutes_tables=$toutes_tables->fetch();
            $stock_reel1 = $resultat_toutes_tables['volume'];
             $stock_reel = $stock_reel1 / $mesure * $_POST["mesure_observee$id"];
             $mesure = $_POST["mesure_observee$id"];
}

Du coup ça serait pas mieux de le remonter avant la comparaison dernier chiffre =0 ou 5?
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471 > mc69360 Messages postés 19 Date d'inscription vendredi 4 août 2017 Statut Membre Dernière intervention 9 août 2017
Modifié le 9 août 2017 à 08:28
tu ne peux pas le remonter, le execute doit se faire après avoir changé la valeur de $mesure!
moi je ferais ainsi, pas besoin du if et de $dernier_chiffre, car cela couvre les deux situations:
$mesure0 = $mesure;
$mesure = round($mesure * 20) / 20;
$toutes_tables->execute();
$resultat_toutes_tables=$toutes_tables->fetch();
 if (!is_null($resultat_toutes_tables)){
            $stock_reel1 = $resultat_toutes_tables['volume'];
             $stock_reel = $stock_reel1 / $mesure * $mesure0;
}
 $mesure = $mesure0;
0