restriction sur affichage

Eléphant du PHP | 155 Messages

02 juin 2005, 15:25

hi,

ma table de donnée s'affiche dans un tableau. Je veut faire des restrictions pour n'afficher par exemple que les enregistrements dont "tel champs" == "maurice".

J'ai fait un fomulaire avec des menus deroulant pour chaque champ que je veut restreindre.

ca, c'est l'affichage de mon tableau avec toute la table.
$req_brouillon=mysql_query("select * from phpgw_workf_versions ORDER BY id_note, id_version");
 echo "<table border='1'>";
echo "<tr><td></td><td>Etat</td><td>Service</td><td>Titre</td><td>Date d'instance</td><td>destinataire</td>";

while ($a_result = mysql_fetch_array($req_brouillon, MYSQL_ASSOC)) {

$resultq = mysql_query("SELECT DISTINCT  date FROM phpgw_workf_instances WHERE id_instance = ".$a_result['id_instance']);
$bacp=mysql_fetch_array($resultq, MYSQL_ASSOC);

$dec= explode ("-",$bacp['date']);
$a=$dec[0];
$b=$dec[1];
$c=$dec[2];

switch ($b)
{case "01":$moii="Janvier";break;
case "02": $moii="Février";break;
case "03": $moii="Mars";break;
case "04": $moii="Avril";break;
case "05": $moii="Mai";break;
case "06": $moii="Juin";break;
case "07": $moii="Juillet";break;
case "08": $moii="Aout";break;
case "09": $moii="Septembre";break;
case "10": $moii="Octobre";break;
case "11": $moii="Novembre";break;
case "12": $moii="Decembre";break;
}
$bac=$c."-".$moii."-".$a;

$s = "SELECT DISTINCT  nom_service FROM phpgw_workf_services WHERE id_service = ".$a_result['id_service'];
// Envoi de la requête à MySQL
$results = mysql_query($s);
$bic=mysql_fetch_array($results, MYSQL_ASSOC);

  echo "<tr>"; 
echo "<td><a href='consulter_archive.php?id=".$a_result['id_note']."&ide=".$a_result['id_version']."'>Consulter</a></td>";
echo "<td>".$etat."</td>"; 
  echo "<td>".$bic['nom_service']."</td>"; 
  echo "<td>".$a_result['titre']."</td>"; 
  echo "<td>".$bac."</td>"; 
  echo "<td>".$a_result["destinataire"]."</td>"; 
  echo "</tr>"; 
} 
 echo "</table>";
now, comme je veux faire des rstrictions en fonction des menus déroulant, j'ai ajouter du code.

j'ai fait un fomulaire avec mes menus, que j'envoie a la même page.
sur cette page, je teste si elle recoit les variables des menus deroulants.
Si elle les recoit, alors j'aimerai que ma requete (pour l'affichage du tableau) se face avec des where(condition du menu deroulant)
Mon problème, c'est que dans mes menus, j'ai, en plus de mes enregistrements, l'option "Tous" (qui sert a tout afficher)

Voici l'ebauche de mon taf:
<?php
if (isset ($_POST['service'],$_POST['date'],$_POST['auteur']))
{
$rouge=$_POST['service'];
$jaune=$_POST['date'];
$vert=$_POST['auteur'];

if ($rouge=='Tous')
{//RQ/

}
else
{//RQ?
}

if ($jaune=='Tous')
{//RQ?
}
else
{$dec= explode ("-",$jaune);
$a=$dec[0];
$b=$dec[1];
$c=$dec[2];
switch ($b)
{case "Janvier":$moii="01";break;
case "Février": $moii="02";break;
case "Mars": $moii="03";break;
case "Avril": $moii="04";break;
case "Mai": $moii="05";break;
case "Juin": $moii="06";break;
case "Juillet": $moii="07";break;
case "Aout": $moii="08";break;
case "Septembre": $moii="09";break;
case "Octobre": $moii="10";break;
case "Novembre": $moii="11";break;
case "Decembre": $moii="12";break;
}
$mauve=$c."-".$moii."-".$a;
//RQ?
$rqut = "SELECT DISTINCT nom_service FROM phpgw_workf_services ORDER BY nom_service";
$resultut = mysql_query($rqut)
}


if ($vert=='Tous')
{//
}
else 
{
}


}
?>
    <form name='tri' action='archives.php' method='post'>    
 
