IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Boucle de récupération des données [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 63
    Points : 30
    Points
    30
    Par défaut Boucle de récupération des données
    Bonjour,

    mon problème est le suivant. Je dois à l'aide d'un formulaire d'identification permettre l'affichage d'une table si le login et le passw sont ok.
    Si j'essaye avec le premier login, ça affiche tout.
    Si j'essaye avec les suivants, ça n'affiche qu'à partir de leur ligne.
    Pourquoi la récupération ne commence t elle qu'à partir du login saisi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <?php 
    $sql = "SELECT * FROM `utilisateur` LIMIT 0, 30";
    $res = mysql_query($sql);
    $row = mysql_fetch_assoc($res);
    while ($row){
    	if($row['login'] == $login && $row['pass'] == $pass){
    		echo "<table border ='10'><tr><th>login</th><th>pass</th><th>mail</th><th>statut</th></tr><tr>";
    		while ($row){
    			foreach($row as $key => $val){
    				if ($val == $row['pass']){
    					echo "<td>"."***"."</td>";
    				}
    				else
    					echo "<td>".$val."</td>";
    			}
    			$row = mysql_fetch_assoc($res);
    			echo "</tr>";
    		}
    		$row = mysql_fetch_assoc($res);
    	}
    	$row = mysql_fetch_assoc($res); 			
    }	
    ?>
    merci.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    revois la LOGIQUE de ton code.

    2 while et 1 foreach... Tu ne penses pas que ça fait un peu trop ?

    Notamment, demande-toi ce que fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $row = mysql_fetch_assoc($res);


    mysql_fetch_assoc() retourne un tableau associatif qui contient la ligne lue dans le résultat result et déplace le pointeur interne de données.
    mysql_fetch_assoc() revient à appeler la fonction mysql_fetch_array() avec MYSQL_ASSOC en tant que second paramètre.
    Cette fonction retourne uniquement un tableau associatif.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 63
    Points : 30
    Points
    30
    Par défaut
    Bonjour,

    en retirant un boucle while, ça commence à retranscrire les données du tableau à partir de l'entrée suivante et ça créé des tableaux disctinct pour chaque tuple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    $db = mysql_select_db("C2015");
    	$auth = false;
    	$sql = "SELECT * FROM `utilisateur` LIMIT 0, 30";
    	$res = mysql_query($sql);
    	$row = mysql_fetch_assoc($res);
    	//print_r($row);
    	while ($row){
    		foreach($row as $key => $val){
    		//premiere boucle pour verifier si le login et mdp sont ok
    			if($row['login'] == $login && $row['pass'] == $pass){
    				$auth = true;
    			}
    		}
    		$row = mysql_fetch_assoc($res);
    		if($auth){
    		// si login et mdp ok :
    			echo "<table border ='10'><tr><th>login</th><th>pass</th><th>mail</th><th>statut</th></tr><tr>";
    				foreach($row as $key => $val){
    				//deuxième boucle pour parcourir le tableau
    					//if ($val == $row['pass']){
    					if($key == 'pass'){
    						echo "<td>"."****"."</td>";
    					}
    					else{
    						echo "<td>".$val."</td>";
    					}
    				}
    			echo "</tr>";
    		}
    		else{
    		// si login et mdp pas ok:
    			echo "acces non autorise";
    			break;
    		}
    		echo "</table>";	
    	}
    ?>

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 63
    Points : 30
    Points
    30
    Par défaut
    re bonjour,
    Nom : Sans titre.jpg
Affichages : 110
Taille : 10,9 Ko

    en replaçant une boucle while, j'arrive bien à afficher les tuples de ma table (cf. image ci dessus) si j'utilise le login et le pass de la première entrée (ici tata et atat). Si j'utilise un login autre que le premier, ça n'entre pas dans la boucle et va direct dans le else 'acces non autorise'.
    Je ne comprend pas pourquoi $auth ne prend en compte que la première ligne.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    $auth = false;
    	$sql = "SELECT * FROM `utilisateur` LIMIT 0, 30";
    	$res = mysql_query($sql);
    	$row = mysql_fetch_assoc($res);
    	while ($row){
    		foreach($row as $key => $val){
    		//premiere boucle pour verifier si le login et mdp sont ok
    			if($row['login'] == $login && $row['pass'] == $pass){
    				$auth = true;
    			}
    		}
    		$row = mysql_fetch_assoc($res);
    		if($auth){
    		// si login et mdp ok :
    			$res = mysql_query($sql);
    			$row = mysql_fetch_assoc($res);
    			//if($row['login'] == $login && $row['pass'] == $pass){
    			echo "<table border ='10'><tr><th>login</th><th>pass</th><th>mail</th><th>statut</th></tr><tr>";
    			while($row){
    				foreach($row as $key => $val){
    				//deuxième boucle pour parcourir le tableau
    					if($key == 'pass'){
    					/*equivalent à : if ($val == $row['pass']){*/ 
    						echo "<td>"."****"."</td>";
    					}
    					else{
    						echo "<td>".$val."</td>";
    					}
    				}
    				$row = mysql_fetch_assoc($res);
    				echo "</tr>";
    			}
    			echo "</tr>";
    		}
    		else{
    			//si login et mdp pas ok:
    			echo "acces non autorise";
    			break;
    		}
    		echo "</table>";

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 63
    Points : 30
    Points
    30
    Par défaut
    re, re,

    j'ai ecrit un commentaire pour chaque ligne de code.
    Pourriez vous m'indiquer si je me trompe dans la compréhension de ce que j'écris ? A quel niveau ce n'est pas logique ?
    Merci beaucoup par avance,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    <?php 
     
    	$login = $_POST['login'];
    	$pass = $_POST['mdp'];
     
     
    	$link = mysql_connect("localhost","root","") or die ("erreur connect");
     
    	$db = mysql_select_db("C2015");
    	$auth = false;
    	$sql = "SELECT * FROM `utilisateur` LIMIT 0, 30";
    	$res = mysql_query($sql);
    	// recupere dans $res les données recuperees par la requete $sql
    	$row = mysql_fetch_assoc($res);
    	//genere la premiere ligne du tableau associatif des doonnées de $res
    	while ($row){
    	//pendant toute cette premiere ligne :
    		foreach($row as $key => $val){
    		//pour chaque clé(indice) de cette ligne on récupère la valeur
    		//premiere boucle pour verifier si le login et mdp sont ok
    			if($row['login'] == $login && $row['pass'] == $pass){
    			// si le login de cette ligne du tableau est = le login récupéré du formulaire et qu'en meme temps idem pour mdp' 
    			//
    				$auth = true;
    				//alors auth est egal a true
    			}
    		}
    		$row = mysql_fetch_assoc($res);
    		//reinitialise a la ligne suivante (?)
    		if($auth){
    		// si $auth es true alors j'écris le tableau :
    			$res = mysql_query($sql);
    			//reprise des données de la requete sql
    			$row = mysql_fetch_assoc($res);
    			//reinitialisation du tableau à la premiere ligne
    			//if($row['login'] == $login && $row['pass'] == $pass){
    			echo "<table border ='10'><tr><th>login</th><th>pass</th><th>mail</th><th>statut</th></tr><tr>";
    			//ecriture du tableau en html
    			while($row){
    			//pendant le parcours de la ligne du tableau associatif
    				foreach($row as $key => $val){
    				//pour chaque valeur de chaque cle de cette ligne
    				//deuxième boucle pour parcourir le tableau
    					if($key == 'pass'){
    					// si la clé (colonne du tableau)est celle des mdp
    					/*equivalent à : if ($val == $row['pass']){*/ 
    						echo "<td>"."****"."</td>";
    						//on ecrit **** a la place du mdp
    					}
    					else{
    					//sinon
    						echo "<td>".$val."</td>";
    						// on ecrit la valeur normale
    					}
    				}
    				$row = mysql_fetch_assoc($res);
    				//reinitialise a la ligne suivante (?)
    				echo "</tr>";
    				//ecriture de fin de ligne en html
    			}
    			//echo "</tr>";
    		}
    		else{
    			//sinon si $auth n est pas true on sort:
    			echo "acces non autorise";
    			break;
    			//on sort
    		}
    		echo "</table>";	
    	}
    ?>

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 63
    Points : 30
    Points
    30
    Par défaut [resolu]
    En remplaçant la première boucle while par une boucle for et en faisant un peu le ménage ça fonctionne.
    J'ai l'impression qu'il est possible de simplifier encore plus le code mais bon.
    merci en tout cas jreaux pour ta réponse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    	$db = mysql_select_db("C2015");
    	$auth = false;
    	$sql = "SELECT * FROM `utilisateur` LIMIT 0, 30";
    	$res = mysql_query($sql);
    	$row = mysql_fetch_assoc($res);
    	for ($i=0; $i<count($row); $i++){
    		if($row['login'] == $login && $row['pass'] == $pass){
    			$auth = true;
    		}
    		$row = mysql_fetch_assoc($res);
    		//print_r($row);
    	}
    	if($auth){
    		$res = mysql_query($sql);
    		$row = mysql_fetch_assoc($res);
    		echo "<table border ='10'><tr><th>login</th><th>pass</th><th>mail</th><th>statut</th></tr><tr>";
    		while($row){
    			foreach($row as $key => $val){
    				if($key == 'pass'){
    					echo "<td>"."****"."</td>";
    				}
    				else{
    					echo "<td>".$val."</td>";
    				}
    			}
    			$row = mysql_fetch_assoc($res);
    			echo "</tr>";
    		}
    	}
    	else{
    		echo "acces non autorise";
    	}
     
    ?>

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    afin d'améliorer ton code, et surtout sa CONCEPTION, reprenons le problème :
    Citation Envoyé par armoirapizza Voir le message
    Je dois à l'aide d'un formulaire d'identification permettre l'affichage d'une table si le login et le passw sont ok.
    Se problème see décompose ici en plusieurs actions :
    1/ récupérer les données du formulaire
    2/ vérifier si le login et mdp fournis sont ou pas enregistrés en base de données
    3/ si c'est le cas, afficher le tableau.

    1/ Simple.
    Cela dit, en 2/ on doit les entrer dans une requête => on protège les données, ici avec mysql_real_escape_string()
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $login = (isset($POST['login']))? mysql_real_escape_string($POST['login']) : '';
    $pass = (isset($POST['pass']))? mysql_real_escape_string($POST['pass']) : '';
    1-b/ Pour éviter de travailler pour rien, on exécute le reste du code uniquement si login et pass ne sont pas vides :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if( $login !='' && $pass !='')
    {
       // on exécute la suite
       // ..............
    } else { // sinon
       echo "Oh ! Bouffon !! T'as rien oublié ??";
    }
    2/ C'est le même principe qu'une vérification de connexion.
    Plutôt que de faire une requête globale, puis parcourir chaque ligne (pas très performant !),
    on va faire une requête pour COMPTER le nombre de lignes pour lesquelles login et pass sont identiques.
    Si cette requête retourne 1, c'est OK. Sinon, pas OK.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	$db = mysql_select_db("C2015");
     
    	$auth_sql = "SELECT COUNT(*) as total FROM `utilisateur` WHERE login = '".$login."' AND pass = '".$pass."'";
    	$auth_res = mysql_query($auth_sql);
    	$auth_row = mysql_fetch_assoc($auth_res);
     
    	if($auth_row['total'] == 1) { $auth = true; }
    	else { $auth = false; }
    3/ La suite de ton code est correct.
    Une remarque cependant. On écrit généralement :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		$res = mysql_query($sql);
    	//	$row = mysql_fetch_assoc($res); // SUPPRIMER cette ligne
    		echo "<table border ='10'><tr><th>login</th><th>pass</th><th>mail</th><th>statut</th></tr><tr>";
    		while($row = mysql_fetch_assoc($res)){
    ..........
    	//	$row = mysql_fetch_assoc($res); // SUPPRIMER cette ligne
    		}

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupération des données dans une boucle for
    Par boubounagh dans le forum Interfaces Graphiques en Java
    Réponses: 22
    Dernier message: 24/10/2011, 16h29
  2. récupération des données via une liste déroulante
    Par rahan_dave dans le forum Access
    Réponses: 1
    Dernier message: 13/10/2005, 12h27
  3. [HTML][FORMULAIRE] Probleme dans la récupération des données
    Par baddounet dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 15/08/2005, 18h51
  4. Réponses: 2
    Dernier message: 20/02/2004, 08h47
  5. Réponses: 13
    Dernier message: 20/03/2003, 08h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo