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 :

Requete avec jointure


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2018
    Messages : 12
    Par défaut Requete avec jointure
    Bonjour,

    J'aimerai faire ma requête et récupérer les alternatives pour les produits qui ont le code_article récupéré dans le formulaire.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $data['article'] = $code_articlea;
     
    $query ="SELECT article_alter,commentaire
    		 FROM alternatives
    		 WHERE alternatives.article = '" . $code_articlea ."' IN (SELECT article FROM products)";

    Je ne sais pas comment construire ma requête...
    Merci pour votre aide

  2. #2
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    C’est WHERE colonne = "valeur" ou bien WHERE colonne IN (...), mais pas les deux.

    La syntaxe pour une jointure, en général, c’est ça :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT article_alter, commentaire
        FROM alternatives
        INNER JOIN products
            ON alternatives.machin = products.truc
        WHERE alternatives.article = :code_article
    Et le :code_article c’est un marqueur nommé, pour te permettre de préparer ta requête.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    La question est aussi de savoir le format de la donnée que tu veux mettre dans ton filtre WHERE : est-ce une valeur unique ? un tableau ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2018
    Messages : 12
    Par défaut
    Merci pour vos réponses

    C'est la valeur recherchée dans le moteur de recherche soit ceci :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $data['article'] = $code_articlea;
    donc une valeur unique.

    Pour cette valeur :code_article, je ne vois pas trop comment faire.

  5. #5
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Citation Envoyé par Simbalo Voir le message
    Pour cette valeur :code_article, je ne vois pas trop comment faire.
    C’est pourtant clairement indiqué dans la doc que je t’ai donnée. L’as-tu lue ? As-tu essayé quelque chose ? Si tu as un code qui ne marche pas, montre-le ici et on pourra t’aider.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  6. #6
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2018
    Messages : 12
    Par défaut
    J'ai essayé cette requête mais ça ne me retourne un echo "vide"

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT article_alter, commentaire
        	 FROM alternatives
        	 INNER JOIN products
             ON alternatives.code_article = products.code_article
        	 WHERE alternatives.code_article = '".$code_articlea."'"

  7. #7
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Je vais dire un truc bête : mais la valeur qui est renseigné plus haut dans le script, c'est $data['article'] ou $code_articlea ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  8. #8
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2018
    Messages : 12
    Par défaut
    En fait c'est $data['article'], ce que je récupère dans mon array de retour et je le met dans la variable $code_articlea pour faire la requête.

  9. #9
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Aha, le problème de l’affectation à la FORTRAN
    En PHP comme dans les autres langages de la famille C, l’affectation se lit « machin reçoit la valeur truc », autrement dit l’affectation se fait de droite à gauche. Quand tu écris ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $data['article'] = $code_articlea;
    C’est $data['article'] qui reçoit la valeur de $code_articlea. Et a priori $code_articlea n’existe pas à ce moment, donc tu devrais recevoir un message d’avertissement. Pour être sûr de voir tous les messages, ajoute cette ligne au début de ton script :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    error_reporting(E_ALL);

    Et montre-nous comment tu fais ta requête (le code PHP qu’il y a autour).
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  10. #10
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2018
    Messages : 12
    Par défaut
    Voici mon code que j'ai essayé de compacter parce qu'il est très long. Je dois à partir d'un affichage de mes produits, afficher les produits qui sont liés aux produits recherchés.
    Et j'ai le champ code_article dans les deux tables alternatives et products qui me permet de faire le lien.

    Merci pour le temps que vous me consacrez


    Code php : 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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    <?php
     
    $search = (isset($_POST['search']) ? htmlspecialchars(stripslashes($_POST['search'])) : '');
     
     
    if(isset($_POST['submit']))
    	{
    		$search = $_POST['search'];
    		//$limit='';
    	}
     
    	elseif(isset($_GET['search']))
    	{
    		$search = urldecode($_GET['search']);
    	}
     
    	else
    	{
    		$search=null;
    	}
     
    $sql = " SELECT *
         		 FROM products
         		 WHERE MATCH(code_article) AGAINST('%".$search."%')
         		 ORDER BY MATCH(code_article) AGAINST('%".$search."%') DESC";
     
    echo $sql;
     
    if(isset($sql) && !empty($sql))
    {
    	$result = mysql_query($sql) or die (mysql_error());					
    }
     
     
    while ($data= mysql_fetch_array ($result))
    { 
    	$code_article=$data['code_article'];
    	$designation=$data['designation'];
     
     
     
    	$j=0;
    	echo "Table products alternatifs :";
    	echo "<table border=1><tr><th>N°</th>
    		<th>Produit</th><th>Produit alternatif</th></tr>";
     
     
     
     
     
    	$query ="SELECT article_alter,commentaire
    			 FROM alternatives
    			 INNER JOIN products
    			 ON alternatives.code_article = products.code_article
    			 WHERE alternatives.code_article = '".$code_article."'";
     
     
    	$reponse=mysql_query($query); 
     
    	$rowcount = mysql_num_rows($reponse);
     
     
    	if($rowcount==0 )
    	{   
    		echo "vide";
    		echo "ivci";
    	}
    		else
    		{ 
    			echo"non vide";
    					$fields = 2 ;
    					while ($row=mysql_fetch_array($reponse)) 
    					{ 
    						$j++;
    						echo "<tr><td>$j</td>";
    						for($i=0;$i<$fields;$i++)
    						{
    							echo "<td>$row[$i]</td>";
    						}
    						echo "</tr>";
    					}
    			echo "</table>"; 	
    		}
    	echo $rowcount;
     
    }

  11. #11
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Je vois que tu utilises l’API obsolète mysql_*. Tu n’as pas de message d’avertissement ?

    Je vois également deux boucles while imbriquées. À mon avis on peut simplifier ça en faisant la bonne jointure. Montre-nous la structure de tes tables.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  12. #12
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2018
    Messages : 12
    Par défaut
    Désolé pour le retard dans ma réponse
    Je n'ai mis qu'un produit en alternance à tester.

    VOici mes tables et merci encore pour votre aide :

    Code sql : 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
     
    CREATE TABLE IF NOT EXISTS `alternatives` (
      `code_article` varchar(6) NOT NULL,
      `ref_ori` varchar(25) NOT NULL,
      `ref_alter` varchar(25) NOT NULL,
      `article_alter` varchar(6) NOT NULL,
      `commentaire` varchar(50) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     
    -- 
    -- Dumping data for table `alternatives`
    -- 
     
    INSERT INTO `alternatives` (`code_article`, `ref_alter`, `article_alter`, `commentaire`) VALUES
    ('BD129', 'D852', '0128', '\r'),
     
     
    -- --------------------------------------------------------
     
    -- 
    -- Table structure for table `products`
    -- 
     
    CREATE TABLE IF NOT EXISTS `products` (
      `code_article` varchar(10) DEFAULT NULL,
      `designation` varchar(130) DEFAULT NULL,
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`id`),
      KEY `code_article` (`code_article`),
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
     
    -- 
    -- Dumping data for table `products`
    -- 
     
    INSERT INTO `products` (`code_article`, `designation`, `id`) VALUES
    ('BD129', 'mon produits',1)

  13. #13
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Ok. Il y a bien un moyen de faire une requête avec jointure dès le départ, et ne faire qu’une seule boucle while. Voici la requête :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
              FROM products AS prod INNER JOIN alternatives AS alt
                  ON prod.code_article = alt.code_article
              WHERE prod.code_article LIKE :search
              ORDER BY prod.code_article DESC;
    Note le marqueur :search pour faire une requête préparée.

    Comme tu peux le voir, j’ai remplacé le filtre MATCH par un LIKE. En effet, MATCH est prévu pour la recherche FULLTEXT, qui est adaptée pour les textes en langue naturelle (avec des mots et des phrases).

    J’ai plusieurs autres remarques :
    les charsets de tes tables ne sont pas cohérents. Attention au piège de l’encodage nommé utf8 par MySQL, qui n’utilise que 3 octets au lieu de 4. Je te conseille de tout passer en utf8mb4.

    Ta table alternatives n’a pas de clé primaire. Choisis une colonne dont tu sais qu’elle ne contiendra jamais de doublons, ou ajoute une colonne BIGINT NOT NULL AUTO_INCREMENT comme dans l’autre table.

    Les moteurs de tes tables ne sont pas les mêmes. Ça pourrait te poser problème plus tard si tu veux ajouter des contraintes FOREIGN KEY. A priori, tu ne vas pas continuer d’utiliser la recherche FULLTEXT, donc tu n’as plus besoin de MyISAM. Je te conseille de tout passer sous InnoDB.

    Voici un exemple de code PHP pour préparer la requête et afficher les résultats :
    Code PHP : 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
    <?php
    header('Content-Type: text/html; charset=utf-8');
    error_reporting(E_ALL);
     
    $search = /*
    
      ... comme avant
    
    */
     
    // il faut s’assurer que $search n’est pas vide, sinon le filtre sera LIKE "%%"
    // et ça retourne toutes les lignes de la table
    if (!empty($search)) {
        $pdo = new PDO('mysql: host=localhost; dbname=simbalo; charset=utf8mb4',
            'root', '', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ]);
     
        $query = 'SELECT *
                  FROM products AS prod INNER JOIN alternatives AS alt
                      ON prod.code_article = alt.code_article
                  WHERE prod.code_article LIKE :search
                  ORDER BY prod.code_article DESC';
     
        $statement = $pdo->prepare($query);
        $statement->bindValue(':search', '%' . $search . '%');
        $statement->execute();
        $results = $statement->fetchAll(PDO::FETCH_ASSOC);
        print_r($results);
    }
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  14. #14
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2018
    Messages : 12
    Par défaut
    Merci beaucoup pour tout ce que tu m'expliques, ça m'aide vraiment et tout ça avec beaucoup de gentillesse.
    Je vais tester tout ça et réajuster tout ce que j'ai fait.
    Merci et bonne soirée :-)

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/02/2007, 13h46
  2. [ADO] Requete avec jointure
    Par okparanoid dans le forum Bases de données
    Réponses: 6
    Dernier message: 08/11/2006, 17h05
  3. recherche aide pour requete avec jointure
    Par nebil dans le forum Requêtes
    Réponses: 5
    Dernier message: 21/08/2006, 17h03
  4. [MySQL] Erreur dans une requête avec jointures
    Par bobic dans le forum Langage SQL
    Réponses: 17
    Dernier message: 03/08/2006, 13h04
  5. requete avec jointure & group by
    Par de LANFRANCHI dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/07/2004, 14h31

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