Service :
            <select name='nom_service'><br>

        <option value=Tous selected>Tous

<?php
include ("connexion.php");
connection ();
$rq = "SELECT DISTINCT nom_service FROM phpgw_workf_services ORDER BY nom_service";
$result = mysql_query($rq)
or die ("Exécution de la requête service impossible".mysql_error());
//DISTINCT permet d'afficher qu'une fois les données
//on liste tous les services de la table service.
while ($liste=mysql_fetch_array($result))
{
    extract($liste);
  
    
    echo "<option value=" .$nom_service.">".$nom_service."</option>\n";
}

?></select>
date :
            <select name='date'><br><option value=Tous selected>Tous
<?php
      //on selectionne la date dans la table instance
    $rqs = "SELECT DISTINCT date FROM phpgw_workf_instances ORDER BY date";
    $results = mysql_query($rqs)
    or die ("Exécution de la requête instance impossible : ".mysql_error());
    //DISTINCT permet d'afficher qu'une fois les données
        //on liste toutes les options possibles c-a-d tous les enregistrements.
        while ($list=mysql_fetch_array($results))
        {
extract($list);

//affciche la date en francais et en toutes lettres

$dec= explode ("-",$date);
$a=$dec[0];
$b=$dec[1];
$c=$dec[2];

switch ($b)
{case "01":$moii="Janvier";break;
case "02": $moii="Février";break;
case "03": $moii="Mars";break;
case "04": $moii="Avril";break;
case "05": $moii="Mai";break;
case "06": $moii="Juin";break;
case "07": $moii="Juillet";break;
case "08": $moii="Aout";break;
case "09": $moii="Septembre";break;
case "10": $moii="Octobre";break;
case "11": $moii="Novembre";break;
case "12": $moii="Decembre";break;

}

$dat=$c."-".$moii."-".$a;
echo "<option value=".$dat.">".$dat."</option>\n ";
}echo "</select>";
echo  "<INPUT TYPE='submit' name ='OK' VALUE='OK'>";
?>
</form>
cette partie de code, je la situe en debut de page de code.
elle fait les test puis ensuite crée les boutons. Mais je ne sais pas comment gerer mes requtes.

Mammouth du PHP | 19672 Messages

02 juin 2005, 15:37

Fais-toi une requête minimaliste et une avec le maximum d'options: tu vas voir qu'il y a une partie qui est toujours la même: le début. "SELECT ..... FROM... WHERE "

Il te reste à ajouter des clauses. Il faut compter combien tu as de clauses à rajouter. Dans tes test if($jaune = "Tous") par exemple, tu détermines une clause "`champ_x` = 'valeur' et tu rajoutes AND ou bien OR selon le type de tri.

Mais il ne faudra pas rajouter AND ni OR si c'est la dernière clause et c'est pour ça que tu auras besoin du nombre de clauses nécessaires. Ce nombre servira à ajouter un pointeur.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 155 Messages

02 juin 2005, 16:17

oui, je pensait faire un truc dans le même genre

avec une variable qui recoit une clause ou non(selon Tous ou pas) mais justement le problème que j'avait rencontré c t le 'and'. Parce que si ma 1ère restriction ==Tous, alors je met pas de and car sinon j'aurai "where and" et pareil pour la dernière ca donnerai: and";

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

02 juin 2005, 16:44

il y a une astuce qui permet de créer une requête sans s'embêter à savoir si c'est WHERE ou AND

regarde ici : http://www.phpfrance.com/forums/voir_sujet-2276.php

