Requet de recherche

kabi14 Messages postés 50 Date d'inscription vendredi 8 avril 2011 Statut Membre Dernière intervention 28 juin 2011 - 9 août 2010 à 16:50
kabi14 Messages postés 50 Date d'inscription vendredi 8 avril 2011 Statut Membre Dernière intervention 28 juin 2011 - 11 août 2010 à 19:15
bonjoour
je veux savoire votre avis apropos de:
la realisation d une requet qui fait une multi recherche cest a dire j ai quatre champ trois de type textbox et une liste. lorsque un client veut lancer une recherche il doit avoir le droit de chercher par martricule et par service et periode .il peux ausi lancer une recherche par matricule selement c pour donnèe l exemple donc
marequet doit etre sous la forme
<?php  if (isset($_POST['voyer'])) 
{
  if (isset($_POST['radio'])) 
{
  $log=$_POST['textfield']; 
$L=$_POST['text']; 

$id=mysql_connect('localhost','root','');
     mysql_select_db('ts',$id);
// lancement de la requete
$sql = "SELECT s.libelle,a.Matricule,a.Nom,a.Prenom,d.Type,d.DateDemende,d.user,d.user FROM agents as a,demande as d,service as s where a.codemande=d.Codemande and a.Matricule=s.Matricule and (a.Matricule ="'.$log.'" and s.libelle="'.$L; 
// si je doit suivre cette methode je doit traiter neuf cas lorsqu il sont vide lorsque lune des critaire et selectionnè 

$req = mysql_query($sql);
if(mysql_num_rows($req)==0)
{
echo "aucune information sur se client n existe dans la base de donné";

}
else{
// on recupere le resultat sous forme d'un tableau
echo"service,
Matricule,
Nom,
Prenom,
Type demande,
dateEnvoi de serveur,
Last date,
User,
Etat, \";
$data = mysql_fetch_row($req);
// on libère l'espace mémoire alloué pour cette interrogation de la base
mysql_free_result ($req);

echo\"----
\";
for($i=0;$i<count($data);$i++){

echo\"$data[$i], \"
;}

echo\"\";}
echo"
" ;  
}else {  if (isset($_POST['radi'])) 
{
  $log=$_POST['textfield']; 
$id=mysql_connect('localhost','root','');
     mysql_select_db('ts',$id);
// lancement de la requete
$sql = 'SELECT s.libelle,a.Matricule,a.Nom,a.Prenom,d.Type,d.DateDemende,d.user,d.user FROM agents as a,demande as d,service as s where a.codemande=d.Codemande and a.Matricule=s.Matricule and s.sigle like '.$log; 
$req = mysql_query($sql);
if($req==0)
{
echo "aucune information sur se client n existe dans la base de donné";

}
else{
// on recupere le resultat sous forme d'un tableau
echo"service,
Matricule,
Nom,
Prenom,
Type demande,
dateEnvoi de serveur,
Last date,
User,
Etat, \";
$data2 = mysql_fetch_row($req);
echo\"----
\";
for($i=0;$i<count($data2);$i++){

echo\"$data2[$i], \"
;}

echo\"\";}
echo"
" ;  
}else { 
}

}
}
}
  ?>




merci de m avir acceper dans vore forum

20 réponses

RaftY Messages postés 56 Date d'inscription mardi 5 mars 2002 Statut Membre Dernière intervention 12 août 2010
10 août 2010 à 16:25
Bonjour,

La question à se poser plutot que de vouloir traiter des cas un par un serait plutot de se dire est-ce quels cas se complètent?

Par exemple, j'ai matricule, service et protocole dans un cas. JE vais une recherche avec les trois, mais si j'ai matricule, je ne fais que matriulce, si j'ai protocole, je ne fais que protocole.

Pour moi le plus simple et de faire ainsi:

$sql="SELECT chp1,chp2 .... FROM table1, table2 .... Where {jointure}"
if(isset($_POST["Mat"]))
{
$sql.=" AND MATRICULE =".$_POST["Mat"]." ";
}

if(isset($_POST["service"]))
{
$sql.=" AND SERVICE =".$_POST["service"]." ";
}
...

{Exécution du sql}

Note: .= opérateur de concténation court équivalent à $sql=$sql."AND MAT..."



______oOOO________OOOo________

RaftY, du code C commode!
0
kabi14 Messages postés 50 Date d'inscription vendredi 8 avril 2011 Statut Membre Dernière intervention 28 juin 2011
11 août 2010 à 10:52
merci
je vais tester cette approche
mais j ai une petite question
pour la structure que vous m avais présenter
en traite pas la condition si deux champs sont selectionnè exemple matricule et service a la foie

c est cette ligne
$sql=$sql."AND MAT..."
0
RaftY Messages postés 56 Date d'inscription mardi 5 mars 2002 Statut Membre Dernière intervention 12 août 2010
11 août 2010 à 12:00
Bonjour, oui on complete en fonction des champs disponibles.

Si le champ Mat est présent on ajoute le filtre sur Matricule, si le champ service est présent on ajoute le filtre sur Service ....

DOnc en fait on construit la requête par concaténation des champs présents en appliquant les filtres correspondants

dans l'exmplde de code suivant

$sql="SELECT chp1,chp2 .... FROM table1, table2 .... Where {jointure}" 
if(isset($_POST["Mat"])) 
{ 
$sql.=" AND MATRICULE =".$_POST["Mat"]." "; 
} 

if(isset($_POST["service"])) 
{ 
$sql.=" AND SERVICE ='".$_POST["service"]."' "; 
} 
... 

{Exécution du sql} 


imaginons les 3 cas de figure suivant:
1- Mat=15
$sql => "SELECT chp1,chp2 .... FROM table1, table2 .... Where {jointure} AND MATRICULE=15
2- service="RH"
$sql => "SELECT chp1,chp2 .... FROM table1, table2 .... Where {jointure} AND SERVICE='RH'
3- Mat=, Service=RH
$sql => "SELECT chp1,chp2 .... FROM table1, table2 .... Where {jointure} AND MATRICULE=15 AND AND SERVICE='RH' "

______oOOO________OOOo________

RaftY, du code C commode!
0
kabi14 Messages postés 50 Date d'inscription vendredi 8 avril 2011 Statut Membre Dernière intervention 28 juin 2011
11 août 2010 à 12:26
a oui merci j ai compris l astuce mais ca marche pas et je sais pas pourquoi
c est mon code








Document sans titre

#l_col {
padding: 0px;
float: left;
width: 20%;}
#r_col {
padding: 10px;
float: left;
width: 68%;
border-left: 1px solid #eee;
font: 80%/160% Verdana, Arial, Helvetica, sans-serif;
}


























