A propos de "Comment faire un affichage page par page en PHP"

Répondre
docfunky
le 15/11/2010 à 15:07
docfunky
bonjour, ce sujet concerne directement le Topic suivant :
http://www.lephpfacile.com/howto/6-comment-faire-un-affichage-page-par-page-en-php

Voila, j'ai souahité reprendre ce code, mais IE 6 me reprends la totalité de mon tableau, ne m'affiche aucune pages ( j'ai juste un chiffre 1) et IE 6 me lance les erreurs suivantes :

PHP Notice: Object of class PDOStatement could not be converted to int in C:\www\Unmanage\connect.inc.php on line 37 PHP Notice: Object of class PDOStatement could not be converted to int in C:\www\Unmanage\connect.inc.php on line 101 PHP Notice: Object of class PDOStatement could not be converted to int in C:\www\Unmanage\connect.inc.php on line 101 PHP Notice: Object of class PDOStatement could not be converted to int in C:\www\Unmanage\connect.inc.php on line 102

je vous livre cidessou le code que j'ai essayé d'adapter librement.

<?php 


// On trie les résultats pour les afficher par 50 dans des pages différentes.

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.'">&lt;&lt;</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.'">&gt;&gt;</A>';
}
else {
$lien='';
}
$barre .= $lien;

return $barre;
}

// fonction de préprod ?
//localhost-préproduction : serveur sur lequel on est
//$serverLchost= "*****";
//$bdLchost="******";
//$userIDLchost ="****";
//$passwordLchost="*****";

//NSM test DB : serveur sur lequel se situe la base de donnée NSM R11 préprod
if(!isset($bdd)){
$bdd=NULL;
}
if(!isset($attribute)){
$attribute=NULL;
}
//$serverNSM="******";
//$bdNSM="NSMADMIN"; // user admin NSM base de donnée compte admin de l'enveloppe/instance
//$userIDNSM ="*****"; // User admin NSM compte admin de la base de donnée
//$passwordNSM="******"; // Mdp


// On se connecte à SQLServer, et l'on trie les résultats par 50 suivant la page demandée


//if(page==1){
$req = "SELECT * FROM Unmanage_Table ";
// }elseif (page==2){
// $req = "SELECT * FROM Unmanage_Table LIMIT 50,100";
// }elseif (page==3){
// $req = "SELECT * FROM Unmanage_Table LIMIT 100, 150";
// }elseif (page==4){
// $req = "SELECT * FROM Unmanage_Table LIMIT 150, 200";
// }elseif (page==5){
// $req = "SELECT * FROM Unmanage_Table LIMIT 200, 250";
// }elseif (page==6){
// $req = "SELECT * FROM Unmanage_Table LIMIT 250, 300";
// }elseif (page==7){
// $req = "SELECT * FROM Unmanage_Table LIMIT 300, 350";
// }elseif (page==8){
// $req = "SELECT * FROM Unmanage_Table LIMIT 350, 400";
// }elseif (page==9){
// $req = "SELECT * FROM Unmanage_Table LIMIT 400, 450";
// }elseif (page==10){
// $req = "SELECT * FROM Unmanage_Table LIMIT 450, 500";
// }elseif (page==11){
// $req = "SELECT * FROM Unmanage_Table LIMIT 500, 550";
// }elseif (page==12){
// $req = "SELECT * FROM Unmanage_Table LIMIT 550, 600";
// }elseif (page==13){
// $req = "SELECT * FROM Unmanage_Table LIMIT 600, 650";
// }elseif (page==14){
// $req = "SELECT * FROM Unmanage_Table LIMIT 650, 700";
// }elseif (page==15){
// $req = "SELECT * FROM Unmanage_Table LIMIT 700, 750";
// }


// On se connecte à SQLServer

try {
$bdd = new PDO('mssql:host=DVATFSUP01\SDVSUP1;dbname=Unmanage', 'sa', 'catherin1');
$bdd-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// on exécute la requête
$reponse = $bdd->query($req);
// on récupère le nombre d'éléments à afficher
$nb_total = $bdd->query("SELECT O.name AS Table_Name, I.rows AS Rows_Count FROM sys.sysobjects AS O INNER JOIN sys.sysindexes AS I ON O.id = I.id WHERE (O.xtype = 'U')");

} catch(PDOException $pdoE) {
echo '<br>ERREUR PDO:<br>'.$pdoE -> getMessage();
} catch(Exception $e) {
echo '<br>AUTRE ERREUR:<br>'.$e -> getMessage();
}


// on teste si ce nombre de vaut pas 0
?>
<div id="body" >

<table id="myTable" class="tablesorter" >
<thead>
<tr>
<th><strong>Nom du serveur</strong></th>
<th>Categorie de l\'incident</th>
<th>Duree de l'incident</th>
<th>Numéro d'incident</th>
<th>Commentaire</th>
<th>Utilisateur</th>
<th>Effectué le</th>
<th>Statut</th>
</tr>
</thead>
<?php