Eléphant du PHP | 155 Messages

02 juin 2005, 17:12

voici tout ce que j'ai du rajouter (bon, evidemment, ca marche pas)
C'est moche, c'est dur a lire, c'est lourd, mais c ce que j'ai su faire.
<?php
include ("connexion.php");
connection ();
$clause=0;
if (isset ($_POST['service'],$_POST['date'],$_POST['auteur']))//10
{
$rouge=$_POST['service'];
$jaune=$_POST['date'];
$vert=$_POST['auteur'];

if ($rouge=='Tous')
{$claus1="";

}
else//20
{$clause=$clause+1;
$rqla = "SELECT DISTINCT id_service FROM phpgw_workf_versions where nom_service=".$rouge;
$resultla = mysql_query($rqla);
$uty=mysql_fetch_array($resultla, MYSQL_ASSOC);
$tyu=$uty['id_service'];
$claus1="id_service=".$tyu;
}

if ($jaune=='Tous')
{$claus2="";//30
}
else
{$clause=$clause+1;
$dec= explode ("-",$jaune);
$a=$dec[0];
$b=$dec[1];
$c=$dec[2];
switch ($b)
{case "Janvier":$moii="01";break;
case "Février": $moii="02";break;//40
case "Mars": $moii="03";break;
case "Avril": $moii="04";break;
case "Mai": $moii="05";break;
case "Juin": $moii="06";break;
case "Juillet": $moii="07";break;
case "Aout": $moii="08";break;
case "Septembre": $moii="09";break;
case "Octobre": $moii="10";break;
case "Novembre": $moii="11";break;
case "Decembre": $moii="12";break;//50
}
$mauve=$c."-".$moii."-".$a;

$rqut = "SELECT DISTINCT id_instance FROM phpgw_workf_versions where date=".$jaune;
$resultl = mysql_query($rqut);
$utypmysql_fetch_array($resultl, MYSQL_ASSOC);
$tyup=$utyp['id_service'];
$claus2="id_service=".$tyup;
}
//60

if ($vert=='Tous')
{$claus3="";
}
else 
{$clause=$clause+1;
$claus3="auteur=".$vert;
}

//70
}
?>
    <form name='tri' action='archives.php' method='post'>    
 
Service :
            <select name='nom_service'><br>

        <option value=Tous selected>Tous

<?php//80

$rq = "SELECT DISTINCT nom_service FROM phpgw_workf_services ORDER BY nom_service";
$result = mysql_query($rq)
or die ("Exécution de la requête service impossible".mysql_error());
//DISTINCT permet d'afficher qu'une fois les données
//on liste tous les services de la table service.
while ($liste=mysql_fetch_array($result))
{
    extract($liste);//90
  
    
    echo "<option value=" .$nom_service.">".$nom_service."</option>\n";
}

?></select>
date :
            <select name='date'><br><option value=Tous selected>Tous
<?php
      //on selectionne la date dans la table instance//100
    $rqs = "SELECT DISTINCT date FROM phpgw_workf_instances ORDER BY date";
    $results = mysql_query($rqs)
    or die ("Exécution de la requête instance impossible : ".mysql_error());
    //DISTINCT permet d'afficher qu'une fois les données
        //on liste toutes les options possibles c-a-d tous les enregistrements.
        while ($list=mysql_fetch_array($results))
        {
extract($list);
//110
//affciche la date en francais et en toutes lettres

$dec= explode ("-",$date);
$a=$dec[0];
$b=$dec[1];
$c=$dec[2];

switch ($b)
{case "01":$moii="Janvier";break;
case "02": $moii="Février";break;//120
case "03": $moii="Mars";break;
case "04": $moii="Avril";break;
case "05": $moii="Mai";break;
case "06": $moii="Juin";break;
case "07": $moii="Juillet";break;
case "08": $moii="Aout";break;
case "09": $moii="Septembre";break;
case "10": $moii="Octobre";break;
case "11": $moii="Novembre";break;
case "12": $moii="Decembre";break;//130

}

$dat=$c."-".$moii."-".$a;
echo "<option value=".$dat.">".$dat."</option>\n ";
}echo "</select>";
echo  "<INPUT TYPE='submit' name ='OK' VALUE='OK'>";
?>
</form>

 
<?php 
if ($clause==0)
{$req_brouillon=mysql_query("select * from phpgw_workf_versions ".$claus1 $claus2 $claus3."ORDER BY id_note,id_version");}

