Requet de recherche

Signaler
Messages postés
50
Date d'inscription
vendredi 8 avril 2011
Statut
Membre
Dernière intervention
28 juin 2011
-
Messages postés
50
Date d'inscription
vendredi 8 avril 2011
Statut
Membre
Dernière intervention
28 juin 2011
-
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

Messages postés
56
Date d'inscription
mardi 5 mars 2002
Statut
Membre
Dernière intervention
12 août 2010

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!
Messages postés
50
Date d'inscription
vendredi 8 avril 2011
Statut
Membre
Dernière intervention
28 juin 2011

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..."
Messages postés
56
Date d'inscription
mardi 5 mars 2002
Statut
Membre
Dernière intervention
12 août 2010

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!
Messages postés
50
Date d'inscription
vendredi 8 avril 2011
Statut
Membre
Dernière intervention
28 juin 2011

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



Messages postés
56
Date d'inscription
mardi 5 mars 2002
Statut
Membre
Dernière intervention
12 août 2010

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!
Messages postés
50
Date d'inscription
vendredi 8 avril 2011
Statut
Membre
Dernière intervention
28 juin 2011

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
Messages postés
50
Date d'inscription
vendredi 8 avril 2011
Statut
Membre
Dernière intervention
28 juin 2011

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
Messages postés
50
Date d'inscription
vendredi 8 avril 2011
Statut
Membre
Dernière intervention
28 juin 2011

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
Messages postés
56
Date d'inscription
mardi 5 mars 2002
Statut
Membre
Dernière intervention
12 août 2010

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!
Messages postés
50
Date d'inscription
vendredi 8 avril 2011
Statut
Membre
Dernière intervention
28 juin 2011

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
Messages postés
50
Date d'inscription
vendredi 8 avril 2011
Statut
Membre
Dernière intervention
28 juin 2011

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
Messages postés
56
Date d'inscription
mardi 5 mars 2002
Statut
Membre
Dernière intervention
12 août 2010

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!
Messages postés
50
Date d'inscription
vendredi 8 avril 2011
Statut
Membre
Dernière intervention
28 juin 2011

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"
Messages postés
56
Date d'inscription
mardi 5 mars 2002
Statut
Membre
Dernière intervention
12 août 2010

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!
Messages postés
50
Date d'inscription
vendredi 8 avril 2011
Statut
Membre
Dernière intervention
28 juin 2011

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
Messages postés
50
Date d'inscription
vendredi 8 avril 2011
Statut
Membre
Dernière intervention
28 juin 2011

c est adire selement les nom des champ et non pas le contenus
merci
Messages postés
50
Date d'inscription
vendredi 8 avril 2011
Statut
Membre
Dernière intervention
28 juin 2011

Mr RaftY
j attend toujours c est ta d autre proposition

merci
Messages postés
56
Date d'inscription
mardi 5 mars 2002
Statut
Membre
Dernière intervention
12 août 2010

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!
Messages postés
50
Date d'inscription
vendredi 8 avril 2011
Statut
Membre
Dernière intervention
28 juin 2011

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
Messages postés
50
Date d'inscription
vendredi 8 avril 2011
Statut
Membre
Dernière intervention
28 juin 2011

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