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 :

Select distinct substring


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    septembre 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2011
    Messages : 42
    Points : 26
    Points
    26
    Par défaut Select distinct substring
    Bonjour,
    J'ai trois pages, l'une où je fais ma recherche Page_recherche.php, l'une où j'ai mon script pour l'autocompletion Page_action.php et mon dernier script Page_affichage_produit.php où j'affiche les resultats de ma recherche.
    Dans l'affichage de l'autocompletion, j'affiche les 4 premiers caractères d'un champ (ex. 0007 au lieu de 0007h) je peux avoir d'autres enregistrements en 0007 avec 0007u, 0007i, 0007p..., le but est d'afficher simplement un 0007 dans l'autocompletion et d'afficher les 0007u, 0007i, 0007p... dans la page produits où l'on aura une décomposition des articles liès au produit 0007.

    J'arrive bien à afficher seulement un 0007 dans mon autocompletion avec un distinct et un substring(champ1,1,5), par contre dans ma page affichage des produits, je ne récupère pas le contenu de mon champ1, rien ne s'affiche. Comment puis récupérer le contenu de champ1 du coup.

    Merci beaucoup pour votre aide

    Voici mes scripts :

    Page_recherche.php
    Code html : 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
     
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <!-- jQuery library -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <!-- Popper JS -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
    </head>
    <body>
     
    <p>recherche</p>
     
    <form autocomplete="off" action="page_affichage_produit.php" method="post">
    <input type="text" name="search" id="search"  class="input1" placeholder="recherche"  name="keywords" >
    <button type="submit" name="submit" value="Search">recherche</button>
    <p class="list-group" id="show-list">
    <!-- Reponse show-list  -->
    </p> 
    </form> 
     
     
    	<script type="text/javascript">
            $(document).ready(function()
            {
                    $("#search").keyup(function()
                    {
                            var searchText = $(this).val();
                            if(searchText != '')
                            {
                                    $.ajax(
                                    {
                                            url: 'Page_action.php',
                                            method: 'post',
                                            data:{query:searchText},
                                            success:function(response)
                                            {
                                                    $("#show-list").html(response);
                                            }
                                    });
                            }
                            else 
                            {
                                    $("#show-list").html('');
                            }         
                    });
                      
                    $(document).on('click','a',function()
                    {
                                    $("#search").val($(this).text());
                                    $("#show-list").html('');
                    });
            });
    </script>


    Page_action.php
    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
     
    <?php
    if(isset($_POST['query'])){
    	$inpText = $_POST['query'];
     
    	$query = "SELECT 
    				DISTINCT
    				champ2, 
    				champ3, 
    				champ4, 
    				champ5,
    				substring(champ1,1,5) AS champ1_2 
    		      FROM 
    			  	produits_vue
    			  WHERE
    			  	champ1 LIKE '%$inpText%' 
    				OR
    				champ2 LIKE '%$inpText%' 
    				OR
    				champ3 LIKE '%$inpText%'
    				OR
    				champ4 LIKE '%$inpText%'
    				OR  
    				champ5 LIKE '%$inpText%'
    			  ORDER BY
    			  	champ1 limit 15
    			 ";
     
    	$result = $conn->query($query);
    	if($result->num_rows>0){
    		while($row=$result->fetch_assoc()){
     
    			echo"<a href='#' class='list-group-item list-group-item-action border-1'>".$row['champ1_2']."</a>";
    			echo"<a href='#' class='list-group-item list-group-item-action border-1'>".$row['champ2']."</a>";
    			echo"<a href='#' class='list-group-item list-group-item-action border-1'>".$row['champ3']."</a>";
    			echo"<a href='#' class='list-group-item list-group-item-action border-1'>".$row['champ4']."</a>";
    			echo"<a href='#' class='list-group-item list-group-item-action border-1'>".$row['champ5']."</a>";
    		}
    	}
    	else {
    	echo "No Record";
    	}
    }
    ?>


    Et page_affichage_produit.php

    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
     
    <?php
    if(isset($_POST['submit'])){
    	$data = $_POST['search'];
     
    	$sql = "SELECT *
    		      FROM table
    			  WHERE 
    			  	champ1 ='$data' 
    				OR
    				champ2 = '$data'
    				OR
    				champ3 = '$data'
    				OR
    				champ4 ='$data'
    				OR 
    				champ5 ='$data'
    			  ORDER BY champ1
    			 ";
     
    	$result=$conn->query($sql);
    	$row=$result->fetch_assoc();
     
    	echo"<a href='#' class='list-group-item list-group-item-action border-1'>".$row['champ1']."</a>";
    	echo"<a href='#' class='list-group-item list-group-item-action border-1'>".$row['champ2']."</a>";
    	echo"<a href='#' class='list-group-item list-group-item-action border-1'>".$row['champ3']."</a>";
    	echo"<a href='#' class='list-group-item list-group-item-action border-1'>".$row['champ4']."</a>";
    	echo"<a href='#' class='list-group-item list-group-item-action border-1'>".$row['champ5']."</a>";
    }
    ?>

    Merci et bon week-end

  2. #2
    Membre chevronné Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    mars 2008
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : mars 2008
    Messages : 1 460
    Points : 1 950
    Points
    1 950
    Par défaut
    Bonjour,

    D'un part, il semble que soit tu utilises des noms très vagues, soit tu as changé tout ton code avant de le copier/coller.... c'est à éviter car on fini par créer ou corriger des fautes sans s'en rendre compte !
    D'autre part, je pense qu'il y a un problème de compréhension quant au fonctionnement d'une auto-completion et des formulaires.

    Je ne vais donc pas rentrer dans les détails mais à première vue, je ne comprends même pas comment tu arrives à tester complètement ton code.
    En effet, ton formulaire ne redirige pas vers la page de résultat mais vers lui-même :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <form autocomplete="off" action="Page_recherche.php" method="post">

    A partir de là, impossible de répondre à ton problème.

    Essaye de vérifier que ton formulaire se met bien à jour quand tu click sur un de tes liens, et ensuite vérifie les valeurs envoyées par $_POST.

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    septembre 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2011
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Bonjour darkstar123456 et tout le monde,

    Merci pour ton aide, j'ai fait des changements de noms dans mes scripts pour poster, ça devrait être bon, j'ai modifié.
    En fait, je pense que le problème vient du fait que l'on fait une recherche exacte sur la page page_affichage_produit.php sur le champ1 et une recherche tronquée à partir de l'autocompletion avec le substring(champ1,1,5) AS champ1_2. Je ne récupère qu'une partie du champ1 dans ma page page_affichage_produit.php, la recherche n'est pas complète, il ne connait pas mon champ1 en totalité puisque je l'ai tronqué donc il ne peut pas m'afficher la totalité des sous-articles liés à ce champ1 où je devrais faire ma recherche complète. En fait, j'ai un seul champ pour faire à la fois un affichage des 5 premiers caractères et de la totalité des articles liés toujours à partir de ce champ.
    Je pense qu'il faut que j'arrive à faire une boucle pour afficher tous les articles liés (ex. 0007u, 0007i, 0007p) à partir de ce que j'envoie dans le champ recherche $data = $_POST['search']; (ex. 0007) et que je puisse afficher les enregistrements alors que je ne lui ai fourni que 0007 comme élément de recherche.

    Je ne sais pas si j'arrive bien à me faire comprendre.
    En attendant merci pour votre aide.

  4. #4
    Membre chevronné Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    mars 2008
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : mars 2008
    Messages : 1 460
    Points : 1 950
    Points
    1 950
    Par défaut
    Bonjour,

    C'est toujours compliqué de répondre avec précision à quelqu'un qui a remplacé toutes les valeurs par des noms vagues comme "champ1, 2, 3 etc" et "table" xD
    En réalité, à la base, j'avais pondu un wall of text expliquant pourquoi tout ça n'était pas bon... je vais donc m'en inspirer mais en plus court ^^

    Lors d'une recherche, pourquoi chaque champ est clickable ?
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while($row=$result->fetch_assoc()){
     
    			echo"<a href='#' class='list-group-item list-group-item-action border-1'>".$row['champ1_2']."</a>";
    			echo"<a href='#' class='list-group-item list-group-item-action border-1'>".$row['champ2']."</a>";
    			echo"<a href='#' class='list-group-item list-group-item-action border-1'>".$row['champ3']."</a>";
    			echo"<a href='#' class='list-group-item list-group-item-action border-1'>".$row['champ4']."</a>";
    			echo"<a href='#' class='list-group-item list-group-item-action border-1'>".$row['champ5']."</a>";
    		}
    En réalité, ils se rapportent tous à la même ligne et ne devrait retourner qu'un seul résultat.
    On pourrait envisager d'afficher tous les champs mais dans un seul résultat, de cette façon :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    while ($row = $result->fetch_assoc()) {
            $fields_to_display = [
                $row['champ2'],
                $row['champ3'],
                $row['champ4'],
                $row['champ5'],
            ];
            echo '<a href="#" data-id="' . $row['champ_defini_en_tant_que_pk'] . '" class="list-group-item list-group-item-action border-1">';
            echo implode(', ', $fields_to_display); // Affichage des mots clés séparés par une virgule et un espace.
            echo '</a>';
        }

    Comme tu peux le voir, j'ai également ajouté l'attribut data-id qui nous permettra de récupérer l'ID unique de chaque ligne afin de l'utiliser dans l'affichage de nos résultats.

    On va alors modifier le code JS pour utiliser l'attribut data-id grâce à la méthode data() de jQuery :

    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $(document).on('click', 'a', function ()
    {
        $("#search").val($(this).data('id'));
        $("#show-list").html('');
    });

    La requête SQL devient donc :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $sql = "SELECT *
    		      FROM table
    			  WHERE 
    			  	champ_defini_en_tant_que_pk ='$data' 
    			  ORDER BY champ1
    			 ";

  5. #5
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    16 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Arts - Culture

    Informations forums :
    Inscription : août 2008
    Messages : 16 501
    Points : 33 977
    Points
    33 977
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    WHERE 
    			  	champ1 LIKE '$data%' 
    				OR
    			  	champ2 LIKE '$data%' 
    ...
    Quant au substring SQL, je n'en vois pas l'intérêt.
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Pose ta question, tu seras idiot une seconde. Ne la pose pas, tu seras idiot toute ta vie."
    Albert Einstein (1879-1955).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  6. #6
    Membre chevronné Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    mars 2008
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : mars 2008
    Messages : 1 460
    Points : 1 950
    Points
    1 950
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Quant au substring SQL, je n'en vois pas l'intérêt.
    Bonjour,

    Ouais, je me suis posé la question aussi... J'ai pensé que ça pouvait être utile côté affichage des résultats de recherche même si je l'aurais fait côté client perso (côté navigateur, et non côté serveur donc).

Discussions similaires

  1. Select avec distinct(substring(champ,0,4))
    Par gilles974 dans le forum Requêtes
    Réponses: 5
    Dernier message: 10/12/2008, 12h40
  2. Select distinct
    Par mic79 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/04/2005, 17h30
  3. select distinct substring
    Par nmerydem dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/06/2004, 17h58
  4. Select distinct et order by
    Par arsgunner dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/06/2004, 12h17
  5. equivalent SELECT DISTINCT pour MyBase?
    Par chrisou31 dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/03/2004, 20h33

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