[gertest.php Etat de demande]
[deco.php Deconection]


Etat de demande
Rechereche
Deconection












rechercher






Matricule,
Service,
Période,

----

,

MPL
tcp
dl
,
date debut
,
date debut



0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
RaftY Messages postés 56 Date d'inscription mardi 5 mars 2002 Statut Membre Dernière intervention 12 août 2010
11 août 2010 à 13:08
re,

il faut vérifier que text1 et les autres text ne soient pas vide pour les affecter en complément de la chaine

if (isset($_POST['text1']) && $_POST['text1']!='')



$sql = "SELECT s.libelle,a.Matricule,a.Nom,a.Prenom,d.Type,d.DateDemende,d.user,d.user FROM agents as a,demande as d,service as s where a.codemande=d.Codemande and a.Matricule=s.Matricule "; 
 if (isset($_POST['text1'])) 
{ $sql.=" and a.Matricule='".$_POST['text1']."' ";
}
 if (isset($_POST['list2'])) 
{ $sql.=" and s.libelle='".$_POST['list2']."' ";
} if (isset($_POST['text2'])&& isset($_POST['text3'])) 
{ $sql.=" and d.DateDemende between ".$_POST['text2']." and ".$_POST['text3']." ";
}


j'ai mis quelques espaces surtout pour le between, ensuite sur libellé comme tu cherches du texte les guillemets sont de rigueur en SQL pour de la recherche de texte.

Autre petit conseil, fait un echo ou un print de ta requete avant de l'exécuter. Cela te permettra par un copier coller dans ton manager SQL de debuguer très vite ton SQL


Autre astuce, la comparaison de caractère est souvent difficile lorsque les soft respecte la casse. Donc faire faire sa comparaison toujours en Majuscule ou toujours en minuscule. strtoupper() strtolower(). Ensuite, toujorus dans la recherche de texte, on met souvent un recherche partiel avec un
LIKE '%".$_POST["text1"]."%'



