Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de condition ?

    17 juillet 2019 à 10:33:52

    Bonjour,

    Voilà je débute actuellement dans le domaine du web, voici mon exercice:

    1.Créer une BDD avec ces 2 colonnes

    -number (INT)

    -result (Varchar 100)

    2. Remplir la BDD de ces 10 lignes:

    number    result 

    11          win 

    12          

    13          win 

    14         

    15          

    16          

    17          win 

    18          

    19          

    20          win

    3.la personne se doit d'entrer son code sur un site si dans la BDD le ticket est gagnant alors "You win" s'afficheras, "You loose" si le numéro n'est pas gagnant et "invalid number" apparaîtras si le chiffre ne fait pas partie de la colonne number. 

    Vous devez réaliser un HTML en local avec cette fonctionnalité 

    (PAS BESOIN DE MISE EN PAGE IL FAUT JUSTE QUE CELA FONCTIONNE).

    Obligation:

    -la page ne doit pas se recharger. (indice: AJAX)

    _________________________________________________________________________________________________

    Voici mon code jusqu'à présent

    index.php

    <body>
    	<center>
    		<h1>Gagnant ?</h1>
    
    			<input type="text" class="idToPast" name="id" placeholder="Entrer votre numéro"/> <br>
    			<input type="submit" name="search" value="Verification" class="ajaxSubmit">
    
    	<h1 class="reponse"></h1>
    
    		<input type="hidden" class="email" name="email" id="askemailwin"placeholder="Entrer votre email">
    
    	</center>
    	<script>
    		$(document).ready(function(){
    
    			var idToPast = '';
    
    			$('.ajaxSubmit').click(function(){
    
    				idToPast = $('.idToPast').val();
    
    				$.ajax({
    					  method: "POST",
    					  url: "ok.php",
    					  data: { id: idToPast }
    					})
    					.done(function( data ) {
    					    //alert( "Data Saved: " + data );
    						var obj = jQuery.parseJSON( data );
    						/*console.log(obj);
    						console.log(obj.response);
    						console.log(obj.color);*/
    					    $('.reponse').html(obj.response);
    					    $('.reponse').css('background-color', obj.color);
    					});
    			});
    
    		});
    	</script>
    </body>
    </html>

    et ok.php:

    <?php
    
    
    $connection = mysqli_connect("localhost", "root", "");
    $db = mysqli_select_db($connection, 'test');
    
    $array = [];
    
    $array = [
        'response' => '',
        'color' => ''
    ];
    
    if(isset($_POST['id']))
    {
        $id = $_POST['id'];
    
        $query = "SELECT * FROM test_table where number = '$id' ";
        $query_run = mysqli_query($connection,$query);
    
        while($row = mysqli_fetch_array($query_run))
        {
            if ($id == $row['number'] && $row['result'] == "win") 
            {
                $array['response'] = 'you win';
                $array['color'] = 'green';
                echo json_encode($array);
            }
    
            elseif ($id != $row['number']) 
            {
                $array['response'] = 'invalid number';
                $array['color'] = 'blue';
                echo json_encode($array);
            }
    
            else
            {
                $array['response'] = 'you loose';
                $array['color'] = 'red';
                echo json_encode($array);
            }
        }
    }
    
    ?>

    alors lorsque l'on entre un chiffre étant dans la colonne number et qu'il y a win dans le colonne result, celui-ci fait bien apparaître You win en vert pareille pour la condition loose, mais je n'arrive pas à faire apparaître invalid number.

    ps: question bonus, j'aimerais faire apparaître mon input type hidden lorsque you win s'affiche. une idée ? 

    Merci du temps consacrer à mon sujet



    • Partager sur Facebook
    • Partager sur Twitter
      17 juillet 2019 à 11:35:07

      Bonjour.

      Pourquoi faire une boucle au niveau PHP alors que tu n'es censé récupérer qu'un seul enregistrement ?

      Sinon, au lieu de faire echo json_encode($array); dans chaque partie de la condition, fais le en dehors de la condition, ça évitera la répétition de code.

      TomSasorith a écrit:

      ps: question bonus, j'aimerais faire apparaître mon input type hidden lorsque you win s'affiche. une idée ?

      Il te faut au préalable vérifier la valeur de la propriété color par exemple, puis si elle est égale red, il te suffit de modifier la valeur de l'attribut type de l'input, par email par exemple.

      Par contre correctif pour ton code HTML, en sémantique HTML, il ne doit y avoir qu'une seule balise h1 dans une page.

      Autre chose, vu que la valeur de la propriété response n'est que du texte, utilises la méthode text à la place de la méthode html.

      -
      Edité par Lartak 17 juillet 2019 à 11:36:00

      • Partager sur Facebook
      • Partager sur Twitter

      Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

        17 juillet 2019 à 11:50:41

        Merci pour ton retour Lartak,

        Sinon, au lieu de faire echo json_encode($array); dans chaque partie de la condition, fais le en dehors de la condition, ça évitera la répétition de code.

        Lartak a écrit:

        Pourquoi faire une boucle au niveau PHP alors que tu n'es censé récupérer qu'un seul enregistrement ?

        Je n'y ai pas vraiment pensé sur le coup, avec le peu de cours que j'ai eu je l'ai fais à la manière dont je le comprenais, y a t-il un moyen alternatif ? 

        Lartak a écrit:

        Sinon, au lieu de faire echo json_encode($array); dans chaque partie de la condition, fais le en dehors de la condition, ça évitera la répétition de code.

        c'est fait ! agréablement surpris je ne savais pas que c'étais possible sa allège le code !

        mais du coup ma condition est-elle mauvaise ? car lorsque j'insère un chiffre qui n'as rien avoir avec les chiffres de ma BDD invalid number ne s'affiche pas.









        -
        Edité par TomSasorith 17 juillet 2019 à 11:55:12

        • Partager sur Facebook
        • Partager sur Twitter
          17 juillet 2019 à 14:20:29

          Salut,

          si ton id n'est pas trouvé, tu ne rentre pas dans le while, vu que tu n'a pas de résultat.

          Et effectivement, tu n'a pas besoin du while vu que tu n'a qu'un seul résultat de toute façon.

          • Partager sur Facebook
          • Partager sur Twitter
            17 juillet 2019 à 14:41:25

            Bonjour,

            Nous somme sur le sujet javascript, mais je vais quand même faire une petite exception (ouais je m'ennuie a ce point '-').
            Personnellement j'aurais fait comme ça (34ligne sans les commentaire):

            <?php
            //Je défini le type de contenu de la page
            header('Content-Type: application/json');
            
            //J'utilise PDO mais tu peu surement l'adapter a mysqli
            $host= "host_here";
            $name= "dbName_here";
            $user= "username_here";
            $mdp= "password_here";
            
            try {
            	$db = new PDO('mysql:host='.$host.';dbname='.$name, $user, $mdp);
            } catch(Exception $e) {
            	die('Erreur : '.$e-&gt;getMessage());
            }
            
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            
            //On verifie si on as bien reçu le chiffre (en GET)*
            if(isset($_GET['id'])) {
            	//L'entrée utilisateur est automatiquement échappée, il n'y a donc aucun risque d'attaque par injection SQL.
            	$req= $db->prepare('SELECT * FROM `test_table` where number = ?');
            	if($req->execute(array($_GET['id']))) {
            		$resultat= array (
            			"response"  => "You loose",
            			"color" => "red"
            		);
            		//Si j'ai un resultat (donc le nombre est dans la DB)
            		if($req->rowCount()) {
            			//on parcours les resultat
            			//(même si normalement il n'y a qu'un resultat)
            			while ($item= $req->fetch()) {
            				//Je ne test que si le nombre est gagnant, puisque par défaut $resultat est perdant.
            				if($item['result'] == "win") {
            					$resultat['response']= "You win";
            					$resultat['color']= "green";
            					//on quitte la boucle while (au cas où)
            					break;
            				}
            			}
            		} else {
            			$resultat['response']= "Invalid number";
            			$resultat['color']= "blue";
            		}
            		//on affiche le contenu de resultat
            		echo json_encode($resultat);
            	}
            
            /*
            
            	*: Niveau architecture c'est plus propre pour un micro API interne, tu trouvera + d'info ici:
            	https://openclassrooms.com/fr/courses/4087036-construisez-une-api-rest-avec-symfony/4280556-une-architecture-pas-un-protocole
            	(en gros, POST c'est pour enregistrer des données et GET pour les lires)
            
            */
            ?>

            Pour répondre a ta question, pour faire simple dans ta boucle while tu parcours les résultats obtenu avec la requête SQL.
            Donc si le chiffre n'est pas dans la db, il n'y a aucun résultat et la boucle ne s’exécute pas.

            Niveau javascript je te propose un équivalent; J'utilise des fonctions fléchées (ça ne change rien), j'ai modifier les sélecteur JQuery afin de ne pas avoir de classe css superflue, j'ai modifier la méthode selon laquel on modifie la couleur (afin d’écraser l'ancien style par le nouveau) et je crois que c'est tout.
            Voici le code :

            //arrow function, plus d'info ici : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Fonctions/Fonctions_fl%C3%A9ch%C3%A9es
            $(document).ready(()=> {
            	/* Je m'appuis sur l'étendu des selecteurs proposer par JQuery
            	ainsi je peut utiliser une classe commune pour tout les input de type submit
            	(c'est plus simple a styliser comme ça) */
            	$('button[name="search"]').click(()=> { //idem arrow function
            		//La requête ajax
            		$.ajax({
            			'async': true,
            			'method': "GET",
            			'url': "ok.php",
            			//Je dit que j'attend une réponse en JSON(*)
            			'dataType': "JSON",
            			'data': {
            				'id': $('input[name="id"]').val()
            			}
            		}).done((data)=> { //idem arrow function
            			//Je ne JSON.parse() pas data, voir(*) pour la raison.
            
            			//Je met la reponse dans le H2
            			$('h2.resultat').text(data.response)
            			//Je remplace le contenu de son attribut style par bgColor
            			$('h2.resultat').attr('style', `background-color: ${data.color}`);
            			//Si win j'affiche l'input email
            			if(data.color==="green") {
            				$('input[name="email"]').removeAttr('style');
            			}
            		});
            	})
            });
            
            /*
            
            	*: Normalement je devrais pouvoir l'omettre car j'ai défini dans 
            	le script PHP content-type application/json
            	L'avantage ainsi c'est que JQuery parse automatiquement la réponse. (normalement)
            
            */

            Et donc pour le HTML, après un rapide élagage de tout ce qui était superflue :

            <html>
            	<head>
            		<title>Title_here</title>
            	</head>
            	<body>
            		<h1>Gagnant ?</h1>
            		<input type="text" name="id" placeholder="Entrer votre numéro"/>
            		<button name="search">Verification</button>
            		<h2 class="reponse" style="display:none;"></h2>
            		<input type="text" name="email" style="display:none;" id="askemailwin" placeholder="Entrer votre email"/>
            		<script>/* [...] */</script>
            	</body>
            </html>

            J'aurais pu optimiser le code, notamment au niveau du script PHP, il pourrais très bien ne répondre que quelques chose du style:

            {"response":"win"} ou
            {"response":"lose"} ou
            {"response":"oWo"}

            Ensuite, dans la fonction javascript j'aurais pu parcourir la valeurs de response pour savoir s'il a gagner/perdu ou si le chiffre n'est pas dans la db; et ainsi faire mes modifications dans le DOM directement depuis javascript.

            Mais je te pré-mâche déjà de trop le boulot avec tout ces scripts, il faut bien que je te laisse 2-3truc a faire ! :3

            Edit: ça fait trop longtemps que je n'ai pas toucher a php, je ne me souviens plus si PDO retourne un tableau même quand il n'y a qu'un résultat (il me semble que c'est le cas).

            -
            Edité par Angelisium 17 juillet 2019 à 14:52:20

            • Partager sur Facebook
            • Partager sur Twitter

                !

              17 juillet 2019 à 14:42:39

              Je suis un peu perdu, pour ce cas en gros je peut pas mettre la condition qui fais que si la valeur insérer dans mon input idtopast ne se trouve pas dans ma bdd alors le message "invalid numbers" mais juste garder mes 2 condition rouge si tu perd et vert si tu gagne ?

              • Partager sur Facebook
              • Partager sur Twitter
                17 juillet 2019 à 14:52:53

                Normalement tu devrais saisir la totalité de ce que j'aborde dans mon (grand et gros) message :)

                Edit: mais si tu as des question n'hésite pas.

                -
                Edité par Angelisium 17 juillet 2019 à 14:53:24

                • Partager sur Facebook
                • Partager sur Twitter

                    !

                  17 juillet 2019 à 16:35:24

                  J'ai essayer pour moi celà n'a pas marcher j'avoue que 2-3 truc mon perturbé mais merci pous vos aides je vais essayer de persévérer, et merci pour l'explication du while dans tes commentaires :)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 juillet 2019 à 16:48:03

                    Keski t'as perturber ?
                    J'peut p't'ête les expliquer '-'

                    Edit: j'ai fait une erreur ligne 14 du script PHP, j'ai écris die('Erreur : '.$e-&gt;getMessage()); au lieu de die('Erreur : '.$e->getMessage());

                    Edit(bis): voici le script PHP sur mon serv': win, lose et unknow

                    -
                    Edité par Angelisium 17 juillet 2019 à 18:53:54

                    • Partager sur Facebook
                    • Partager sur Twitter

                        !

                      17 juillet 2019 à 23:51:26

                      @Angelisium Pour rappel :

                      PDOStatement::rowCount() retourne le nombre de lignes affectées par la dernière requête DELETE, INSERT ou UPDATE exécutée par l'objet PDOStatement correspondant.

                      Si la dernière requête SQL exécutée par l'objet PDOStatement associé est une requête de type SELECT, quelques bases de données retourneront le nombre de lignes retournées par cette requête. Néanmoins, ce comportement n'est pas garanti pour toutes les bases de données et ne devrait pas être exécuté pour des applications portables.

                      Donc autant éviter d'utiliser cette méthode sur un SELECT.

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

                        18 juillet 2019 à 3:05:06

                        Bien vu, ça fait trop longtemps que je n'ai pas utiliser PHP, mais p'tête qu'il vaut mieux utiliser une requête SELECT COUNT(*) FROM `test_table` where number = ? et pour la condition un truc du genre if($req->fetchColumn()>0) { [...] }
                        • Partager sur Facebook
                        • Partager sur Twitter

                            !

                          18 juillet 2019 à 5:11:37

                          Non, pas besoin, vu qu'il ne récupère qu'un seul enregistrement, il lui suffit de stocker le retour de la méthode fetch (toujours sans boucle), soit par exemple :

                          $record = $req->fetch();
                          if (!$record) {
                              // Aucun enregistrement correspondant
                          } elseif ($record['result'] === 'win') {
                              // Gagné
                          } else {
                              // Perdu
                          }

                          Tout simplement.

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

                          Problème de condition ?

                          × 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