Nombre d'enregistrements d'un résultat de requête

pingoo
Invité n'ayant pas de compte PHPfrance

05 juil. 2005, 20:08

Bonjour,
Je cherche le moyen d'afficher le nombre de résultat d'une requête.
Voici mon code :
$date1= date("Y-m-d", strtotime("  -1 day"));  // aujourd'hui
$date2= date("Y-m-d", strtotime("  -1 week"));  // 1semaine
$date3= date("Y-m-d", strtotime("  -2 week"));  // 2semaine
$date4= date("Y-m-d", strtotime("  -3 week"));  // 3semaine
$date5= date("Y-m-d", strtotime("  -4 week"));  // 1mois
$tri_date= "ORDER BY 'id' DESC "; //tri par date
$select  = "SELECT secteur_activite, fonction, lieu, type_de_contrat, id, societe,  DATE_FORMAT(date, '%d.%m.%y') date, SUBSTRING(profil_rechercher,1,200) AS profil_rechercher, profil_entreprise, debut, salaire, contact, adresse_societe, web FROM fk_offre_emploi "; 
switch ($parution) {
 case "toutes":
 	$select .= "where date ";break;
 case "aujourdhui":
 	$select .= "where date > '". $date1 ."' ";break;
 case "1semaine":
 	$select .= "where date > '". $date2 ."' ";break;
 case "2semaines":
 	$select .= "where date > '". $date3 ."' ";break;
 case "3semaines":
 	$select .= "where date > '". $date4 ."' ";break;
 case "1mois":
 	$select .= "where date > '". $date5 ."' ";break;
	}
if ($mots_cle != "") {
 	$select .= "AND (secteur_activite LIKE '%". $mots_cle ."%' OR fonction LIKE '%". $mots_cle ."%' OR societe LIKE '%". $mots_cle ."%' OR profil_rechercher LIKE '%". $mots_cle ."%' OR profil_entreprise LIKE '%". $mots_cle ."%' OR reference LIKE '%". $mots_cle ."%' OR lieu LIKE '%". $mots_cle ."%' OR debut LIKE '%". $mots_cle ."%' OR salaire LIKE '%". $mots_cle ."%' OR contact LIKE '%". $mots_cle ."%' OR adresse_societe LIKE '%". $mots_cle ."%' OR type_de_contrat LIKE '%". $mots_cle ."%') ";
	}
if ($secteur_activite != "indifférent")  {
    $select .= "AND secteur_activite LIKE '". $secteur_activite ."%' "; 
}
if ($secteur_activite != "indifférent" && $mots_cle != "")  {
    $select .= "AND secteur_activite LIKE '". $secteur_activite ."%' "; 
}
if ($lieu != "indifférent") {
   	$select .= "GROUP BY lieu, type_de_contrat, date HAVING lieu='". $lieu ."' ";
	}
if ($type_de_contrat != "indifferent" && $lieu == "indifférent") {
 	$select .= "AND type_de_contrat LIKE '". $type_de_contrat ."' ";
	}
if ($type_de_contrat != "indifferent") {
 	$select .= "AND type_de_contrat='". $type_de_contrat ."' ";
	}
if ($type_de_contrat != "indifferent" || $lieu != "indifférent" || $secteur_activite != "indifférent" || $parution != "toutes" || $mots_cle != "") {
 	$select .= " $tri_date ";
	}
if ($type_de_contrat == "indifferent" && $lieu == "indifférent" && $secteur_activite == "indifférent" && $parution == "toutes" && $mots_cle == "") {
 	$select .= " $tri_date ";
	}
function barre_navigation ($nb_total, 
        $nb_affichage_par_page, 
        $debut,
        $nb_liens_dans_la_barre) {

    $barre = '';
    
    // on recherche l'URL courante munie de ses paramètre auxquels on ajoute le paramètre 'debut' qui jouera le role du premier élément de notre LIMIT
    if ($_SERVER['QUERY_STRING'] == "") {
        $query = $_SERVER['PHP_SELF'].'?debut=';
    }
    else {
        $tableau = explode ("debut=", $_SERVER['QUERY_STRING']);
        $nb_element = count ($tableau);
        if ($nb_element == 1) {
            $query = $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'].'&debut=';
        }
        else {
            if ($tableau[0] == "") {
                $query = $_SERVER['PHP_SELF'].'?debut=';
            }
            else {
                $query = $_SERVER['PHP_SELF'].'?'.$tableau[0].'debut=';
            }
        }
    }
    
    // on calcul le numéro de la page active
    $page_active = floor(($debut/$nb_affichage_par_page)+1);
    // on calcul le nombre de pages total que va prendre notre affichage
    $nb_pages_total = ceil($nb_total/$nb_affichage_par_page);
    
    // on calcul le premier numero de la barre qui va s'afficher, ainsi que le dernier ($cpt_deb et $cpt_fin)
    // exemple : 2 3 4 5 6 7 8 9 10 11 << $cpt_deb = 2 et $cpt_fin = 11
    if ($nb_liens_dans_la_barre%2==0) {
        $cpt_deb1 = $page_active - ($nb_liens_dans_la_barre/2)+1;
        $cpt_fin1 = $page_active + ($nb_liens_dans_la_barre/2);
    }
    else {
        $cpt_deb1 = $page_active - floor(($nb_liens_dans_la_barre/2));
        $cpt_fin1 = $page_active + floor(($nb_liens_dans_la_barre/2));
    }
    
    if ($cpt_deb1 <= 1) {
        $cpt_deb = 1;
        $cpt_fin = $nb_liens_dans_la_barre;
    }
    elseif ($cpt_deb1>1 && $cpt_fin1<$nb_pages_total) {
        $cpt_deb = $cpt_deb1;
        $cpt_fin = $cpt_fin1;
    }
    else {
        $cpt_deb = ($nb_pages_total-$nb_liens_dans_la_barre)+1;
        $cpt_fin = $nb_pages_total;
    }

    if ($nb_pages_total <= $nb_liens_dans_la_barre) {
        $cpt_deb=1;
        $cpt_fin=$nb_pages_total;
    }
    
    // si le premier numéro qui s'affiche est différent de 1, on affiche << qui sera un lien vers la premiere page
    if ($cpt_deb != 1) {
        $cible = $query.(0);
        $lien = '<A HREF="'.$cible.'"><<</A>&nbsp;&nbsp;';
    }
    else {
        $lien='';
    }
    $barre .= $lien;

    // on affiche tous les liens de notre barre, tout en vérifiant de ne pas mettre de lien pour la page active
    for ($cpt = $cpt_deb; $cpt <= $cpt_fin; $cpt++) {
        if ($cpt == $page_active) {
            if ($cpt == $nb_pages_total) {
                $barre .= $cpt;
            }
            else {
                $barre .= $cpt.'&nbsp;-&nbsp;';
            }
        }
        else {
            if ($cpt == $cpt_fin) {
                $barre .= "<A HREF='".$query.(($cpt-1)*$nb_affichage_par_page);
                $barre .= "'>".$cpt."</A>";
            }
            else {
                
                $barre .= "<A HREF='".$query.(($cpt-1)*$nb_affichage_par_page);
                $barre .= "'>".$cpt."</A>&nbsp;-&nbsp;";
            }
        }
    }
    
    $fin = ($nb_total - ($nb_total % $nb_affichage_par_page));
    if (($nb_total % $nb_affichage_par_page) == 0) {
        $fin = $fin - $nb_affichage_par_page;
    }

        // si $cpt_fin ne vaut pas la dernière page de la barre de navigation, on affiche un >> qui sera un lien vers la dernière page de navigation
    if ($cpt_fin != $nb_pages_total) {
        $cible = $query.$fin;
        $lien = '&nbsp;&nbsp;<A HREF="'.$cible.'">>></A>';
    }
    else {
        $lien='';
    }
    $barre .= $lien;

    return $barre;    
}
// on prépare une requête permettant de calculer le nombre total d'éléments qu'il faudra afficher sur nos différentes pages
$sql  = 'SELECT count(*) FROM fk_offre_emploi';

// on exécute cette requête
$resultat = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

// on récupère le nombre d'éléments à afficher
$nb_total = mysql_fetch_array($resultat);