APres cela est peut être normal mais tu as dans ta requete

DateDemende est-ce une faute de frappe de ta part, ou une faute au moment de conception dela DB.


______oOOO________OOOo________

RaftY, du code C commode!
0
kabi14 Messages postés 50 Date d'inscription vendredi 8 avril 2011 Statut Membre Dernière intervention 28 juin 2011
11 août 2010 à 13:45
merci de ta patienceavec moi
je vais tester ca
non ce n est pas une faute de frappe de ma part
j ai nommer une ce champ comme ca dans la base de donner surtout dans la table demande
0
kabi14 Messages postés 50 Date d'inscription vendredi 8 avril 2011 Statut Membre Dernière intervention 28 juin 2011
11 août 2010 à 13:53
sur libellé comme tu cherches du texte les guillemets sont de rigueur en SQL pour de la recherche de texte.
j ai pas bien compris ta question je recuper le contenus de la liste par $_POST["list2"] et je le mis dans une variable
et pour cette ligne aussi les % ca ajout quoi
LIKE '%".$_POST["text1"]."%'


merci
0
kabi14 Messages postés 50 Date d'inscription vendredi 8 avril 2011 Statut Membre Dernière intervention 28 juin 2011
11 août 2010 à 13:56
aussi il ne marche pas il m affiche le message que aucune information sur se client n existe dans la base de donné.
donc toujours il selectionne rien de la table
($req = mysql_query($sql))==0

merci
0
RaftY Messages postés 56 Date d'inscription mardi 5 mars 2002 Statut Membre Dernière intervention 12 août 2010
11 août 2010 à 14:47
N'oublie pas que tu écris des requete SQL, http://sqlpro.developpez.com/

En SQL lorsque qu'on filtre sur du texte on entoure le filtre par '...' et pas pour les zones dites numériques

ex:

SELECT * FROM MATABLE WHERE MON_NOM= ' RafTy' AND MON_ID > 10


Pour le LIKE c'est un opérateur SQL toujours qui exprime le contenu, si on traduit LIKE de l'anglais c'est verbe "bien aimer", en SQL on dira contient.

si on reprend l'exemple:

1- SELECT * FROM MATABLE WHERE MON_NOM LIKE 'Raf%'/b AND MON_ID > 10
Donnera tous les enregistrements de la table ayant MON_ID supérieur à 10 et pour lesquels MON_NOM commence par Raf

2- SELECT * FROM MATABLE WHERE MON_NOM LIKE '%Ty'/b AND MON_ID > 10

Donnera tous les enregistrements de la table ayant MON_ID supérieur à 10 et pour lesquels MON_NOM termine par Ty

3- SELECT * FROM MATABLE WHERE MON_NOM LIKE '%afT%'/b AND MON_ID > 10

Je te laisse deviner, ce cas

pour finir de debuguer, il ne reste que d'afficher la requete SQL qui doit te rendre {vide}.
Donc avant
$req  = mysql_query($sql);


tu places par exemple


$req = mysql_query($sql);

if (!$req) {
    $message  = 'Requête invalide : ' . mysql_error() . "\n";
    $message .= 'Requête complète : ' . $sql;
    die($message);
}




Il t'affichera l'erreur SQL et la requete
cette gestion d'erreur doit devenir un automatisme, cela evite de passer des heures à ce poser des question sur PHP, alors que c'est peut être la requete qui s'exécute mal.

Apres en focntion de l'erreur tu corrige ton code SQL, tu t'aider de phpmyadmin, ou sqlYog ou autre sql manager.
______oOOO________OOOo________

RaftY, du code C commode!
0
kabi14 Messages postés 50 Date d'inscription vendredi 8 avril 2011 Statut Membre Dernière intervention 28 juin 2011
11 août 2010 à 16:52
merci , oui il mafiche cette erreur

requete invalide:Erreur de syntaxe pr?s de 'and' ? la ligne 1 requete compete:SELECT s.libelle,a.Matricule,a.Nom,a.Prenom,d.Type,d.DateDemende,d.user,d.user FROM agents as a,demande as d,service as s where a.codemande=d.Codemande and a.Matricule=s.Matricule and a.Matricule='11' and s.libelle='dl' and d.DateDemende between and
0
kabi14 Messages postés 50 Date d'inscription vendredi 8 avril 2011 Statut Membre Dernière intervention 28 juin 2011
11 août 2010 à 17:13
merci
j airesolut le problem de la requet

