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
    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é
    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
    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é
    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
    Invité
    Invité(e)
    Bonjour,

    1-
    Citation Envoyé par Bboop Voir le message
    ...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)...
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    WHERE 
    			  	champ1 LIKE '$data%' 
    				OR
    			  	champ2 LIKE '$data%' 
    ...

    N.B. Le mieux étant d'utiliser une requête préparée.

    2- Quant au substring SQL, je n'en vois pas l'intérêt.

  6. #6
    Membre chevronné
    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).

  7. #7
    Nouveau membre du Club
    Bonjour et merci pour vos réponses.
    Je vais tester ce que vous me proposer. Pour l'histoire du substring, effectivement j'aurai souhaité faire l'affichage côté navigateur mais je n'ai pas su comment organisé le code pour que ça ne me sorte qu'un enregistrement et pas tous ceux liés au 0007 du coup. Ca m'aurait facilité les choses de ne pas le faire dans ma requête.
    Merci

###raw>template_hook.ano_emploi###