Problème de condition [Résolu]

mc69360 19 Messages postés vendredi 4 août 2017Date d'inscription 9 août 2017 Dernière intervention - 7 août 2017 à 21:51 - Dernière réponse : mc69360 19 Messages postés vendredi 4 août 2017Date d'inscription 9 août 2017 Dernière intervention
- 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?

Afficher la suite 
19Messages postés vendredi 4 août 2017Date d'inscription 9 août 2017 Dernière intervention

14 réponses

Répondre au sujet
Pitet 2362 Messages postés lundi 11 février 2013Date d'inscription 30 novembre 2017 Dernière intervention - Modifié par Pitet le 8/08/2017 à 14:14
0
Utile
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,
Commenter la réponse de Pitet
jordane45 19207 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 11 décembre 2017 Dernière intervention - 8 août 2017 à 14:40
0
Utile
3
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.


mc69360 19 Messages postés vendredi 4 août 2017Date d'inscription 9 août 2017 Dernière intervention - 8 août 2017 à 16:32
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
jordane45 19207 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 11 décembre 2017 Dernière intervention > mc69360 19 Messages postés vendredi 4 août 2017Date d'inscription 9 août 2017 Dernière intervention - 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
mc69360 19 Messages postés vendredi 4 août 2017Date d'inscription 9 août 2017 Dernière intervention > jordane45 19207 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 11 décembre 2017 Dernière intervention - 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 )
Commenter la réponse de jordane45
yg_be 4116 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - Modifié par yg_be le 8/08/2017 à 19:26
0
Utile
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()
Commenter la réponse de yg_be
mc69360 19 Messages postés vendredi 4 août 2017Date d'inscription 9 août 2017 Dernière intervention - Modifié par mc69360 le 8/08/2017 à 20:18
0
Utile
7
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?
yg_be 4116 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention > mc69360 19 Messages postés vendredi 4 août 2017Date d'inscription 9 août 2017 Dernière intervention - 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.
mc69360 19 Messages postés vendredi 4 août 2017Date d'inscription 9 août 2017 Dernière intervention > yg_be 4116 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 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?
yg_be 4116 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention > mc69360 19 Messages postés vendredi 4 août 2017Date d'inscription 9 août 2017 Dernière intervention - 9 août 2017 à 08:16
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;
yg_be 4116 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention > yg_be 4116 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 9 août 2017 à 10:35
au lieu de "jouer" avec $mesure0 et $mesure, ce serai sans doute plus clair d'utiliser une autre variable ($q_hauteur?) uniquement pour le query $toutes_tables.
mc69360 19 Messages postés vendredi 4 août 2017Date d'inscription 9 août 2017 Dernière intervention > yg_be 4116 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 9 août 2017 à 16:31
effectivement, ça donne le même résultat...
J'ai mis un moment à comprendre pourquoi d' ailleurs mais effectivement si le dernier chiffre est soit 0 soit 5 dans la formule stock_reel $mesure = $mesure0 même après le round
Effectivement pour le $mesure et $mesure0
Merci
Commenter la réponse de mc69360