requet invalide:Erreur de syntaxe pr?s de 'and' ? la ligne 1 requete .....
maintenons il m affiche seulement les nom des champ et non pas le contenus ca était un problème de jointure
mais tjr le contenus et vide
0
RaftY Messages postés 56 Date d'inscription mardi 5 mars 2002 Statut Membre Dernière intervention 12 août 2010
11 août 2010 à 17:25
SI les champs s'affiche c'est que la requete est bonne en terme de SQL, mais qu'elle rend une contenu vide

Exemple dans ta table:
Mat libelle dateDemende
11 dl 11/08/2010

Si ta requete est
SELECT s.libelle,a.Matricule,a.Nom,a.Prenom,d.Type,d.DateDemende,d.user,d.user FROM agents as a,demande as d,service as s where a.codemande=d.Codemande and a.Matricule=s.Matricule and a.Matricule='11' and s.libelle='dl' and d.DateDemende between 10/08/2009 and 12/08/2009

La requete est juste en terme de SQL, mais n'a pas données correspondant à ces filtres pouisque l'écart de date est en 2009 et que la datedemande et en 2010. DOnc la rien de sort.

Solution faire print($sql); avant $req=mysql_query($sql);

Tu regardes si la requete est cohérentes avec ta base de données

______oOOO________OOOo________

RaftY, du code C commode!
0
kabi14 Messages postés 50 Date d'inscription vendredi 8 avril 2011 Statut Membre Dernière intervention 28 juin 2011
11 août 2010 à 17:43
je doit mettre
print($sql); avant $req=mysql_query($sql);
il m affiche
sELECT s.libelle,a.Matricule,a.Nom,a.Prenom,d.Type,d.DateDemende,d.user,d.user FROM agents as a,demande as d,service as s where a.Matricule=d.Matricule and a.Matricule=s.Matricule and a.Matricule='11' and s.libelle='dl' and d.DateDemende between "and"
0
RaftY Messages postés 56 Date d'inscription mardi 5 mars 2002 Statut Membre Dernière intervention 12 août 2010
11 août 2010 à 17:55
corrigé

if (isset($_POST['text2'])&& isset($_POST['text3'])) 
{ $sql.=" and d.DateDemende between".$_POST['text2']." and".$_POST['text3']."";
}


par

if (isset($_POST['text2'])&& isset($_POST['text3']) && $_POST['text2']!='' && $_POST['text3']!='') 
{ $sql.=" and d.DateDemende between".$_POST['text2']." and".$_POST['text3']."";
}


______oOOO________OOOo________

RaftY, du code C commode!
0
kabi14 Messages postés 50 Date d'inscription vendredi 8 avril 2011 Statut Membre Dernière intervention 28 juin 2011
11 août 2010 à 18:08
non ca marche pas encore il une erreur:
requete invalide:Erreur de syntaxe pr?s de 'and' ? la ligne 1 requete compete:SELECT s.libelle,a.Matricule,a.Nom,a.Prenom,d.Type,d.DateDemende,d.user,d.user FROM agents as a,demande as d,service as s where a.codemande=d.Codemande and a.Matricule=s.Matricule and a.Matricule='11' and s.libelle='dl' and d.DateDemende between and
if (isset($_POST['text2'])&& isset($_POST['text3']) && $_POST['text2']!='' && $_POST['text3']!='') 
{ $sql.=" and d.DateDemende between".$_POST['text2']." and".$_POST['text3']."";
}
requete invalide:Erreur de syntaxe pr?s de 'between2010-08-10 and2010-08-13' ? la ligne 1 requete compete:SELECT s.libelle,a.Matricule,a.Nom,a.Prenom,d.Type,d.DateDemende,d.user,d.user FROM agents as a,demande as d,service as s where (a.Matricule=d.Matricule) and (a.Matricule=s.Matricule) and a.Matricule='11' and s.libelle='tcp' and d.DateDemende between2010-08-10 and2010-08-13





j ai ajouter modifier par

