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

Langage PHP Discussion :

découper un array pour mettre dans une requet


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    458
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 458
    Par défaut découper un array pour mettre dans une requet
    Bonjour,

    me voilà un peu bloqué depuis ce matin et je me dis qu'un avis extérieur pourrais m'aider.

    j'ai un array que je voudrais découpé mais après récupérer les valeur pour faire mes requetes

    voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	$donnee=explode("|",$status_client);
    	for($i=0;$i<sizeof($donnee);$i++){
    		if($donnee[0] && $donnee[0] !='' ){
    			$rqt_status_client =' AND status_client ='.$donnee[0];
    			if($donnee[$i] !='' && $donnee[$i] != $donnee[0]){
    				$rqt_status_client .=' OR status_client ='.$donnee[$i].' ';
    			}
    		}
     
    	}
    en gros dans ma variable $status_client='rh|secrétaire|'
    récupéré d'une requète avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $donnee=explode("|",$status_client);
    j'obtien mon array :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array ( [0] => rh [1] => secrétaire [2] => )
    donc ce que je voudrais faire c'est faire ma requete
    $donnee[0] = $rqt_status_client =' AND status_client ='.$donnee[0];
    sinon $donnee[1,2,3...] = $rqt_status_client =' OR status_client ='.$donnee[$i];

    mais je bloque au niveau de mes requete sa me sort que 'AND status_client =rh'

    merci de votre aide

  2. #2
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Plutôt que de faire des OR à répétition, tu peux utiliser la clause IN:
    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
    <?php
     
    $query = "SELECT id,name FROM employees";
     
    $search = array(
        'function' => 'stagiaire|secretaire', 
        'age' => 25,
    );
     
    if (!empty($search)) {
     
        $pieces = array();
     
        foreach ($search as $field => $value) {
     
            // cas particulier de la recherche discrête
            if (strpos($value, '|') !== false)
                $pieces[] = "`$key` IN (" . str_replace('|',',',$value) . ")";
            else
                $pieces[] = "`$key`=\"$value\"";
        }
     
        $query .= "WHERE " . implode(' AND ', $pieces);
    }
     
    var_dump($query);

  3. #3
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    Attention, le IN (..., ..., ...) est séquentiel et donc inadapté pour des liste longues, parfois il est préférable de garder une ribambelle de OR (bien que cela soit moche).
    Sinon, il faut revoir un peu le design de la base pour essayer de conserver une approche ensembliste autrement plus performante sur n'importe quel moteur de base de données que du séquentiel.

    Vécu : un WHERE IN de 400 éléments... (Design de la base pourri)

  4. #4
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    458
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 458
    Par défaut
    Merci pour ta réponse,

    mais dans ma base j'ai le champs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    status_client='admin|compta|'
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    status_client='admin|compta|secrétaire|'
    quand je teste avec la clause IN sa marche pas


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM pdf WHERE id_client='1' AND status_client IN (compta,rh)

    j'ai ce message d'erreur :
    #1054 - Champ 'compta' inconnu dans where clause
    alors qu'il y est

    il faudrait une sorte de LIKE IN

  5. #5
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    458
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 458
    Par défaut
    RE-

    Merci pour vos réponse mais en cherchant sur LIKE IN j'ai trouvé REGEXP qui me solutionne mon problème.

    donc ma requete fait
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM pdf
    WHERE id_client = '1'
    AND status_pdf REGEXP 'rh|compta'

    et sa marche merci et bonne journéée

  6. #6
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    ça part mal, tes bases ne sont pas 1NF !

    Pas de séquence dans les attributs !

  7. #7
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    458
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 458
    Par défaut
    oui mais je vais pas fair un champs pour chaque status?

    de plus je viens de réalisé que REGEXP ne marche pas pour une base hyperfile

  8. #8
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    oui mais je vais pas fair un champs pour chaque status?
    sauf si tu veux faire pire.

    c'est une relation 1-N entre pdf et status qu'il aurait fallu.

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

Discussions similaires

  1. Extraire des données pour mettre dans une BD
    Par luciedoudou dans le forum Excel
    Réponses: 7
    Dernier message: 21/02/2008, 11h19
  2. Bonne syntaxe pour condition dans une requete
    Par cedlannoy dans le forum Requêtes
    Réponses: 3
    Dernier message: 16/03/2007, 16h24
  3. Réponses: 8
    Dernier message: 08/03/2007, 17h54
  4. Réponses: 8
    Dernier message: 27/01/2007, 14h44
  5. [MySQL] reprendre les infos d'une bd pour mettre dans une info bulle
    Par luciedoudou dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 19/01/2007, 14h55

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