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 :

Mauvais affichage du résultat des rêquetes


Sujet :

PHP & Base de données

  1. #1
    Membre régulier

    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 118
    Points : 81
    Points
    81
    Par défaut Mauvais affichage du résultat des rêquetes
    Bonjour,

    J'ai 2 tables :
    Etudiant(nom, prenom, statut, groupe, email, opt)
    et
    Options(code, nom, resp, email)

    Et je souhaite réaliser un script qui permet d'afficher les étudiants selon leurs options dans un premier temps, puis ensuite de les classer selon un attribut (ORDER BY)
    (exemple ici: http://www.lirmm.fr/~meynard/ArchiToile/trombino.php)

    Pour cela, j'ai donc créer un formulaire comme ceci :

    Code html : 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
    <form action="trombi.php" method="post">
    <p>
        Choisissez une option...
        <select name="choixOption" id="choixOption" size="5">
    		<option value="choixBio">Bio-Informatique</option>
    		<option value="choixChimie">Chimie</option>
    		<option value="choixGeo">Syst. dInfo. Géo</option>
    		<option value="choixWeb">Web et BD</option>
    		<option value="choixLangues">Langue naturelle</option>
    	</select>
    </p> 
    <p>
        ...puis un critère de classement
        <select name="choixClassement" id="choixClassement">
    		<option value="choixNomPrenom">par nom et prénom</option>
    		<option value="choixStatut">par statut</option>
    		<option value="choixGroupe">par groupe</option>
    		<option value="choixOpt">par option</option>
    	</select>
    </p>
    <input type="submit" value="Valider" />
    </form>

    Pour éviter du code redondant, j'ai opté pour une requête préparé grace a PDO (que j'ai bien lancé au debut de mon code) et j'ai crée une fonction qui permet l'affichage.

    Code php : 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
    <?php
    $requetePreparee = $bdd->prepare('SELECT etudiant.nom AS nomEtu, prenom, groupe, statut, numStageA, options.nom AS nomOpt
    	FROM etudiant, options
    	WHERE etudiant.opt = options.code
    	AND etudiant.opt = :option
    	ORDER BY :classement');
    function afficheEtudiants() {
    	global $requetePreparee;
    	while ($donnees=$requetePreparee->fetch(PDO::FETCH_OBJ)) {
    ?>
    <p>
    	<strong>Nom et prénom:</strong> : <?php echo $donnees->nomEtu . " " . $donnees->prenom; ?><br />
    	<strong>Groupe et statut :</strong> : <?php echo $donnees->groupe . " " . $donnees->statut; ?><br />
    	<strong>Option:</strong> <?php echo $donnees->nomOpt; ?> <br />
    	<strong>Stage:</strong> <?php echo $donnees->numStageA; ?> <br />
    </p>
    <?php
    	}
    	$requetePreparee->closeCursor(); 
    }

    ... et puis je gère mes 20 cas avec des switchs qui appellent ma requete préparée, le tout dans un gros switch.
    Code php : 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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    if (!(isset($_POST['choixOption']))) {
    }
    else {
    	switch ($_POST['choixOption']) { 
    		case 'choixBio' :
    			switch ($_POST['choixClassement']) {
    				case 'choixNomPrenom':
    				$requetePreparee->execute(array('option' => 'B', 'classement' => 'nom, prenom'));
    				afficheEtudiants();
    				break;
     
    				case 'choixStatut':
    				$requetePreparee->execute(array('option' => 'B', 'classement' => 'statut, nom, prenom'));
    				afficheEtudiants();
    				break;
     
    				case 'choixGroupe':
    				$requetePreparee->execute(array('option' => 'B', 'classement' => 'groupe, nom, prenom'));
    				afficheEtudiants();
    				break;
     
    				case 'choixOpt':
    				$requetePreparee->execute(array('option' => 'B', 'classement' => 'nomOpt, nom, prenom'));
    				afficheEtudiants();
    				break;
    			}
    		break;
     
    		case 'choixChimie':		
    			switch ($_POST['choixClassement']) {
    				case 'choixNomPrenom':
    				$requetePreparee->execute(array('option' => 'C', 'classement' => 'nom, prenom'));
    				afficheEtudiants();
    				break;
     
    				case 'choixStatut':
    				$requetePreparee->execute(array('option' => 'C', 'classement' => 'statut, nom, prenom'));
    				afficheEtudiants();
    				break;
     
    				case 'choixGroupe':
    				$requetePreparee->execute(array('option' => 'C', 'classement' => 'groupe, nom, prenom'));
    				afficheEtudiants();
    				break;
     
    				case 'choixOpt':
    				$requetePreparee->execute(array('option' => 'C', 'classement' => 'nomOpt, nom, prenom'));
    				afficheEtudiants();
    				break;
    			}
    		break;
     
    		case 'choixGeo':
    			switch ($_POST['choixClassement']) {
    				case 'choixNomPrenom':
    				$requetePreparee->execute(array('option' => 'S', 'classement' => 'nom, prenom'));
    				afficheEtudiants();
    				break;
     
    				case 'choixStatut':
    				$requetePreparee->execute(array('option' => 'S', 'classement' => 'statut, nom, prenom'));
    				afficheEtudiants();
    				break;
     
    				case 'choixGroupe':
    				$requetePreparee->execute(array('option' => 'S', 'classement' => 'groupe, nom, prenom'));
    				afficheEtudiants();
    				break;
     
    				case 'choixOpt':
    				$requetePreparee->execute(array('option' => 'S', 'classement' => 'nomOpt, nom, prenom'));
    				afficheEtudiants();
    				break;
    			}
    		break;
     
    		case 'choixWeb':
    			switch ($_POST['choixClassement']) {
    				case 'choixNomPrenom':
    				$requetePreparee->execute(array('option' => 'W', 'classement' => 'nom, prenom'));
    				afficheEtudiants();
    				break;
     
    				case 'choixStatut':
    				$requetePreparee->execute(array('option' => 'W', 'classement' => 'statut, nom, prenom'));
    				afficheEtudiants();
    				break;
     
    				case 'choixGroupe':
    				$requetePreparee->execute(array('option' => 'W', 'classement' => 'groupe, nom, prenom'));
    				afficheEtudiants();
    				break;
     
    				case 'choixOpt':
    				$requetePreparee->execute(array('option' => 'W', 'classement' => 'nomOpt, nom, prenom'));
    				afficheEtudiants();
    				break;
    			}
    		break;
     
    		case 'choixLangues':
    			switch ($_POST['choixClassement']) {
    				case 'choixNomPrenom':
    				$requetePreparee->execute(array('option' => 'L', 'classement' => 'nom, prenom'));
    				afficheEtudiants();
    				break;
     
    				case 'choixStatut':
    				$requetePreparee->execute(array('option' => 'L', 'classement' => 'statut, nom, prenom'));
    				afficheEtudiants();
    				break;
     
    				case 'choixGroupe':
    				$requetePreparee->execute(array('option' => 'L', 'classement' => 'groupe, nom, prenom'));
    				afficheEtudiants();
    				break;
     
    				case 'choixOpt':
    				$requetePreparee->execute(array('option' => 'L', 'classement' => 'nomOpt, nom, prenom'));
    				afficheEtudiants();
    				break;
    			}
    		break;
    	}
    }	
    ?>

    L'affichage des étudiants selon leur options (la premiere liste déroulante) à l'air de fonctionner, il ne conserve que les étudiants dont l'option a été sélectionner.
    Le classement par ordre alphabétique sur les noms, prénoms aussi fonctionne.

    Par contre, dès que je veux les classer par statut ou groupe, ça m'affiche quelque chose d'incorrect, ils sont mal classés
    Pourtant quand je tape la requête dans la console SQL, elle, m'affiche quelque chose de correct.

    Pouvez vous m'aider, svp?

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu ne peux pas préparer des noms de colonnes.
    Donc pas écrire D'autre part ton code est affreusement redondant et il faut utiliser JOIN pour faire une jointure entre deux tables
    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
    if (isset($_POST['choixOption'])) {
        $tblOption = array('choixBio'=>'B', 'choixChimie'=>'C', 'choixGeo'=>'S', 'choixWeb'=>'W', 'choixLangues'=>'L');
        $tblClassement = array('choixNomPrenom'=>'nom, prenom', 'choixStatut'=>'statut, nom, prenom', 'nomOpt, nom, prenom');
     
        if (isset($tblOption[$_POST['choixOption']], $tblClassement[$_POST['choixClassement']])) {
     
            $requetePreparee = $bdd->prepare('SELECT etudiant.nom AS nomEtu, prenom, groupe, statut, numStageA, options.nom AS nomOpt
    	FROM etudiant INNER JOIN options ON etudiant.opt = options.code
    	WHERE etudiant.opt = :option
    	ORDER BY ' . $tblClassement[$_POST['choixClassement']]);
            $requetePreparee->execute(array('option' => $tblOption[$_POST['choixOption']]));
     
        }
        else {
              echo 'Choix inexistants';
         }
    }
    ?>
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre régulier

    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 118
    Points : 81
    Points
    81
    Par défaut
    Merci beaucoup!
    En effet, c'est beaucoup plus propre.


    Code php : 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
    <?php
    if (isset($_POST['choixOption'])) {
    	$tabOption = array('choixBio'=>'B', 'choixChimie'=>'C', 'choixGeo'=>'S', 'choixWeb'=>'W', 'choixLangues'=>'L');
    	$tabClassement = array('choixNomPrenom'=>'nom, prenom', 'choixStatut'=>'statut, nom, prenom', 'choixOpt'=>'nomOpt, nom, prenom', 'choixGroupe'=>'groupe, nom, prenom');
     
    	if (isset($tabOption[$_POST['choixOption']], $tabClassement[$_POST['choixClassement']])) {
    		$requete = 'SELECT etudiant.nom AS nomEtu, prenom, groupe, statut, numStageA, options.nom AS nomOpt';
    		$requete .= 'FROM etudiant INNER JOIN options ON etudiant.opt = options.code';
    		$requete .= 'WHERE etudiant.opt = :option';
    		$requete .= 'ORDER BY ' . $tabClassement[$_POST['choixClassement']];
     
        	        $requetePrep = $bdd->prepare($requete);
    		$requetePrep->bindValue(':option', $tabOption[$_POST['choixOption']], PDO::PARAM_STR);
    		$requetePrep->execute();
    		//$requetePrep->execute(array('option' => $tabOption[$_POST['choixOption']]));
     	}
     
    	while ($donnees=$requetePrep->fetch(PDO::FETCH_OBJ)) {
    	?>
    		<p>
    		<strong>Nom et prénom:</strong> : <?php echo $donnees->nomEtu . " " . $donnees->prenom; ?><br />
    		<strong>Groupe et statut :</strong> : <?php echo $donnees->groupe . " " . $donnees->statut; ?><br />
    		<strong>Option:</strong> <?php echo $donnees->nomOpt; ?> <br />
    		<strong>Stage:</strong> <?php echo $donnees->numStageA; ?> <br />
    		</p>
    	<?php
    	}
    	$requetePrep->closeCursor();
    }
    ?>

    Par contre, j'ai une erreur sur le execute().
    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined' in C:\Program Files\wamp\www\trombi.php on line 58
    J'ai testé en décomposant avec un bindValue() mais sans succès.

  4. #4
    Membre régulier

    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 118
    Points : 81
    Points
    81
    Par défaut
    Quand j'ai
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $requetePrep->execute(array('option' => $tabOption[$_POST['choixOption']]));

    $_POST['choixOption'] renvoie choixBio (par exemple).

    Du coup, la ligne est équivalente à :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $requetePrep->execute(array('option' => $tabOption[choixBio]));

    Or moi je veux des apostrophes de part et d'autre du choix de l'option comme ceci :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $requetePrep->execute(array('option' => $tabOption['choixBio']));

    Je me demande si c'est pas ça qui implique l'erreur?
    Comment régler le problème?

    Edit: non j'ai rien dit, ça marche pas non plus.

Discussions similaires

  1. [AJAX] Affichage du résultat des select ajax
    Par baddevil dans le forum jQuery
    Réponses: 1
    Dernier message: 01/06/2014, 16h14
  2. affichage du résultat des requêtes
    Par Bogs dans le forum Langage SQL
    Réponses: 1
    Dernier message: 04/04/2008, 10h55
  3. [MySQL] [Encodage] Mauvais affichage des données
    Par opeo dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 23/07/2007, 14h22
  4. Réponses: 2
    Dernier message: 17/05/2007, 00h22
  5. Mauvais affichage des images et message d'erreur
    Par SLAM JACK dans le forum Langage
    Réponses: 3
    Dernier message: 29/03/2006, 18h11

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