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 {
}
}
}
}
?>
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..."
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
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' "
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.
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
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"]."%'
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
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
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________
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
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
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
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"
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
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"
" ;
}
}?>