else if ($clause==1)
{$req_brouillon=mysql_query("select * from phpgw_workf_versions ".$claus1 $claus2 $claus3."ORDER BY id_note, id_version");}
//150
else if ($clause==2)
{if ($claus1==""){$req_brouillon=mysql_query("select * from phpgw_workf_versions ". $claus2 ."and".$claus3."ORDER BY id_note, id_version");}

if ($claus2==""){$req_brouillon=mysql_query("select * from phpgw_workf_versions ".$claus1."and".$claus3."ORDER BY id_note, id_version");}

if ($claus3==""){$req_brouillon=mysql_query("select * from phpgw_workf_versions ".$claus1."and". $claus2 ."ORDER BY id_note, id_version");}
}


else if $clause==3)
{$req_brouillon=mysql_query("select * from phpgw_workf_versions ".$claus1."and". $claus2 ."and".$claus3."ORDER BY id_note, id_version");}
}
ensuite, je travaille sur ma requete $req_brouillon.
normalement, au niveau algo ca devrait passer (mê si c trés compliqué) mais ca passe pas du tt.

Je vais regarder ton lien parce que je desespère.

Eléphant du PHP | 155 Messages

02 juin 2005, 17:27

je comprend pas,

si je fait un truc du genre:
$req = "SELECT * FROM table WHERE 1 = 1";
if ($type!="")  $req .= " AND type = '".$type."'";
if ($ville!="") $req .= " AND ville = '".$ville."'";
je n'ai pas plusieurs restrictions en mê tps!

ca m'enerve de me prendre le crane pour 3 malheureux menus et 1 tri!
3jours que je suis dessus!!!!
help me!

Eléphant du PHP | 155 Messages

02 juin 2005, 17:28

si, c bon, j'ai compris, !!!!!!!!