// 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 * FROM (
SELECT TOP ".$_GET['debut']."-- actually bottom five of the top fifteen (seek 10)
*
FROM
(
SELECT TOP ".$nb_affichage_par_page."
*
FROM
Unmanage_Table
ORDER BY
date
) AS T -- why is this necessary?
ORDER BY
T.date DESC
) AS T -- why is this necessary?
ORDER BY T.date -- fix order;";

// on exécute la requête

try {
$req = $bdd->query($sql);
} catch(PDOException $pdoE) {
echo '<br>ERREUR PDO:<br>'.$pdoE -> getMessage();
} catch(Exception $e) {
echo '<br>AUTRE ERREUR:<br>'.$e -> getMessage();
}
// on va scanner tous les tuples un par un
while ($donnees = $reponse->fetch()) {
// on affiches les résultats dans la <table>
echo "<tr>";
echo "<tr>".PHP_EOL;
echo '<th>'.$donnees['server_id'].'</th>'.PHP_EOL;
echo '<th>'.$donnees['cat'].'</th>'.PHP_EOL;
echo '<th>'.$donnees['duree'].'</th>'.PHP_EOL;
echo '<th>'.$donnees['incident_id'].'</th>'.PHP_EOL;
echo '<th>'.$donnees['motif'].'</th>'.PHP_EOL;
echo '<th>'.$donnees['utilisateur_id'].'</th>'.PHP_EOL;
echo '<th>'.$donnees['date'].' à telle heure </th>'.PHP_EOL;
echo '<th>'.$donnees['statut'].'</th>'.PHP_EOL;
echo "</tr>".PHP_EOL; //pour la lisibilite du source généré ;-)
}
// on libère l'espace mémoire alloué pour cette requête
$reponse->closeCursor();

// on libère l'espace mémoire alloué pour cette requête
// mysql_free_result ($req);
echo '</table><br />';

// on affiche enfin notre barre
echo '<span class="gras">'.barre_navigation($nb_total, $nb_affichage_par_page, $_GET['debut'], 3).'</span>';

// on libère l'espace mémoire alloué pour cette requête
//mysql_free_result ($resultat);
// on ferme la connexion à la base de données.
//mysql_close ();
echo '</table><br />'; ?>


les lignes 37,101 et 102 sont les suivantes :
37:
$nb_pages_total = ceil($nb_total/$nb_affichage_par_page);

101 à 105 :
$fin = ($nb_total - ($nb_total % $nb_affichage_par_page));
if (($nb_total % $nb_affichage_par_page) == 0) {
$fin = $fin - $nb_affichage_par_page;
}

Voila, vu que je ne suis pas l'auteur de ce code, je n'arrive pas à en comprendre toute ses subtilitées, y compris les erreurs que me sort IE6.

Merci pour votre aide :)
LA GLOBULE
le 16/11/2010 à 12:09
LA GLOBULE
Déjà, query de PDO ne retourne pas le nombre d'éléments de la requete SQL, mais un objet de type PDOStatement.
Par conséquent, tu peux pas faire ce que tu fais ligne 182.

Et sinon, tu as complétement modifié le comment faire, et ton code n'a plus rien de logique, à savoir que ton code ne respecte pas du tout le concept basique de la pagination.
Il faut vraiment que tu relises le comment faire pour tout comprendre.

Le principe est le suivant :
- une première requête qui compte le nombre d'éléments total que tu auras à paginer (dans ton code, je ne vois aucun select count(*) ou bien la récupération du nombre d'éléments via une méthode de PDO)
- a partir de la, tu connais ton nombre de page (grâce au nombre d'éléments par page que tu auras défini)
- ensuite, ben en fonction de la page courante, tu modifies ta requetes de selection des éléments via des LIMIT sql (dans ton code, je ne vois aucune LIMIT sql)
docfunky
le 16/11/2010 à 13:58
docfunky
Okay, mais j'ai du mal à l'adapter à sql server et les requètes par objet ...
en tout cas tu me dis donc que la, en continuant de la sorte je ne suis pas près d'obtenir un truc qui marche et qu'il vaut mieux recommencer ?
moogli
le 18/11/2010 à 11:31
moogli
a priori ce que tu doit faire c'est adapter pour selver de µsoft ?

si oui tu n'a pas beaucoup à toucher au php.
ce qu'il faut faire
- prendre le script d'origine
- Insérer les tables et des valeurs dans une base de sql serveur (tu peut pour cela utiliser studio express ils ont fait un outils sympa pour le coup).
- lorsque les tables sont correct il va falloir toucher le code php pour utiliser le serveur sql et non mysql. La pour le principe il suffit de changer les mysql_* en mssql_* (par exemple de mysql_connect en mssql_connect) => la doc des focntion ms sql
-lorsque le script fonction c'est bon :)

Pour ce qui est de l'adaptation à PDO c'est un peu la même gymnastique avec le fait que tu n'a pas de fonction spécifique.
tuto PDO

quoi qu'il en soit il ne faut pas toucher au fond, juste la forme, c'est à dire les query, les while associer à un mysql_fetch_* un peut dans le while mais c'est tout !

@+
Il en faut peu pour être heureux !!!!!
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours