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).
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 ?
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
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.
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
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->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 :
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).
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 ?
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
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.
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.
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) { [...] }
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 :
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.
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.
!
!
!
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.
!
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.