IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Comment faire une recherche sur plusieurs critères ? [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 388
    Points : 172
    Points
    172
    Par défaut Comment faire une recherche sur plusieurs critères ?
    Bonjour,

    Je souhaiterais rechercher une structure dans ma base de données à partir de plusieurs critères. Ces critères sont des listes.
    J'ai commencé à faire la sélection des critères, mais je n'arrive pas à afficher les résultats, j'ai une erreur sur le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $row = $resultat->fetch(PDO::FETCH_NUM);
    .
    Est-ce que ma requête est juste ? et comment afficher les résultats ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    if (isset($_POST['valider']))
    	{ 	
        		/* Ici je récupère la valeur de la liste soit elle est remplie, soit elle est nulle */
    				$nationalite=(isset($_POST['nationalite']) && !empty($_POST['nationalite']))?($_POST['nationalite']):'NULL';  
    				$statut_conflit=(isset($_POST['statut_conflit']) && !empty($_POST['statut_conflit']))? "'".$_POST['statut_conflit']."'":'NULL'; 
    				$etat=(isset($_POST['etat']) && !empty($_POST['etat']))? "'".$_POST['etat']."'":'NULL';								
    				//$sepulture=$_POST['id_sepulture'];													
    				$sexe=(isset($_POST['sexe']) && !empty($_POST['sexe']))? "'".$_POST['sexe']."'":'NULL';								
    				$age=(isset($_POST['age']) && !empty($_POST['age']))? "'".$_POST['age']."'":'NULL';
    				$particularite=(isset($_POST['particularite']) && !empty($_POST['particularite']))? "'".$_POST['particularite']."'":'NULL';
    				$confession=(isset($_POST['confession']) && !empty($_POST['confession']))? "'".$_POST['confession']."'":'NULL';
    				$institution=(isset($_POST['institution']) && !empty($_POST['institution']))? "'".$_POST['institution']."'":'NULL';
    				$administrative=(isset($_POST['administrative']) && !empty($_POST['administrative']))? "'".$_POST['administrative']."'":'NULL';
    				$aide_sociale=(isset($_POST['aide_sociale']) && !empty($_POST['aide_sociale']))? "'".$_POST['aide_sociale']."'":'NULL';
     
    /* Requête de sélection des critères */
         $reponse =("SELECT * FROM categorisation WHERE 
    	nationalite LIKE '%$nationalite%' AND
    	statut_conflit LIKE '$statut_conflit' AND
    	etat LIKE '$etat' AND
    	sepulture LIKE '$sepulture' AND
    	sexe LIKE '$sexe' AND
    	age LIKE '$age' AND
    	particularite LIKE '$particularite' AND
    	confession LIKE '$confession' AND
    	institution LIKE '$institution' AND
    	administrative LIKE '$administrative' AND
    	aide_sociale LIKE '$aide_sociale';
    	");
     
    	$resultat=$bdd->query($reponse) or print_r($bdd->errorInfo());	
     
    /* Comment afficher le résultat ??????*/
     
    $row = $resultat->fetch(PDO::FETCH_NUM);
    if($row[0]!=0) //J'ai trouvé les champs
        {	echo " Afficher les champs!!";
    	}
    else
    	{		echo" Rien trouvé";
    		}
    Merci.

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Est-ce que ma requête est juste ?
    Non, parce que
    • ta requête suppose que tous tes champs sont renseignés ;
    • la construction de tes variables est aberrante,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $statut_conflit=(isset($_POST['statut_conflit']) && !empty($_POST['statut_conflit']))? "'".$_POST['statut_conflit']."'":'NULL';
    tu rajoutes des apostrophes en début et fin de la valeur des variables, or je doute qu'il y ai des apostrophes en base et de plus, ça empêche le LIKE de fonctionner correctement.

    Au passage, empty fait déjà la vérification de isset, donc ce dernier est inutile et superfétatoire.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 388
    Points : 172
    Points
    172
    Par défaut
    Merci pour votre réponse
    J'ai enlevé les apostrophes et j'ai le résultat "Rien trouvé".

    ta requête suppose que tous tes champs sont renseignés ;
    C'est vrai, quand je sélectionne un champ et que je valide, il ne le trouve pas dans ma BDD sachant qu'il y est.
    Alors, si je remplace le AND par le OR, j'ai un résultat mais qui est faux, puisqu'il donne le résultat pourvu qu'une seule condition soit remplie.

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    C'est parce que ta logique est illogique.

    Toi, tu veux absolument que tous les critères de recherche soient présents dans la requête, alors qu'au contraire, il ne faut dans la requête que les critères ayant été renseignés.
    Ce n'est donc pas une question de OR ou de AND, mais une question de présence ou non des critères dans la requête en fonction des champs reçus.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    tu peux construire ta requête dynamiquement en fonction des critères qui ont été selectionnés:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $criteres='';
    if( !empty($_POST['nationalite']) )
       $criteres.=" AND nationalite LIKE '%{$_POST['nationalite']}'";
    if( !empty($_POST['statut_conflit']) )
       $criteres.=" AND statut_conflit LIKE '{$_POST['statut_conflit']}'";
    if( !empty($_POST['etat']) )
       $criteres.=" AND etat LIKE '".$_POST['etat']."'";
    //etc
    $sql='SELECT * FROM categorisation 
    	WHERE true'
    	. $criteres;

  6. #6
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Une autre solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $criteres=array();
    if( !empty($_POST['nationalite']) )
       $criteres[]="nationalite LIKE '%{$_POST['nationalite']}'";
    if( !empty($_POST['statut_conflit']) )
       $criteres[]="statut_conflit LIKE '{$_POST['statut_conflit']}'";
    if( !empty($_POST['etat']) )
       $criteres[]="etat LIKE '".$_POST['etat']."'";
    //etc
    $sql='SELECT * FROM categorisation 
    	WHERE '
    	. implode(' AND ', $criteres);
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  7. #7
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 388
    Points : 172
    Points
    172
    Par défaut
    Merci beaucoup, je vais essayer vos solutions

  8. #8
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 388
    Points : 172
    Points
    172
    Par défaut
    Merci, ça marche
    Je voudrais juste poser une dernière question, comment afficher le résultat de la recherche ?
    J'ai déjà affiché les données de tables de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $reponse= $bdd ->query($sql) or print_r($bdd->errorInfo());
    while ($donnees = $reponse->fetch(PDO::FETCH_ASSOC))
    {
    	echo "Les structures sont : ";
    	echo $donnees['id_struct'].'<br />';
     
    }
    Mais là, j'ai deux erreurs :
    Warning: PDO::query() expects parameter 1 to be string, array given in C:\Program Files (x86)\Zend\Apache2\htdocs\RLF V14\recherche.php on line 539
    Array ( [0] => 00000 [1] => [2] => )
    Fatal error: Call to a member function fetch() on boolean in C:\Program Files (x86)\Zend\Apache2\htdocs\RLF V14\recherche.php on line 540
    EDIT : C'est bon ça marche, j'avais fait une erreur dans le nom du champ.
    Merci à tous pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [1.x] Comment faire une recherche sur plusieurs tables
    Par farhaenis dans le forum Symfony
    Réponses: 6
    Dernier message: 01/07/2011, 17h47
  2. Réponses: 1
    Dernier message: 26/05/2010, 17h57
  3. Réponses: 3
    Dernier message: 11/10/2008, 13h32
  4. Comment faire une recherche sur un contenu s'il existe ou non ?
    Par 21247692 dans le forum Bases de données
    Réponses: 8
    Dernier message: 05/04/2008, 10h54
  5. VBA-E Comment réaliser une recherche avec plusieurs critères ?
    Par Larsen21 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 14/12/2006, 13h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo