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 :

Filtrer des informations via un formulaire [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club Avatar de Sianobel
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 54
    Points : 58
    Points
    58
    Par défaut Filtrer des informations via un formulaire
    Bonjour,

    Je viens de chercher pendant plus d'une journée sans trouver ce que je cherchais. J'ai peut être mal cherché, je ne dit pas le contraire

    Voilà mon problème. Je suis en train de créer un script de PTC contenant une possibilité de s'échanger des clics via des points. Sur la page ou tous les liens (avec ou sans bannières) se trouve un formulaire dont la fonction sera de trier les liens qui se trouvent sous ce dernier.

    Chaque lien à un titre, une catégorie et une bannière sur cette page. Le formulaire propose via des boutons radio de choisir parmis les options suivantes "Tout, Avec bannière, Sans bannière" tandis que les catégories sont dans une une liste à choix multiple.

    J'arrive bien à trier les liens avec bannières et sans bannière tout mais lorsque je choisis plus d'une catégorie, tout rate. Est ce qu'il est possible d'avoir plus d'une donnée dans une condition WHERE? C'est peut être ça qui fait tout rater.

    Voici le code de la page en question

    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
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
    <fieldset>
    	<legend><span>Filtre</span></legend>
    	<form method="post" action="">
    	<input type="radio" name="filtre" value="tout" CHECKED>Tout
    	<input type="radio" name="filtre" value="banniere" >Avec bannière
    	<input type="radio" name="filtre" value="texte" >Sans bannière
     
    	<select name="categorie[]" size="1" multiple="multiple">
    		<?php
    		$selection=mysql_query("SELECT * FROM categorie ORDER BY nom");
     
    		while($message = mysql_fetch_assoc($selection))
    		{
    		?>
    		<OPTION VALUE="<?php print($message['id']);?>"><?php print($message['nom']); ?>
    		<?php
    		}
    		?>
    	</select> 
     
    	<input type="submit" class="formsubmit" title="On ne clique qu'une seule fois ;)" value="Mettre un filtre" />
    	</form>
    </fieldset>
     
    <?php
     
    if(isset($_POST['filtre'])) {
    	if ($_POST['filtre']=="banniere") {
    		$filtre_ban = "%.%";
    	}
    	elseif ($_POST['filtre']=="texte") {
    		$filtre_ban = "";
    	}
    	elseif ($_POST['filtre']=="tout") {
    		$filtre_ban = "%";
    	}
     
    }
     
    if(isset($_POST['categorie'])) {
    	$cat = "";
    	foreach ($_POST['categorie'] as $categorie) {
    	$cat .= "$categorie,"; }
    	$cat = implode(',',$_POST['categorie']);
    }
    else {
    	$cat = "%";
    }
     
    echo "$_POST[filtre] $cat";
     
    //Une connexion SQL doit être ouverte avant cette ligne...
    $retour_total = mysql_query('SELECT COUNT(*) AS total FROM site_membre WHERE id_user="'.$_SESSION['id'].'" AND valide="1" AND point>"0" AND banniere LIKE "'.$filtre_ban.'" AND categorie LIKE "'.$cat.'"'); //Nous récupérons le contenu de la requête dans $retour_total
    $donnees_total = mysql_fetch_assoc($retour_total); //On range retour sous la forme d'un tableau.
    $total=$donnees_total['total']; //On récupère le total pour le placer dans la variable $total.
     
    //Nous allons maintenant compter le nombre de pages.
    $nombreDePages=ceil($total/$messagesParPage);
     
    if(isset($_GET['page'])) // Si la variable $_GET['page'] existe...
    {
         $pageActuelle=intval($_GET['page']);
     
         if($pageActuelle>$nombreDePages) // Si la valeur de $pageActuelle (le numéro de la page) est plus grande que $nombreDePages...
         {
              $pageActuelle=$nombreDePages;
         }
    }
    else // Sinon
    {
         $pageActuelle=1; // La page actuelle est la n°1    
    }
     
    $premiereEntree=($pageActuelle-1)*$messagesParPage; // On calcul la première entrée à lire
     
    // La requête sql pour récupérer les messages de la page actuelle.
    $retour_messages=mysql_query('SELECT * FROM site_membre WHERE id_user="'.$_SESSION['id'].'" AND valide="1" AND point>"0" AND banniere LIKE "'.$filtre_ban.'" AND categorie LIKE "'.$cat.'" LIMIT '.$premiereEntree.', '.$messagesParPage.'');
    echo 	'<center><table border="01" align="center" cellpadding="02" cellspacing="0">
    		<th>Site</th><th>Reçu</th>';
     
    while($donnees_messages=mysql_fetch_assoc($retour_messages)) // On lit les entrées une à une grâce à une boucle
    {
         //Je vais afficher les messages dans des petits tableaux. C'est à vous d'adapter pour votre design...
         //De plus j'ajoute aussi un nl2br pour prendre en compte les sauts à la ligne dans le message.
     
    echo "   <tr>
                <td><a href='?id=$donnees_messages[id]'>";
    			if (empty($donnees_messages['banniere'])) { echo "$donnees_messages[titre]"; } else { echo "<img src='$donnees_messages[banniere]' />"; }
    echo"		</a></td><td>".stripslashes($donnees_messages['clic_reçu'])."</td>
    			</tr>";		
     
     
    }
    echo "</table></center>";
    echo '<p align="center">Page : '; //Pour l'affichage, on centre la liste des pages
    for($i=1; $i<=$nombreDePages; $i++) //On fait notre boucle
    {
         //On va faire notre condition
         if($i==$pageActuelle) //Si il s'agit de la page actuelle...
         {
             echo ' [ '.$i.' ] '; 
         }	
         else //Sinon...
         {
              echo ' <a href="clic-echange.php?page='.$i.'">'.$i.'</a> ';
         }
    }
    echo '</p>';
     
     
    ?>

    Si quelqu'un sait m'aider, je le remercie d'avance. Je crois que je vois trop loin par rapport à mes connaissances.

  2. #2
    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 : 39
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Effectivement LIKE n'accepte pas les données multiples, ou plus exactement il va chercher quelque chose qui ressemblera à mot1,mot2 au lieu de chercher mot1 ou mot2...

    Donc deux possibilités : l'opérateur IN (qui remplace une série de =) ou une série de OR LIKE...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $cat = "";
    if(isset($_POST['categorie'])) {
            $tabCat = array();
    	foreach ($_POST['categorie'] as $categorie) {
    	   $tabCat .= ' categorie LIKE "'.$cat.'" '; 
            }
            $cat = ' AND '.explode(' OR ', $tabCat);
    }
    $retour_total = mysql_query('SELECT COUNT(*) AS total FROM site_membre WHERE id_user="'.$_SESSION['id'].'" AND valide="1" AND point>"0" AND banniere LIKE "'.$filtre_ban.' '.$cat);

  3. #3
    Membre du Club Avatar de Sianobel
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 54
    Points : 58
    Points
    58
    Par défaut
    Merci de m'avoir répondu, je vais tester ta solution mais il s'avère que je venais de réussir à faire fonctionner le script.

    Je te dit laquelle des deux méthode fonctionne la mieux.

    Je vais rester sur la mienne. Ce n'est peut être pas la meilleur mais j'en ai un peu marre de chipoter.

    La voici:

    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
    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
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
     
    <fieldset>
    	<legend><span>Filtre</span></legend>
    	<form method="post" action="">
    	<input type="radio" name="filtre" value="tout" CHECKED>Tout
    	<input type="radio" name="filtre" value="banniere" >Avec bannière
    	<input type="radio" name="filtre" value="texte" >Sans bannière
     
    	<select name="categorie[]" size="1" multiple="multiple">
    		<?php
    		$selection=mysql_query("SELECT * FROM categorie ORDER BY nom");
     
    		while($message = mysql_fetch_assoc($selection))
    		{
    		?>
    		<OPTION VALUE="<?php print($message['id']);?>"><?php print($message['nom']); ?>
    		<?php
    		}
    		?>
    	</select> 
     
    	<input type="submit" class="formsubmit" title="On ne clique qu'une seule fois ;)" value="Mettre un filtre" />
    	</form>
    </fieldset>
     
    <?php
     
    if(isset($_POST['filtre'])) {
    	if ($_POST['filtre']=="banniere") {
    		$filtre_ban = "%.%";
    	}
    	elseif ($_POST['filtre']=="texte") {
    		$filtre_ban = "";
    	}
    	elseif ($_POST['filtre']=="tout") {
    		$filtre_ban = "%";
    	}
    }
    else {
    	$filtre_ban = "%";
    }
     
    if(isset($_POST['categorie'])) {
    	$cat = "";
    	foreach ($_POST['categorie'] as $categorie) {
    	$cat .= "$categorie"; }
    	$cat = implode(',',$_POST['categorie']);
    }
    else {
    	$selection2 = mysql_query("SELECT id FROM categorie ORDER BY id");
    	$cat_prov = "";
    	while($message2 = mysql_fetch_assoc($selection2)) {
    	$cat_prov[] .= "$message2[id]"; }
    	$cat = implode(',',$cat_prov);
    }
     
    echo "$filtre_ban $cat";
     
    //Une connexion SQL doit être ouverte avant cette ligne...
    $retour_total = mysql_query('SELECT COUNT(*) AS total FROM site_membre WHERE id_user="'.$_SESSION['id'].'" AND valide="1" AND point>"0" AND banniere LIKE "'.$filtre_ban.'" AND categorie IN ('.$cat.')'); //Nous récupérons le contenu de la requête dans $retour_total
    $donnees_total = mysql_fetch_assoc($retour_total); //On range retour sous la forme d'un tableau.
    $total=$donnees_total['total']; //On récupère le total pour le placer dans la variable $total.
     
    //Nous allons maintenant compter le nombre de pages.
    $nombreDePages=ceil($total/$messagesParPage);
     
    if(isset($_GET['page'])) // Si la variable $_GET['page'] existe...
    {
         $pageActuelle=intval($_GET['page']);
     
         if($pageActuelle>$nombreDePages) // Si la valeur de $pageActuelle (le numéro de la page) est plus grande que $nombreDePages...
         {
              $pageActuelle=$nombreDePages;
         }
    }
    else // Sinon
    {
         $pageActuelle=1; // La page actuelle est la n°1    
    }
     
    $premiereEntree=($pageActuelle-1)*$messagesParPage; // On calcul la première entrée à lire
     
    // La requête sql pour récupérer les messages de la page actuelle.
    $retour_messages=mysql_query('SELECT * FROM site_membre WHERE id_user="'.$_SESSION['id'].'" AND valide="1" AND point>"0" AND banniere LIKE "'.$filtre_ban.'" AND categorie IN ('.$cat.') LIMIT '.$premiereEntree.', '.$messagesParPage.'');
    echo 	'<center><table border="01" align="center" cellpadding="02" cellspacing="0">
    		<th>Site</th><th>Reçu</th>';
     
    while($donnees_messages=mysql_fetch_assoc($retour_messages)) // On lit les entrées une à une grâce à une boucle
    {
         //Je vais afficher les messages dans des petits tableaux. C'est à vous d'adapter pour votre design...
         //De plus j'ajoute aussi un nl2br pour prendre en compte les sauts à la ligne dans le message.
     
    echo "   <tr>
                <td><a href='?id=$donnees_messages[id]'>";
    			if (empty($donnees_messages['banniere'])) { echo "$donnees_messages[titre]"; } else { echo "<img src='$donnees_messages[banniere]' />"; }
    echo"		</a></td><td>".stripslashes($donnees_messages['clic_reçu'])."</td>
    			</tr>";		
     
     
    }
    echo "</table></center>";
    echo '<p align="center">Page : '; //Pour l'affichage, on centre la liste des pages
    for($i=1; $i<=$nombreDePages; $i++) //On fait notre boucle
    {
         //On va faire notre condition
         if($i==$pageActuelle) //Si il s'agit de la page actuelle...
         {
             echo ' [ '.$i.' ] '; 
         }	
         else //Sinon...
         {
              echo ' <a href="clic-echange.php?page='.$i.'">'.$i.'</a> ';
         }
    }
    echo '</p>';
     
     
    ?>

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

Discussions similaires

  1. Récuperer des informations lié à un formulaire
    Par jeremygata dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2008, 11h25
  2. Réponses: 4
    Dernier message: 22/02/2008, 12h43
  3. Réponses: 4
    Dernier message: 13/06/2007, 13h17
  4. [SQL] Pb Sql lors de l envoie des données via un formulaire
    Par xtiand4 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/06/2006, 14h18
  5. [C#] Transférer des informations entre 2 formulaires
    Par monoeilouais dans le forum Windows Forms
    Réponses: 2
    Dernier message: 14/07/2004, 17h21

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