Filtre avant affichage

Eléphant du PHP | 103 Messages

25 janv. 2012, 11:29

Bonjour,

Je me tourne vers vous en espérant avoir une réponse à mon problème.

Voici un bout de code :
<?php
$i=0;
$j=0;
$remplit = false;
$note = array();
if(isset($_SESSION['notemet']))
{
	$remplit = true;
	foreach($_SESSION['notemet'] as $element)
	{
		$note[$i] = $element;
		$i++;
	}
}
$te = $bdd->query('SELECT l_met_scomp.niveau, scompetence.libscomp, scompetence.defscomp, formation.libform, formation.codeform FROM l_met_scomp, scompetence, competence, formation, l_form_scomp 
WHERE l_met_scomp.codemet = '.$_SESSION['met'].' AND l_met_scomp.codescomp = scompetence.codescomp AND scompetence.codecomp = competence.codecomp AND l_form_scomp.codescomp = scompetence.codescomp AND l_form_scomp.codeform = formation.codeform');
while($don = $te->fetch())
{
	$cib = $don['niveau'];
	$libsc = $don['libscomp'];
	$defsc = $don['defscomp'];
	$libf = $don['libform'];
	$codef = $don['codeform'];
	?>
	<tr>
	  <td align="left" width="300"><p onmouseover="montre('<?php echo addslashes($defsc); ?>');" onmouseout="cache();"><?php echo $libsc; ?></td>
	  <td><?php echo $cib; ?></td>
	  <td><?php if($remplit) echo $note[$j]; $j++; ?></td>
	  <td align="left"><input type="checkbox" name="for[]" id="for[]" value="<?php echo $codef; ?>" /><label for="for[]"><?php echo $libf; ?></label></td>
	  <td><select name="prio[<?php echo $codef; ?>]" id="prio[<?php echo $codef; ?>]">
	  <option value=""></option>
	  <option value="1">1</option>
	  <option value="2">2</option>
	  <option value="3">3</option></td>
	  <td><textarea name="com[<?php echo $codef; ?>]" id="com[<?php echo $codef; ?>]" rows="3" cols="50"></textarea></td>
	</tr>
}
Ce code m'affiche quelque chose comme ça :

Compétences | Niveaux cibles | Niveaux collab | Formation associée | Priorité | Commentaire


En fait pour l'instant j'affiche toutes les compétences. Ce que j'aimerai c'est filtrer par rapport à l'écart entre le niveau cible et le niveau du collab. Si l'écart est >= à 2 alors on affiche la ligne, sinon on n'affiche pas. Et je ne vois pas comment m'y prendre.

Merci
Modifié en dernier par Jibe le 25 janv. 2012, 17:27, modifié 2 fois.

ViPHP
xTG
ViPHP | 7331 Messages

25 janv. 2012, 12:01

Ton niveau collab semble ne pas être toujours renseigné.
Quel comportement souhaites-tu dans le cas où il n'est pas renseigné ?

Eléphant du PHP | 103 Messages

25 janv. 2012, 12:04

Si normalement il est toujours renseigné.
C'est une page précédente ou l'utilisateur rentre les niveaux et si il y a des oublis ils sont signalés donc à priori le cas ne devrait pas arriver

ViPHP
xTG
ViPHP | 7331 Messages

25 janv. 2012, 13:01

Dans ce cas : (avec suppression de la condition inutile sur le renseignement de niveau collab)
<?php
while($don = $te->fetch())
{
        $cib = $don['niveau'];
        $libsc = $don['libscomp'];
        $defsc = $don['defscomp'];
        $libf = $don['libform'];
        $codef = $don['codeform'];
        if( $cib - $note[$j] >= 2 ) {
        ?>
        <tr>
          <td align="left" width="300"><p onmouseover="montre('<?php echo addslashes($defsc); ?>');" onmouseout="cache();"><?php echo $libsc; ?></td>
          <td><?php echo $cib; ?></td>
          <td><?php echo $note[$j]; $j++; ?></td>
          <td align="left"><input type="checkbox" name="for[]" id="for[]" value="<?php echo $codef; ?>" /><label for="for[]"><?php echo $libf; ?></label></td>
          <td><select name="prio[<?php echo $codef; ?>]" id="prio[<?php echo $codef; ?>]">
          <option value=""></option>
          <option value="1">1</option>
          <option value="2">2</option>
          <option value="3">3</option></td>
          <td><textarea name="com[<?php echo $codef; ?>]" id="com[<?php echo $codef; ?>]" rows="3" cols="50"></textarea></td>
        </tr>
        <?php
        }
}

Eléphant du PHP | 103 Messages

25 janv. 2012, 17:00

Merci ça marche.

Par contre j'ai un autre problème.
Dans le 1er message que j'ai posté j'ai mis un extrait de code en disant que ça affichait un certains nombres de colonnes avec des informations...
<?php
<td align="left" width="300"><p onmouseover="montre('<?php echo addslashes($defsc); ?>');" onmouseout="cache();"><?php echo $libsc; ?></td>
          <td><?php echo $cib; ?></td>
          <td><?php echo $note[$j]; $j++; ?></td>
          <td align="left"><input type="checkbox" name="for[]" id="for[]" value="<?php echo $codef; ?>" /><label for="for[]"><?php echo $libf; ?></label></td>
          <td><select name="prio[<?php echo $codef; ?>]" id="prio[<?php echo $codef; ?>]">
          <option value=""></option>
          <option value="1">1</option>
          <option value="2">2</option>
          <option value="3">3</option></td>
          <td><textarea name="com[<?php echo $codef; ?>]" id="com[<?php echo $codef; ?>]" rows="3" cols="50"></textarea></td>
?>
Compétences | Niveaux cibles | Niveaux collab | Formation associée | Priorité | Commentaire
comp1 4 2 form1 2 com1
comp2 3 1 form2 3 com2
comp3 2 1 form1 2 com3

Pour les priorités et les commentaires je crée des tableaux à partir du code formation ($codef) et dans la page suivante (d'enregistrement) je fais un foreach pour enregistrer mes données dans la base. Le problème c'est que si une compétence est liée à la même formation il m'en prend qu'une seule...

Exemple : Si je prend la comp1 et la comp3 qui sont toutes les deux liées à la form1, au moment de l'enregistrement seule une seule sera retenue... Est-ce qu'il y a un moyen de contourner ça ou alors faut-il que je crée mes tableaux avec un code unique ?

ViPHP
xTG
ViPHP | 7331 Messages

25 janv. 2012, 17:43

Il faut toujours travailler sur une clé unique.
Donc la compétence dans ton cas.

Eléphant du PHP | 103 Messages

25 janv. 2012, 17:59

Ca m'arrange pas du tout ça :cry:. Je voulais enregistrer dans ma base les priorités et commentaires liées aux formations pour avoir pouvoir ressortir le tout dans un tableau... Si il faut que je passe par les codes compétences ça fausse tout

ViPHP
xTG
ViPHP | 7331 Messages

25 janv. 2012, 19:28

Travailles sur un jeu de clé (compétence + formation) sinon.
Comme ça pour le traitement tu peux faire ce que tu souhaites.

Eléphant du PHP | 103 Messages

26 janv. 2012, 11:24

Oui c'est une bonne idée mais dans une ligne de code comme celle-ci :
<td><select name="prio[<?php echo $codef; ?>]" id="prio[<?php echo $codef; ?>]">
Comment je peux faire le tableau à partir de deux clés (codef et codecomp) ?

ViPHP
xTG
ViPHP | 7331 Messages

26 janv. 2012, 12:40

tu peux le nommer ainsi : tonTab[premiereCle-secondeCle]
Ainsi à la récupération tu fais un explode de l'index sur le tiret et tu récupères tes deux clés.

Eléphant du PHP | 103 Messages

26 janv. 2012, 16:37

J'ai suivi ton conseil mais je dois faire un betise quelque part parce que à l'enregistrement dans la base j'ai mes lignes doubles, triples,...
Voilà le bout de code de la page de saisie :
$z = 1;
$te = $bdd->query('SELECT l_met_scomp.niveau, scompetence.libscomp, scompetence.defscomp, formation.libform, formation.codeform FROM l_met_scomp, scompetence, competence, formation, l_form_scomp WHERE l_met_scomp.codemet = '.$_SESSION['met'].' AND l_met_scomp.codescomp = scompetence.codescomp AND scompetence.codecomp = competence.codecomp AND l_form_scomp.codescomp = scompetence.codescomp AND l_form_scomp.codeform = formation.codeform');
while($don = $te->fetch())
{
	$cib = $don['niveau'];
	$libsc = $don['libscomp'];
	$defsc = $don['defscomp'];
	$libf = $don['libform'];
	$codef = $don['codeform'];
	if(($cib - $note[$j]) >= 2)
	{
		<tr>
			<td align="left" width="300"><p onmouseover="montre('<?php echo addslashes($defsc); ?>');" onmouseout="cache();"><?php echo $libsc; ?></td>
			<td><?php echo $cib; ?></td>
			<td><?php if($remplit) echo $note[$j]; //$j++; ?></td>
			<td align="left"><label for="form[]"><?php echo $libf; ?></label></td>
			<td><select name="prio[]" id="prio[]">
				<option value=""></option>
				<option value="1">1</option>
				<option value="2">2</option>
				<option value="3">3</option></td>
			<td><textarea name="com[<?php echo $z.'-'.$codef; ?>]" id="com[<?php echo $z.'-'.$codef; ?>]" rows="3" cols="50"></textarea></td>
		</tr>
<?php
	}
$j++;
$z++;
}
Et voilà le code de la page de traitement pour l'enregistrement dans la base :
$com = $_POST['com'];
$prio = $_POST['prio'];
foreach($com as $element => $valeur)
{
	$string = explode("-", $element);
	foreach($string as $ele)
	{
                foreach($prio as $elements)
	        {
			if($valeur != "" && $elements != "")
			{
				$bdd->exec("INSERT INTO l_collab_form_met VALUES(NULL, '$matricule', '$ele[2]', '$valeur', '$elements', '$date', '$bu')");
			}
		}
	}
}
Mais du coup j'ai des lignes enregistrés plusieurs fois...

ViPHP
xTG
ViPHP | 7331 Messages

26 janv. 2012, 18:31

$string = explode("-", $element);
foreach($string as $ele)
Pourquoi une boucle là dessus ?
Cela veut dire que tu vas enregistrer deux fois, l'une avec 1 et l'autre avec la valeur de $codef.

Eléphant du PHP | 103 Messages

26 janv. 2012, 18:33

En fait j'ai changer, maintenant j'ai ce code là :
foreach($com as $element => $valeur)
{
	foreach($prio as $elements)
	{
		if($valeur != "")
		{
			$bdd->exec("INSERT INTO l_collab_form_met VALUES(NULL, '$matricule', '$element[2]', '$valeur', '$elements', '$date', '$bu')");
		}
	}					
}
Mais ça enregistre toujours en plusieurs fois :(

ViPHP
xTG
ViPHP | 7331 Messages

26 janv. 2012, 18:37

Quand tu dis plusieurs fois c'est plusieurs fois avec exactement les mêmes valeurs ?
Car vu que tu as des boucles c'est normal de constater plusieurs insertions, mais elles ont toutes des valeurs différentes.

Eléphant du PHP | 103 Messages

26 janv. 2012, 18:43

Pas exactement, à chaque fois il m'enregistre autant de ligne qu'il a y de priorité...
Enfin je sais pas si c'est très clair mais par exemple si dans la page de saisie j'ai trois lignes ou faut que je rentre une priorité et un commentaire, supposons que je rentre 1 2 et 3 en priorité puis a b et c en commentaire, dans la base il va m'enregistrer :

a 1
a 2
a 3
b 1
b 2
b 3
c 1
c 2
c 3