// on teste si ce nombre de vaut pas 0
if (($nb_total = $nb_total[0]) == 0) {
}
else {
    
    // sinon, on regarde si la variable $debut (le x de notre LIMIT) n'a pas déjà été déclarée, et dans ce cas, on l'initialise à 0
    if (!isset($_GET['debut'])) $_GET['debut'] = 0;
    
    $nb_affichage_par_page = 1;
    
    // Préparation de la requête avec le LIMIT
    $sql = $select .= 'LIMIT '.$_GET['debut'].','.$nb_affichage_par_page;

    // on exécute la requête
    $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
}
// on libère l'espace mémoire alloué pour cette requête 
mysql_free_result ($resultat); 
$total = mysql_num_rows($req);
Mon probleme est que ma requete SELECT COUNT(*) me donne le résultat total de ma table et calcul en fonction le nombre de page.
Je ne sais comment faire le lien entre le résultat de la requete et l'affichage.
Merci pour votre aide. =D>

ViPHP
pjl
ViPHP | 2119 Messages

05 juil. 2005, 23:43

pas bien compris là.
Peux-tu ne donner que la partie de ton code qui te pose problème.

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

06 juil. 2005, 11:37

Modération : d'accord, c'est du PHP qui fait ça, mais la question est pourtant du SQL non ? Et concerne les "Base de données".
Hop ! Déplacement !
Modifié en dernier par mere-teresa le 06 juil. 2005, 14:45, modifié 1 fois.

pingoo
Invité n'ayant pas de compte PHPfrance

06 juil. 2005, 14:44

Ce que je veux c'est que $nb_total soit égal au nombre de résultat suite à la requête $select et non le nombre de résultat ce trouvant dans la base de donnée.
Je sais pas si je suis très claire :oops:

ViPHP
pjl
ViPHP | 2119 Messages

06 juil. 2005, 15:06

ben encore moins que tout à l'heure.

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

06 juil. 2005, 15:10

Mon probleme est que ma requete SELECT COUNT(*) me donne le résultat total de ma table et calcul en fonction le nombre de page.
Je ne sais comment faire le lien entre le résultat de la requete et l'affichage.
Fais un tour sur PHPDebutant http://phpdebutant.org/article84.php ils ont un tutorial là dessus...à partir de "Notre affichage page par page." (recherche avec CRTL + F ce texte dans la page, si tu veux pas tout lire).
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

pingoo
Invité n'ayant pas de compte PHPfrance

06 juil. 2005, 15:19

Ok merci j'y vais

pingoo
Invité n'ayant pas de compte PHPfrance

06 juil. 2005, 15:57

Super le tutorial mais je n'y ai pas trouvé de réponce.
Ce que j'aimerais c'est connaitre le nombre de résultat suivant cette requete :
$secteur_activite= $_GET['1'];
$lieu= $_GET['2'];
$type_de_contrat=$_GET['3'];
$parution=$_GET['4'];
$mots_cle=addslashes($_GET['5']); 
$date1= date("Y-m-d", strtotime("  -1 day"));  // aujourd'hui
$date2= date("Y-m-d", strtotime("  -1 week"));  // 1semaine
$date3= date("Y-m-d", strtotime("  -2 week"));  // 2semaine
$date4= date("Y-m-d", strtotime("  -3 week"));  // 3semaine
$date5= date("Y-m-d", strtotime("  -4 week"));  // 1mois
$tri_date= "ORDER BY 'id' DESC "; //tri par date
$select  = "SELECT secteur_activite, fonction, lieu, type_de_contrat, id, societe,  DATE_FORMAT(date, '%d.%m.%y') date, SUBSTRING(profil_rechercher,1,200) AS profil_rechercher, profil_entreprise, debut, salaire, contact, adresse_societe, web FROM fk_offre_emploi "; 
switch ($parution) {
 case "toutes":
 	$select .= "where date ";break;
 case "aujourdhui":
 	$select .= "where date > '". $date1 ."' ";break;
 case "1semaine":
 	$select .= "where date > '". $date2 ."' ";break;
 case "2semaines":
 	$select .= "where date > '". $date3 ."' ";break;
 case "3semaines":
 	$select .= "where date > '". $date4 ."' ";break;
 case "1mois":
 	$select .= "where date > '". $date5 ."' ";break;
	}
