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 :

une requete en fonction d'un autre [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de stomerfull
    Inscrit en
    Septembre 2005
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 307
    Par défaut une requete en fonction d'un autre
    Bonjour,

    je suis un peu bloqué sur cette requete :

    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
    PHP:
    $req="select id from table where nom like '%".$nom."%' ";
    if($res=mysql_query($req))
    {
    while($row=mysql_fetch_array($res))
    {
    $idS=$row['id'].",";
    $req="select nom from table1 where id_matri IN ($idS) ";
    $res=mysql_query($req);
    $nb=mysql_num_rows($res);
    $row=mysql_fetch_array($res);
    return $row["id"];
     
    }
    }

    La seconde requete me retourne le code suivant :
    PHP:
    select nom from table1 where id_matri IN(66,)


    alors que $idS contient des valeurs comme si après : 66,10,133,1236,12,

    Ce que je veux faire c'est de récupérer les noms dans la table1 dont les id sont dans $idS

    Merci pour votre suggestion

  2. #2
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonjour,

    Tu executes la requête mysql a chaque passage dans la boucle, au fur et a mesure que la chaine contenant les identifiants est valorisée, il faut valrosier la chaine, puis executer la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $req="select id from table where nom like '%".$nom."%' ";
    if($res=mysql_query($req)){
        $i = 1;
        $nb_results = mysql_num_rows($res);
        while($row=mysql_fetch_array($res)){
            $idS = ($i == $nb_results) ? $row['id'] : $row['id'].','; 
            $i++;
        }
        $req='select nom from table1 where id_matri IN ("'.$idS.'")';
        $res=mysql_query($req);
        $row=mysql_fetch_array($res);
        return $row["id"];
    }
    Aussi, avec ton code il y aurait toujours eu une virgule en trop a la fin de la chaine.

    Pour finir, une seule requête suffit pour faire ce traitement, deux lignes de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = mysql_query('SELECT nom FROM table1 WHERE id_matri IN (SELECT id from table where nom like "%'.$nom.'%")');
    return mysql_result($sql,0,'nom');

  3. #3
    Membre éclairé Avatar de stomerfull
    Inscrit en
    Septembre 2005
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 307
    Par défaut
    Merci pour ton réponse mais j'ai fais comme ça
    en essayant de changer la place de l'accolade qui ferme le boucle while

    mais il n'execute ma requete que une seule fois AVEC la premiere valeur ou la derniere valeur de $idS

    PS : je complete le code avec ceux que je reellement maintenant

    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
    $req="select id from table where nom like '%".$nom."%' ";
    if($res=mysql_query($req))
    	{
    	 	$i = 1;
        	$nb_results = mysql_num_rows($res);
      		while($row=mysql_fetch_array($res))
      		{
    			  $idS = ($i == $nb_results) ? $row['id'] : $row['id']; 	  
     		  	  $i++;
                   }
     
     
     
      $req="select nom from table1 where  id_matri  IN ($idS) ";		
      $res=mysql_query($req);
      $nb=mysql_num_rows($res);
        if ($nb==0) {  return -1;}
      			else
      			{
        			$row=mysql_fetch_array($res);
        			return $row["id"];
      			}
     
     
          }
    merçi

  4. #4
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    Plus simple avec requete imbriquée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	$req = "select nom from table1 where  id_matri  IN (select id from table where nom like '%".$nom."%') ";		
    	$res = mysql_query($req);
     
    	if (!mysql_num_rows($res)) {  
    		return -1;
    	} else {
    		$row=mysql_fetch_array($res);
    		return $row["id"];
    	}
    [edit]
    oups pas vu que ThomasR l'avais déjà donné
    [/edit]

    Ps : dans ton code précédent tu ne reprennais pas la virgule pour concaténer les clef mais ThomasR avais oublié le '.=' pour concatener la variable $idS.

    Petite astuce sinon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    boucle() {
        $var .= $res . ',';
    }
    $var = rtrim($var, ',');
    Qui évite de compter le nombre de "rows"

  5. #5
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    mais il n'execute ma requete que une seule fois AVEC la premiere valeur ou la derniere valeur de $idS
    Quelle requête ? Rien dans ton code n'a un tel comportement.
    edit : J'avais oublié le .= comme le précise Para-Bol

    As-tu essayé le second code que je t'ai donné ci-dessus et qui simplifie grandement ton traitement ?

    Aussi, je vois que tu veux récupérer plusieurs enregistrements, ta seconde requête possède donc un jeu de résultat supérieur à un élément. Il ne faut pas retourner $row['id'], il faut retourner un tableau qui contient les noms

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function listerLesNoms(){
        $noms = Array();
        $sql = mysql_query('SELECT nom FROM table1 WHERE id_matri IN (SELECT id from table where nom like "%'.$nom.'%")');
        while($row = mysql_fetch_array($sql)){
            $noms[] = $row['nom'];
        }
        return $noms;
    }

  6. #6
    Membre éclairé Avatar de stomerfull
    Inscrit en
    Septembre 2005
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 307
    Par défaut
    Bonjour

    Oui merci , ça a bien marché en concaténant la variable contenant l'id (le point oublié).

    Par contre la requete imbriqué , ce n'est pas un peu lourd? une question de novice ...

    merci

  7. #7
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    ce n'est pas un peu lourd? une question de novice
    Non au contraire, cela évite de faire deux requêtes vers la base de données et par la même occasion de réduire le poids de transit des flux de données entre PHP et mysql du fait qu'un seul jeu de résultat est généré.

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

Discussions similaires

  1. [AC-2007] Sous état basé sur une requete en fonction d'un autre état
    Par Bulbulle dans le forum IHM
    Réponses: 2
    Dernier message: 30/11/2012, 22h28
  2. Réponses: 4
    Dernier message: 20/08/2009, 03h22
  3. [MySQL] afficher une requete en fonction de résultats d'autres requetes
    Par mayers dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 27/07/2007, 10h42
  4. Réponses: 2
    Dernier message: 28/05/2007, 09h28
  5. Réponses: 15
    Dernier message: 02/05/2007, 18h04

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