if (isset($_POST['text2'])&& isset($_POST['text3']) && $_POST['text2']!='' && $_POST['text3']!='')
{ $sql.=" and d.DateDemende between'".$_POST['text2']."' and'".$_POST['text3']."'";
apret il affiche le vide
0
kabi14 Messages postés 50 Date d'inscription vendredi 8 avril 2011 Statut Membre Dernière intervention 28 juin 2011
11 août 2010 à 18:11
c est adire selement les nom des champ et non pas le contenus
merci
0
kabi14 Messages postés 50 Date d'inscription vendredi 8 avril 2011 Statut Membre Dernière intervention 28 juin 2011
11 août 2010 à 18:35
Mr RaftY
j attend toujours c est ta d autre proposition

merci
0
RaftY Messages postés 56 Date d'inscription mardi 5 mars 2002 Statut Membre Dernière intervention 12 août 2010
11 août 2010 à 18:36
espace entre between est $_POST['text2'] et entre and et $_POST['text3']

$sql.=" and d.DateDemende between '".$_POST['text2']."' and '".$_POST['text3']."'";

______oOOO________OOOo________

RaftY, du code C commode!
0
kabi14 Messages postés 50 Date d'inscription vendredi 8 avril 2011 Statut Membre Dernière intervention 28 juin 2011
11 août 2010 à 19:07
ci je lance une recherche par matricule seulement il m affiche le resulta mais si j ajout par la liste ou la periode il les prennes pas en considiration
et ci je lance une recherche par periode ou contenu de la listeil affiche rien mais pour le matricule ca marche j ai tester mais il prend selemnt le critère du matricule
 <?php 
 $id=mysql_connect('localhost','root','');
             mysql_select_db('ts',$id);

if(isset($_POST['envoyer'])) {
//recuperation du contenus de la liste

$s=$_POST['list']; 

//la requet la varriabele  .$mat c le code message que je recuper dans une autre requet  
             
$t="UPDATE demande SET Etat ='".$s."',user='".$_SESSION['user']."'where Codemande='".$mat ."'and Etat='ouvert'";
        mysql_query($t);
?>      <SCRIPT LANGUAGE="JavaScript">
     document.location.href="gertest.php"
        </SCRIPT>       <?php ;}else { ;
   }  ?>

</form>
     
requete invalide:Erreur de syntaxe pr?s de 'and' ? la ligne 1 requete compete:SELECT s.libelle,a.Matricule,a.Nom,a.Prenom,d.Type,d.DateDemende,d.user,d.user FROM agents as a,demande as d,service as s where a.codemande=d.Codemande and a.Matricule=s.Matricule and a.Matricule='11' and s.libelle='dl' and d.DateDemende between and


<?php  if (isset($_POST['envoyer'])) 
{			
     $id=mysql_connect('localhost','root','');
                     mysql_select_db('ts',$id);
// lancement de la requete
                         $sql = "SELECT s.libelle,a.Matricule,a.Nom,a.Prenom,d.Type,d.DateDemende,d.user,d.user FROM agents as a,demande as d,service as s where (a.Matricule=d.Matricule) and (a.Matricule=s.Matricule)"; 
 						if (isset($_POST['text1'])) 
{ $sql.=" and a.Matricule='".$_POST['text1']."'";}
 //  if (isset($_POST['list2'])) 
//	{ $sql.=" and s.libelle='".$_POST['list2']."'";} 
if (isset($_POST['text2'])&& isset($_POST['text3']) && $_POST['text2']!='' && $_POST['text3']!='') 
{ $sql.=" and d.DateDemende between '".$_POST['text2']."' and'".$_POST['text3']."'";}
   $req = mysql_query($sql);

if(!$req)
{
$message='requete invalide:'.mysql_error()."\n";
$message.='requete compete:'.$sql;
die($message);

}
                           else{
// on recupere le resultat sous forme d'un tableau
echo"service,
Matricule,
Nom,
Prenom,
Type demande,
dateEnvoi de serveur,
Last date,
User,
Etat, \";
while($data = mysql_fetch_row($req)){

echo\"----
\";
for($i=0;$i<count($data);$i++){

echo\"$data[$i], \"
;}

echo\"\";}
echo"
" ;  
}

}?>

merci
0
kabi14 Messages postés 50 Date d'inscription vendredi 8 avril 2011 Statut Membre Dernière intervention 28 juin 2011
11 août 2010 à 19:15
j ai une petite question aussi sur le lien
si tu peut me donner votre idée
http://www.phpcs.com/forum/sujet-REQUET-MODIFICATION_1460016.aspx

merci
0
Rejoignez-nous