if ($mots_cle != "") {
 	$select .= "AND (secteur_activite LIKE '%". $mots_cle ."%' OR fonction LIKE '%". $mots_cle ."%' OR societe LIKE '%". $mots_cle ."%' OR profil_rechercher LIKE '%". $mots_cle ."%' OR profil_entreprise LIKE '%". $mots_cle ."%' OR reference LIKE '%". $mots_cle ."%' OR lieu LIKE '%". $mots_cle ."%' OR debut LIKE '%". $mots_cle ."%' OR salaire LIKE '%". $mots_cle ."%' OR contact LIKE '%". $mots_cle ."%' OR adresse_societe LIKE '%". $mots_cle ."%' OR type_de_contrat LIKE '%". $mots_cle ."%') ";
	}
if ($secteur_activite != "indifférent")  {
    $select .= "AND secteur_activite LIKE '". $secteur_activite ."%' "; 
}
if ($secteur_activite != "indifférent" && $mots_cle != "")  {
    $select .= "AND secteur_activite LIKE '". $secteur_activite ."%' "; 
}
if ($lieu != "indifférent") {
   	$select .= "GROUP BY lieu, type_de_contrat, date HAVING lieu='". $lieu ."' ";
	}
if ($type_de_contrat != "indifferent" && $lieu == "indifférent") {
 	$select .= "AND type_de_contrat LIKE '". $type_de_contrat ."' ";
	}
if ($type_de_contrat != "indifferent") {
 	$select .= "AND type_de_contrat='". $type_de_contrat ."' ";
	}
if ($type_de_contrat != "indifferent" || $lieu != "indifférent" || $secteur_activite != "indifférent" || $parution != "toutes" || $mots_cle != "") {
 	$select .= " $tri_date ";
	}
if ($type_de_contrat == "indifferent" && $lieu == "indifférent" && $secteur_activite == "indifférent" && $parution == "toutes" && $mots_cle == "") {
 	$select .= " $tri_date ";
	}
JE ne trouve vraiment pas. Si quelqu'un a une solution.. :cry:

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

06 juil. 2005, 15:59

Fais echo $select à la fin et colle ici le résultat du echo :)
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

pingoo
Invité n'ayant pas de compte PHPfrance

06 juil. 2005, 16:04

Voici le résultat :

Code : Tout sélectionner

SELECT secteur_activite, fonction, lieu, type_de_contrat, id, societe, DATE_FORMAT(date, '%d.%m.%y') date, SUBSTRING(profil_rechercher,1,200) AS profil_rechercher, profil_entreprise, debut, salaire, contact, adresse_societe, web FROM fk_offre_emploi where date ORDER BY 'id' DESC LIMIT 0,1
Merci

ViPHP
pjl
ViPHP | 2119 Messages

06 juil. 2005, 16:49

Super le tutorial mais je n'y ai pas trouvé de réponce.
Extrait du tuto cité par mere-teresa
$total = mysql_num_rows($result);
Ca ne te convient pas.

pingoo
Invité n'ayant pas de compte PHPfrance

06 juil. 2005, 18:15

Je déja essayé mais cela me renvoye :cry: le nombre de résultat par page et non au total.

ViPHP
pjl
ViPHP | 2119 Messages

06 juil. 2005, 20:14

Désolé mais entre ca
Je déja essayé mais cela me renvoye :cry: le nombre de résultat par page et non au total.
et ca :
Ce que je veux c'est que $nb_total soit égal au nombre de résultat suite à la requête $select et non le nombre de résultat ce trouvant dans la base de donnée.
je ne comprends rien.
Tout ce que je sais, c'est que la ligne de code que j'ai mise en valeur va te donner ton $nb_total.

pingoo
Invité n'ayant pas de compte PHPfrance

06 juil. 2005, 21:53

Oui cela me donne le nombre total affiché sur la page.
Mais si j'ais par exemple 10 résultat à afficher et je limite le nombre affichage par page à 5 cela me donne comme résultat 5 sur chaque page et non 10 au total.

pingoo
Invité n'ayant pas de compte PHPfrance

06 juil. 2005, 22:20

Oui cela me donne le nombre total affiché sur la page.
Mais si j'ais par exemple 10 résultat à afficher et je limite le nombre affichage par page à 5 cela me donne comme résultat 5 sur chaque page et non 10 au total.