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 :

Recherche, tableau et pagination [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 265
    Points : 53
    Points
    53
    Par défaut Recherche, tableau et pagination
    Bonjour

    D'habitude pour faire un système de pagination, je me sert du tuto sur ce site pour la pagination d'un livre d'or qui fonctionne tres bien..

    Mais la j'effectue une recherche, qui me renvois des resultats sous forme de tableau et je n'arrive pas a afficher une pagination uniquement sur les résultats.

    le code :

    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
    <?php
    function sql_connexion() {
    	global $mysqli;
    	$mysqli = new mysqli("localhost", "", "", "");
     
    	/* Vérification de la connexion */
    	if(mysqli_connect_errno()) {
    		printf("Échec de la connexion : %s\n", mysqli_connect_error());
    		exit();
    	}
    	// $mysqli->query("SET NAMES 'utf8' ");
    }
    function sql_requete($query) {
    	global $mysqli;
    	$result = $mysqli->query($query);
    	if(!$result) {
    		// Erreur dans la requete
    		echo '<p>ERROR '. $mysqli->errno .'</strong> &gt;&gt; '. $mysqli->error .'</p>';
    		return false;
    	} else {
    		// Tout va bien
    		return $result;
    	}
    }
    if(isset($_GET['q']) && $_GET['q'] != '') {
    	$recherche = stripslashes($_GET['q']);
    } else {
    	$recherche = '';
    }
    ?>
     
    <?php
     
    if($recherche != '') {
    	sql_connexion();
     
    	$query  = "SELECT nom, prix,  image120, idneta, rubrique, keywords, nommarchand, id_prod,   descriptif, url ";
    	$query .= "FROM catalogue " ;
    	$query .= "WHERE nom REGEXP '". addslashes($recherche) ."' ";
    	//$query .=    "OR  REGEXP '". addslashes($recherche) ."' ";
     
    	if ($result = sql_requete($query)) {
    		if($result->num_rows > 0) {
     
     
    			 //echo (int)($result->num_rows > 0);
     
        	echo '<table class="sortable" >';
          echo '<th>image</th>';
        	echo '<th>nom</th>';
    			echo '<th>description</th>';
    			echo '<th>prix</th>';
    			echo '<th>marchand</th>';
    			echo '<th>lien</th>';
     
    			/* Récupère un tableau d'objets */
    			while ($obj = $result->fetch_object()) {
     
    				echo '<tr onmouseover="this.className=\'hover\';" onmouseout="this.className=\'\';">';
    				echo	'<td class="img"><img src="' . htmlspecialchars($obj->image120) . '" alt="" /></td>';
    				echo	'<td class="nom">' . htmlspecialchars($obj->nom) . '</td>';
    				echo	'<td class="des">'. htmlspecialchars($obj->descriptif) .  ' <br><br><div class="note"><a href="avis.php?id_prod='.$obj->id_prod.'">Avis sur le produit</a></div></td>';
    				echo	'<td class="pri">&nbsp;&nbsp;&nbsp;' . htmlspecialchars($obj->prix) . '  €</td>';
    				echo	'<td class="img"> <img src="'.($obj->nommarchand) .'"> </td>';
    					echo	'<td class="lien"><a href="details.php?id_prod=' . htmlspecialchars($obj->id_prod) . ' "target="blank">Voir le produit</a></td>';
     
            echo '</tr>';
     
    			}	
    			echo '</table>';
     
    			/* free result set */
    			$result->close();
    		} else {
    		echo "<td class='essai'>Votre recherche n'a retourn&eacute; aucun r&eacute;sultat.</td>"; 
    		}
    	}
    	/* Fermeture de la connexion */
    	$mysqli->close();
    }
    ?>
    si quelqu'un pouvait me dire comment faire ca serait sympa ..

    merci.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    il est ou ton systeme de pagination ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 265
    Points : 53
    Points
    53
    Par défaut
    je l'ai enlevé puisqu'il ne marche pas .. mais le 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
    $messagesParPage=5; //Nous allons afficher 5 messages par page.
     
    //Une connexion SQL doit être ouverte avant cette ligne...
    $retour_total=mysql_query('SELECT COUNT(*) AS total FROM livredor'); //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 livredor ORDER BY id DESC LIMIT '.$premiereEntree.', '.$messagesParPage.'');
     
    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 '<table width="400" border="0" align="center" cellpadding="0" cellspacing="0">
                    <tr>
                         <td><strong>Ecrit par : '.stripslashes($donnees_messages['pseudo']).'</strong></td>
                    </tr>
                    <tr>
                         <td>'.nl2br(stripslashes($donnees_messages['message'])).'</td>
                    </tr>
                </table><br /><br />';
        //J'ai rajouté des sauts à la ligne pour espacer les messages.   
    }
     
    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="livredor.php?page='.$i.'">'.$i.'</a> ';
         }
    }
    echo '</p>';
    ?>
    enfin ne marche pas sur le code de mon fichier, sinon il fonctionne très bien !

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je ne vois pas le lien entre les deux codes que tu nous montres, ce ne sont pas les memes requetes.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 265
    Points : 53
    Points
    53
    Par défaut
    c'est justement la que je bloque, je ne vois pas comment faire pour mettre le fichier de pagination...

    et je ne trouve aucune explication pour paginer un tableau..

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ce n'est pas le tableau qui doit être paginé, c'est la requête en utilisant LIMIT.
    L'affichage se contente de montrer ce que la requête a filtré.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 265
    Points : 53
    Points
    53
    Par défaut
    limite la requete c'est bon..

    mais si par exemple je limit a 20, ensuite je fais comment pour afficher les resultat suivant ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$query .= "WHERE nom REGEXP '". addslashes($recherche) ."' LIMIT 20 ";

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    exactement comme dans le code que tu as mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LIMIT '.$premiereEntree.', '.$messagesParPage.''
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 265
    Points : 53
    Points
    53
    Par défaut
    bonjour

    bon j'ai résolu mon souci pour un affichage de tableau avec pagination :

    voici le code :
    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
    <?php
    $cnx = mysql_connect( "localhost", "", "" );
    $db= mysql_select_db( "" );
     // sélectionne toutes les fiches de la table
    $query="SELECT * FROM catalogue WHERE promo=1";
    $result = mysql_query($query);
     
    $Nmax = 50; // nombre par page
    $Ncur = 0; // n° de la fiche courante
     
    $Ndeb=@$_GET["num"]; // 1ère fiche transmise par l'URL
    echo("<h3>Toutes les promos du moment : </h3>");
    echo('<div class="tri"> Cliquez sur les entetes des colonnes pour trier </div><br>');
    echo '<table class="sortable" >';
          echo '<th>image</th>';
        	echo '<th>nom</th>';
    			echo '<th>description</th>';
    			echo '<th>prix</th>';
    			echo '<th>marchand</th>';
    			echo '<th>lien</th>';
    // tant qu'il y a des fiches
    $resume = substr($val['descriptif'],0,80); // pour les 80 premiers caractères
    while (($val = mysql_fetch_array($result))
    && ($Ncur<$Nmax+$Ndeb)) {
       if($Ncur>=$Ndeb) {
          // affiche un champ
      echo '<tr onmouseover="this.className=\'hover\';" onmouseout="this.className=\'\';">';
    echo(   '<td><img src="'.($val["image80"]).'" ></td>' ); 
    echo( '  <td class="nom">'.$val["nom"].'</td>' ); 
    echo "  <td>".$resume = substr($val["descriptif"],0,80);"</td>" ; 
    echo( '  <td class="pri">'.$val["prix"].'Euros</td>' );
    echo(   '<td ><img src="'.($val["nommarchand"]).'" ></td>' );
    echo	'<td class="lien"><a href="details.php?id_prod=' . htmlspecialchars($val["id_prod"]) . ' "target="blank">Voir le produit</a></td>'; 
    echo '</tr>';
     
    }
     
       // une de plus
       $Ncur++;
    }	echo '</table>'; ?>
     
    <br>
     
    <div class="foot">
    <? // Navigation
    // Des fiches avant ?
    if($Ndeb > 0) { ?>
       <td valign=top>
          <A href="?num=<? echo $Ndeb-$Nmax; ?>" >Retour</A>
     
       </td>
    <? } ?>
       <td>   
    <? // N° des pages
    $Npag = ceil(mysql_numrows($result)/$Nmax);
    for($i = 1;$i<=$Npag;$i++) {
       // Page courante ?
       if($Ndeb == ($i-1)*$Nmax) { ?>
          Page <? echo $i; ?>
       <? } else { ?>
          <A href="?num=<? echo ($i-1)*$Nmax; ?>"
          >&nbsp;<? echo $i; ?>&nbsp;</A>
       <? }
    } ?>
       </td>   
    <? // Des fiches après ?
    if($val) { ?>
       <td valign=top>
          <A href="?num=<? echo $Ncur; ?>">Suite>></A>
       </td>
    <? } ?>
    </tr></div>


    ca marche très bien, seulement maintenant, je voudrais faire la meme chose, mais avec une recherche avant..
    J'ai donc fait ca :

    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
    <?php
    $cnx = mysql_connect( "localhost", "", "" );
    $db= mysql_select_db( "" );
     // sélectionne toutes les fiches de la table
    $query="SELECT * FROM catalogue WHERE promo=1";
    $result = mysql_query($query);
     
    $Nmax = 50; // nombre par page
    $Ncur = 0; // n° de la fiche courante
     
    $Ndeb=@$_GET["num"]; // 1ère fiche transmise par l'URL
    echo("<h3>Toutes les promos du moment : </h3>");
    echo('<div class="tri"> Cliquez sur les entetes des colonnes pour trier </div><br>');
    echo '<table class="sortable" >';
          echo '<th>image</th>';
        	echo '<th>nom</th>';
    			echo '<th>description</th>';
    			echo '<th>prix</th>';
    			echo '<th>marchand</th>';
    			echo '<th>lien</th>';
    // tant qu'il y a des fiches
    $resume = substr($val['descriptif'],0,80); // pour les 80 premiers caractères
    while (($val = mysql_fetch_array($result))
    && ($Ncur<$Nmax+$Ndeb)) {
       if($Ncur>=$Ndeb) {
          // affiche un champ
      echo '<tr onmouseover="this.className=\'hover\';" onmouseout="this.className=\'\';">';
    echo(   '<td><img src="'.($val["image80"]).'" ></td>' ); 
    echo( '  <td class="nom">'.$val["nom"].'</td>' ); 
    echo "  <td>".$resume = substr($val["descriptif"],0,80);"</td>" ; 
    echo( '  <td class="pri">'.$val["prix"].'Euros</td>' );
    echo(   '<td ><img src="'.($val["nommarchand"]).'" ></td>' );
    echo	'<td class="lien"><a href="details.php?id_prod=' . htmlspecialchars($val["id_prod"]) . ' "target="blank">Voir le produit</a></td>'; 
    echo '</tr>';
     
    }
     
       // une de plus
       $Ncur++;
    }	echo '</table>'; ?>
     
    <br>
     
    <div class="foot">
    <? // Navigation
    // Des fiches avant ?
    if($Ndeb > 0) { ?>
       <td valign=top>
          <A href="?num=<? echo $Ndeb-$Nmax; ?>" >Retour</A>
     
       </td>
    <? } ?>
       <td>   
    <? // N° des pages
    $Npag = ceil(mysql_numrows($result)/$Nmax);
    for($i = 1;$i<=$Npag;$i++) {
       // Page courante ?
       if($Ndeb == ($i-1)*$Nmax) { ?>
          Page <? echo $i; ?>
       <? } else { ?>
          <A href="?num=<? echo ($i-1)*$Nmax; ?>"
          >&nbsp;<? echo $i; ?>&nbsp;</A>
       <? }
    } ?>
       </td>   
    <? // Des fiches après ?
    if($val) { ?>
       <td valign=top>
          <A href="?num=<? echo $Ncur; ?>">Suite>></A>
       </td>
    <? } ?>
    </tr></div>
    tout content de moi j'essaie et la surprise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Warning: mysql_numrows(): supplied argument is not a valid MySQL result resource in /home/bonplanm/public_html/essai.php on line 96
     
    Warning: Division by zero in /home/bonplanm/public_html/essai.php on line 96
    la code compte bien les pages, puisqu'il affiche en bas les liens pour les autres pages (et qu'il les modifies selon la requete ou le nombre d'affichage demandé)
    mais la ... suis perdu, je ne comprends pas pourquoi il me dis qu'il divise par 0...

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 265
    Points : 53
    Points
    53
    Par défaut
    bon en fait , c'etait tout bete, il suffit de mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$Npag = ceil(mysql_numrows($result)/$Nmax);
    avant la boucle et ca fonctionne...


    Résolu..

    Merci de votre aide.

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

Discussions similaires

  1. Fonction recherche tableau 3 entrées
    Par emilie31 dans le forum Excel
    Réponses: 3
    Dernier message: 31/07/2010, 06h46
  2. Recherche aide POur pagination et filtre
    Par wyllos dans le forum Langage
    Réponses: 1
    Dernier message: 27/05/2010, 13h40
  3. [XL-2003] Recherche tableau 2 dimensions
    Par kirin54 dans le forum Excel
    Réponses: 3
    Dernier message: 08/02/2010, 10h35
  4. [Recherche] Tableau avec lignes qui se déploient
    Par chris78 dans le forum Débuter
    Réponses: 3
    Dernier message: 09/04/2009, 19h31
  5. Recherche tableau excel
    Par zepeto dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 26/06/2008, 09h29

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