magnifique (bon, j'ai pas testé! mais g compris)

Eléphant du PHP | 155 Messages

02 juin 2005, 17:53

bon ben, j'ai suivi l'idée, ca marche pas, je reprendrai ca demain.
Si qqun voit un pb a mon code...
if (isset ($_POST['service'],$_POST['date'],$_POST['auteur']))
{
$rouge=$_POST['service'];
$jaune=$_POST['date'];
$vert=$_POST['auteur'];


$rqla = "SELECT DISTINCT id_service FROM phpgw_workf_versions where nom_service=".$rouge;
$resultla = mysql_query($rqla);
$uty=mysql_fetch_array($resultla, MYSQL_ASSOC);
$tyu=$uty['id_service'];

$dec= explode ("-",$jaune);
$a=$dec[0];
$b=$dec[1];
$c=$dec[2];
switch ($b)
{case "Janvier":$moii="01";break;
case "Février": $moii="02";break;
case "Mars": $moii="03";break;
case "Avril": $moii="04";break;
case "Mai": $moii="05";break;
case "Juin": $moii="06";break;
case "Juillet": $moii="07";break;
case "Aout": $moii="08";break;
case "Septembre": $moii="09";break;
case "Octobre": $moii="10";break;
case "Novembre": $moii="11";break;
case "Decembre": $moii="12";break;
}
$mauve=$c."-".$moii."-".$a;

$rqut = "SELECT DISTINCT id_instance FROM phpgw_workf_versions where date=".$jaune;
$resultl = mysql_query($rqut);
$utyp=mysql_fetch_array($resultl, MYSQL_ASSOC);
$tyup=$utyp['id_service'];

$reqm = "SELECT * FROM phpgw_workf_versions WHERE 1 = 1";
if ($rouge!="Tous")  $reqm .= " AND id_service = '".$tyu."'";
if ($jaune!="Tous") $reqm .= " AND id_instance = '".$tyup."'";
if ($vert!="Tous") $reqm .= " AND auteur = '".$vert."'";

}
pi voilà mon tableau:
while ($a_result = mysql_fetch_array($reqm, MYSQL_ASSOC)) {

$resultq = mysql_query("SELECT DISTINCT  date FROM phpgw_workf_instances WHERE id_instance = ".$a_result['id_instance']);
$bacp=mysql_fetch_array($resultq, MYSQL_ASSOC);

$dec= explode ("-",$bacp['date']);
$a=$dec[0];
$b=$dec[1];
$c=$dec[2];

switch ($b)
{case "01":$moii="Janvier";break;
case "02": $moii="Février";break;
case "03": $moii="Mars";break;
case "04": $moii="Avril";break;
case "05": $moii="Mai";break;
case "06": $moii="Juin";break;
case "07": $moii="Juillet";break;
case "08": $moii="Aout";break;
case "09": $moii="Septembre";break;
case "10": $moii="Octobre";break;
case "11": $moii="Novembre";break;
case "12": $moii="Decembre";break;

}

$bac=$c."-".$moii."-".$a;

$s = "SELECT DISTINCT  nom_service FROM phpgw_workf_services WHERE id_service = ".$a_result['id_service'];
// Envoi de la requête à MySQL
$results = mysql_query($s);
$bic=mysql_fetch_array($results, MYSQL_ASSOC);


  echo "<tr>"; 
echo "<td><a href='consulter_archive.php?id=".$a_result['id_note']."&ide=".$a_result['id_version']."'>Consulter</a></td>";
echo "<td>".$etat."</td>"; 
  echo "<td>".$bic['nom_service']."</td>"; 
  echo "<td>".$a_result['titre']."</td>"; 
  echo "<td>".$bac."</td>"; 
  echo "<td>".$a_result["destinataire"]."</td>"; 

  echo "</tr>"; 
} 

 echo "</table>";
[/php]


a cette ligne là:
while ($a_result = mysql_fetch_array($reqm, MYSQL_ASSOC)) {
j'ai cette erreur: Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/html/egroupware/workf/appli/archives.php on line 128

et dans ma page, j'ai mon tableau vide qui s'affiche. (pas normal) et quand je fait une restriction, ben y'a rein qui change.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

02 juin 2005, 18:17

affiche les erreurs SQL après l'exécution de ta requête ou affiche la à l'écran et teste la dans phpMyAdmin par exemple

si il y a une erreur ici tu la verra

j'ai regardé vite fait mais s'il y a tout le code je n'ai pas l'impression que tu exécutes cette requête : $reqm

Eléphant du PHP | 155 Messages

03 juin 2005, 10:28

tout le code n'y est pas.
Mais effectivement, je ne l'executai pas.

Now, je l'execute, mais y'a rien qui a changer, j'ai toujours un warning et untableau vide.

J'ai tester ma requete rqmp dasn my admin et il n'y a pas de problème.

edit:
now j'ai plus de warning, mais mon tableau est vide.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

03 juin 2005, 13:37

et pour ce qui est des éventuelles erreurs SQL ?
même si la requête est bonne c'est bizarre qu'elle ne s'exécute pas y'a forcément un problème...
$exec = mysql_query($reqm);

if (!$exec) {
	echo "Erreur SQL : <br>";
	echo mysql_errno()." : ".mysql_error();
}

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

03 juin 2005, 13:46

c'est bien la requête créée dynamiquement que tu as testé ? => $reqm

j'ai regardé un peu le code et j'avoue que j'ai du mal à suivre, tes noms de variables sont un peu obscurs et y'a des requêtes un peu partout alors on s'y perd

Eléphant du PHP | 155 Messages

03 juin 2005, 14:25

oui, c'est bien cette requete là.

Pour mes variables, il m'en falait tellement que je ne trouvait lpas assez de nom explicites, c'est pour ca que c'est des mots qui veulent rien dire.

et oui y'a bcp de requetes,

je comprendrai que vous laissiez tomber. C'est pas clair!

merci qd mê du coup de main.

Je vais revoir tout ca et essayer de trouvé mon bug.

Mammouth du PHP | 19672 Messages

03 juin 2005, 14:58

while ($a_result = mysql_fetch_array($reqm, MYSQL_ASSOC)) {
Si l'erreur est ici, alors il faut remonter juste avant ça et savoir qu'est-ce que contient au juste la variable $reqm : la clé du problème est là. Syntaxiquement la formulation est correcte, donc c'est avant qu'est le bobo.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 155 Messages

03 juin 2005, 15:30

alors, j'ai repris depuis le debut:
J'ai virer tout le code que j'ai fait pour réaliser mes restrictions.

Sur ma page, a l'execution, j'ai un tableau remplis de tous mes enregistrements de ma table.
je met le code dans son integralité:
<html> 
    <head> 
        <title>archives.php</title> 
    </head> 
    <body> 
        <A HREF="index.php"> retour a l\'index </A><br><br> 

<?php
include ("connexion.php");
connection ();

$reqm = "SELECT * FROM phpgw_workf_versions WHERE 1 = 1";
//if ($rouge!="Tous")  $reqm .= " AND id_service = '".$tyu."'";
//if ($jaune!="Tous") $reqm .= " AND id_instance = '".$tyup."'";
//if ($vert!="Tous") $reqm .= " AND auteur = '".$vert."'";
$reqmpo = mysql_query($reqm);

 echo "<table border='1'>";
echo "<tr><td></td><td>Etat</td><td>Service</td><td>Titre</td><td>Date d'instance</td><td>destinataire</td>";

while ($a_result = mysql_fetch_array($reqmpo, MYSQL_ASSOC)) {

$resultq = mysql_query("SELECT DISTINCT  date FROM phpgw_workf_instances WHERE id_instance = ".$a_result['id_instance']);
$bacp=mysql_fetch_array($resultq, MYSQL_ASSOC);

$dec= explode ("-",$bacp['date']);
$a=$dec[0];
$b=$dec[1];
$c=$dec[2];

switch ($b)
{case "01":$moii="Janvier";break;
case "02": $moii="Février";break;
case "03": $moii="Mars";break;
case "04": $moii="Avril";break;
case "05": $moii="Mai";break;
case "06": $moii="Juin";break;
case "07": $moii="Juillet";break;
case "08": $moii="Aout";break;
case "09": $moii="Septembre";break;
case "10": $moii="Octobre";break;
case "11": $moii="Novembre";break;
case "12": $moii="Decembre";break;

}

$bac=$c."-".$moii."-".$a;

$s = "SELECT DISTINCT  nom_service FROM phpgw_workf_services WHERE id_service = ".$a_result['id_service'];
// Envoi de la requête à MySQL
$results = mysql_query($s);
$bic=mysql_fetch_array($results, MYSQL_ASSOC);


  echo "<tr>"; 
echo "<td><a href='consulter_archive.php?id=".$a_result['id_note']."&ide=".$a_result['id_version']."'>Consulter</a></td>";
echo "<td>".$etat."</td>"; 
  echo "<td>".$bic['nom_service']."</td>"; 
  echo "<td>".$a_result['titre']."</td>"; 
  echo "<td>".$bac."</td>"; 
  echo "<td>".$a_result["destinataire"]."</td>"; 
  echo "</tr>"; 
} 
 echo "</table>";
mysql_close();
?> 
        </table> 
    </body> 
</html> 
Ce qui est sûr, c'est que ca, ca marche!.