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" si le chiffre ne fait pas partie de la colonne number, un input qui demanderas l'e-mail de la personne apparaîtras lorsque la condition gagnant apparaîtra.
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>


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
Salut, dans ton input hidden il manque un espace entre l'attribut ID et Placeholder.

Je suis entrain de regarder pour le reste.
Après voici une fonction intéressante pour toi
https://www.w3schools.com/php/func_array_in_array.asp

elle est natif et permet de rechercher une valeur dans un tableau.

et hésite pas à faire un "break" dans ta boucle while pour la stoper, car une fois que tu as trouver un résultat c'est fini, faut pas faire la suite de la boucle ça fait perdre du temps.

Et tu ne peux pas tomber sur "invalid number" car enfaite tu fais ta requête avec une clause WHERE directement sur l'ID reçu en POST.
Du coup, dans la boule (si tu as un résultat) tu es déjà dans un ID existant.

En faite le invalid number est hors boucle car tu as ta clause where sur l'id.
Il te faudrait, avant le while, un if (count($result)>0) // alors je fais ma boucle while
// sinon je renvois invalid number..

Si je ne suis pas clair dis le moi et je te montrerais en code.

en gros, avant ton while :
if(mysqli_fetch_array($nearbyResult) == 0) {
  // echo invalid number;
}else{
     //while(){}
}

Modifié par JENCAL (17 Jul 2019 - 14:54)
JENCAL a écrit :

Après voici une fonction intéressante pour toi
https://www.w3schools.com/php/func_array_in_array.asp
elle est natif et permet de rechercher une valeur dans un tableau.

Je voulais éviter de passer par cette méthode, car je me suis dit que pour plus tard, si je devais avoir le même genre de problème mais que cette fois ci la BDD serais de 10000 voir 100 000 ligne un tableau serais problèmatique je pense. :o

JENCAL a écrit :

et hésite pas à faire un "break" dans ta boucle while pour la stoper, car une fois que tu as trouver un résultat c'est fini, faut pas faire la suite de la boucle ça fait perdre du temps.

c'est fait ! merci pour l'astuce Smiley smile

JENCAL a écrit :

En faite le invalid number est hors boucle car tu as ta clause where sur l'id.
Il te faudrait, avant le while, un if (count($result)&gt;0) // alors je fais ma boucle while
// sinon je renvois invalid number..

Si je ne suis pas clair dis le moi et je te montrerais en code.

en gros, avant ton while :
if(mysqli_fetch_array($nearbyResult) == 0) {
  // echo invalid number;
}else{
     //while(){}
}


je n'ai pas bien compris cette partie là, alors ma condition invalid number n'est pas possible car ce que je rentre dans $id ne se trouve pas dans la BDD sa j'ai compris, mais je dois faire 2 if avant mon while ? :s

Merci énormément pour le temps que tu as consacré à ma demande
salut , derien Smiley smile

pour le invalid number, je vais essayer d'être clair.

Il faut le sortir de la boucle while.
Quand tu fais ta requête tu fais "where number = '$id'", donc normalement, si on regarde ce que la requête renvoie, elle doit te sortie une seule ligne (car j'ai l'impression qu'un number est unique).
Donc dans ta boucle tu peux pas tester (dans le sens ça ne sert à rien) SI ton ID "n'est pas" dans les résultat car tu "force" avec ton where à trouver des lignes avec cet where number = '$id';

C'est comme si tu disait =>
//trouve moi toutes les lignes avec le prénom Julien
//parcours moi ligne par ligne
// est ce que mon prénom est Gladice ?
=> // bah non... ta demander à la requête que Julien...


donc dans la logique, si tu demande à ta requête "Trouve moi, dans ma table, une ligne avec number = 12", Si la requête me renvoi rien, alors 12 n'existe pas. pas besoin de faire une boucle.
Modifié par JENCAL (18 Jul 2019 - 13:19)
Sinon, le plus simple c'est de virer la boucle qui ne sert à rien, la requête ne peut retourner que 1 résultat ou rien:


$query_run = mysqli_query($connection,$query);
$row = mysqli_fetch_array($query_run);
if ($row !== NULL) {
  if ($row['result'] == 'win') {
    // gagnant
  }
  else {
    // perdant
  }
}
else {
  // numéro invalide
}


PS: le code n'est pas sûr et risque de l'injection, il faudrait nettoyer les variables et/ou utiliser des requêtes préparées pour utiliser des données utilisateurs dans une requête.