colonnes dynamiques

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : colonnes dynamiques

par cmoi » 08 juin 2009, 08:00

Merci pour ce tuto qui me permet enfin de conclure !

Voici le nouveau code :
<?php
//=========================================
// includes du fichier fonctions
//=========================================
require 'fonctions.php';

$nombre = 4;  // on va afficher 4 résultats par page.
if (!isset($limite)) $limite = 0; // si on arrive sur la page pour la première fois 
               // on met limite à 0.
    
$path_parts = pathinfo($_SERVER['PHP_SELF']);
$page = $path_parts['basename'];

// requête SQL qui compte le nombre total d'enregistrements dans la table et qui
//récupère tous les enregistrements
$select = 'SELECT count(id) FROM test';
$result = mysql_query($select,$link)  or die ('Erreur : '.mysql_error() );
$row = mysql_fetch_row($result);
$total = $row[0]; 
//=========================================
// vérifier la validité de notre variable 
// $limite;
//=========================================
$verifLimite= verifLimite($limite,$total,$nombre);
// si la limite passée n'est pas valide on la remet à zéro
if(!$verifLimite)  {
    $limite = 0;
}
//=========================================
// requête SQL qui ne prend que le nombre 
// d'enregistrement necessaire à l'affichage.
//=========================================
$select = 'select * FROM test WHERE validation=1 ORDER BY id DESC limit '.$limite.','.$nombre;
$result = mysql_query($select,$link)  or die ('Erreur : '.mysql_error() );
$nbCols = 2; // nombre de colonnes du tableau  
$cpt = 0;
$rs = mysql_query($select); 
$limitesuivante = $limite + $nombre;
$limiteprecedente = $limite - $nombre;
// si on a récupéré un résultat on l'affiche.
    // début du tableau
    echo '<table>';
		echo '<tr>';
		echo '</tr>';
    // lecture et affichage des résultats sur 2 colonnes, 1 résultat par ligne.    
	while ($row=mysql_fetch_assoc($rs)) { // parcours des résultats  

    // début d'une ligne  
    if ($cpt%$nbCols==0)
        echo '<tr>';
        echo '<td align="center"><span class="style1"><strong>'.$row['nom'].'</strong><br/>'.$row['presentation'].'<br/><a href="http://'.$row['photo'].'" target="_blank"><img src="http://'.$row['photo'].'" width="220" border="0"/></a><br/>'.$row['suite'].'<br/>'.$row['prix'].'<br/>'.$row['paypal'].'</span></td>';
		if ($cpt%$nbCols==($nbCols-1))
        echo '</tr>';
		$cpt++; // on incrémente le compteur pour savoir où on en est 
}  

// Au cas où ... 
if ($cpt!=0 && $cpt%$nbCols!=0) { // S'il n'y a pas eu assez de cellules dans la boucle pour finir la ligne ... 
    echo '<td colspan="'.($nbCols - ($cpt%$nbCols) ).'">&nbsp;</td>'; // ... on complète avec une cellule vide de la bonne taille... 
    echo '</tr>'; // ... et on ferme la ligne 
} 

    echo '</table>';
    // fin du tableau.

// on libère le résultat
mysql_free_result($result);
//récupération de $limite
    if(isset($_GET['limite'])) 
        $limite=$_GET['limite'];    else   $limite=0;

function verifLimite($limite,$total,$nombre) {
    // je verifie si limite est un nombre.
    if(is_numeric($limite)) {
        
// si $limite est entre 0 et $total, $limite est ok
        // sinon $limite n'est pas valide.
        if(($limite >=0) && ($limite <= $total) && (($limite%$nombre)==0)) {
            // j'assigne 1 à $valide si $limite est entre 0 et $max
            $valide = 1;
        }    
        else {
            // sinon j'assigne 0 à $valide
            $valide = 0;
        }
    }
    else {
            // si $limite n'est pas numérique j'assigne 0 à $valide
            $valide = 0;
    }
// je renvois $valide
return $valide;
}

if($limite != 0) {
    echo '<a href="'.$page.'?limite='.$limiteprecedente.'">Page précédente</a>';
}
if($limitesuivante < $total) {
    echo '<a href="'.$page.'?limite='.$limitesuivante.'"> | Page Suivante</a>';
}

?>

par AB » 07 juin 2009, 22:00

Si tu n'arrive pas à mettre en place le code de charabia tu peux regarder ce tuto http://www.phpfrance.com/forums/voir_sujet-241626.php

par cmoi » 07 juin 2009, 10:34

j'ai fait évoluer mon code ainsi
<?php
//=========================================
// includes du fichier fonctions
//=========================================
require 'fonctions.php';

$nombre = 4;  // on va afficher 4 résultats par page.
if (!isset($limite)) $limite = 0; // si on arrive sur la page pour la première fois 
               // on met limite à 0.
    
$path_parts = pathinfo($_SERVER['PHP_SELF']);
$page = $path_parts['basename'];

// requête SQL qui compte le nombre total d'enregistrements dans la table et qui
//récupère tous les enregistrements
$select = 'SELECT count(id) FROM baskets';
$result = mysql_query($select,$link)  or die ('Erreur : '.mysql_error() );
$row = mysql_fetch_row($result);
$total = $row[0];
//=========================================
// vérifier la validité de notre variable 
// $limite;
//=========================================
$verifLimite= verifLimite($limite,$total,$nombre);
// si la limite passée n'est pas valide on la remet à zéro
if(!$verifLimite)  {
    $limite = 0;
}
//=========================================
// requête SQL qui ne prend que le nombre 
// d'enregistrement necessaire à l'affichage.
//=========================================
$select = 'select * FROM baskets WHERE validation=1 ORDER BY id ASC limit '.$limite.','.$nombre;
$result = mysql_query($select,$link)  or die ('Erreur : '.mysql_error() );

$limitesuivante = $limite + $nombre;
$limiteprecedente = $limite - $nombre;
// si on a récupéré un résultat on l'affiche.
if($total) {
    // début du tableau
    echo '<table>'."\n";
		echo '<tr>';
		echo '</tr>'."\n";
    // lecture et affichage des résultats sur 2 colonnes, 1 résultat par ligne.    
    while($row = mysql_fetch_array($result)) {
        echo '<tr>';
        echo '<td align="center"><span class="style1"><strong>'.$row['nom'].'</strong><br/>'.$row['presentation'].'<br/><a href="http://'.$row['photo'].'" target="_blank"><img src="http://'.$row['photo'].'" width="220" border="0"/></a><br/>'.$row['suite'].'<br/>'.$row['prix'].'<br/>'.$row['paypal'].'</span></td>';
        echo '</tr>'."\n";
    }
    echo '</table>'."\n";
    // fin du tableau.
}
else echo '<span class="style1">'.'Désolé, rien en ce moment !'.'</span>';

// on libère le résultat
mysql_free_result($result);
//récupération de $limite
    if(isset($_GET['limite'])) 
        $limite=$_GET['limite'];    else   $limite=0;

function verifLimite($limite,$total,$nombre) {
    // je verifie si limite est un nombre.
    if(is_numeric($limite)) {
        
// si $limite est entre 0 et $total, $limite est ok
        // sinon $limite n'est pas valide.
        if(($limite >=0) && ($limite <= $total) && (($limite%$nombre)==0)) {
            // j'assigne 1 à $valide si $limite est entre 0 et $max
            $valide = 1;
        }    
        else {
            // sinon j'assigne 0 à $valide
            $valide = 0;
        }
    }
    else {
            // si $limite n'est pas numérique j'assigne 0 à $valide
            $valide = 0;
    }
// je renvois $valide
return $valide;
}

if($limite != 0) {
    echo '<a href="'.$page.'?limite='.$limiteprecedente.'">Page précédente</a>';
}
if($limitesuivante < $total) {
    echo '<a href="'.$page.'?limite='.$limitesuivante.'"> | Page Suivante</a>';
}

?>
($link est défini avant pour la connection).
L'affichage se fait sur 1 colonne au lieu de 2. Evidemment, ce n'est dit nul part que j'en veux 2 ! Mais je le dis comment ?

par charabia » 06 juin 2009, 23:47

Dis mois, tu as encore souvenir de ce bout de code donné en première page ?
<?php
$req = "SELECT * FROM ta_table LIMIT 0,4";
   
  //--- Résultat ---//
  $res = mysql_query($req);
  //met les données dans un tableau
  while($data = mysql_fetch_assoc($res))
  {
  $tablo[]=$data;
  }
  //détermine le nombre de colonnes
  $nbcol=2;

  echo '<table>';
  $nb=count($tablo);
  for($i=0;$i<$nb;$i++){
   
  //les valeurs à afficher
  $valeur1=$tablo[$i]['champ1'];
  $valeur2=$tablo[$i]['champ2'];

  if($i%$nbcol==0)
  echo '<tr>';
  echo '<td>',$valeur1,'<br/>',$valeur2,'</td>';

  if($i%$nbcol==($nbcol-1))
  echo '</tr>';

  }
  echo '</table>';

?> 

par cmoi » 06 juin 2009, 08:59

Finalement, j'ai tout repris en testant au fur et à mesure et presque tout fonctionne, sauf l'affichage en colonnes. J'ai un affichage en ligne. Je tourne en rond sans comprendre.

Qu'est-ce qui cloche là dedans ?
    echo '<table>'."\n";
    // lecture et affichage des résultats sur 2 colonnes, 1 résultat par ligne.    
    while($row = mysql_fetch_array($result)) {
        echo '<tr>';
        echo '<td align="center"><span class="style1"><strong>'.$row['nom'].'</strong></span></td>';
        echo '<td align="center"><span class="style1">'.$row['presentation'].'</span></td>';
        echo '<td align="center"><span class="style1"><a href="http://'.$row['photo'].'" target="_blank"><img src="http://'.$row['photo'].'" width="220" border="0"/></a></span></td>';
        echo '<td align="center"><span class="style1">'.$row['suite'].'</span></td>';
        echo '<td align="center"><span class="style1">'.$row['prix'].'</span></td>';
        echo '<td align="center"><span class="style1">'.$row['paypal'].'</span></td>';
        echo '</tr>'."\n";
    }
    echo '</table>'."\n";

par AB » 05 juin 2009, 00:35

Et puis, ce n'est qu'un détail qui ne change rien à la fonctionnalité du code mais je trouve que c'est souvent plus clair de déclarer des fonctions avant de les utiliser.

par charabia » 04 juin 2009, 21:02

Je me répète :
Ce code t'affiche les résultats sur 2 colonnes. J'ai mis un LIMIT pour que ça n'affiche que 4 comme tu veux. Tu devras donc faire un affichage page par page pour voir le reste (une petite recherche sur google).
Tu as comme mis de côté le code qui affiche sur 2 colonnes. Tu dois combiner les 2.

Maintenant pourquoi l'affichage des liens pour passer aux pages suivantes et précédentes ne marchent pas ?

Tu crées des fonctions mais tu ne les appelles nulle part.

Dans le code du tuto, tu vois que l'appel des fonctions se fait dès le début du code avec un require et qu'elle sont utilisées tout au long du code.

par cmoi » 04 juin 2009, 19:10

j'ai repris tout le code. Ca commence plutôt bien, puisque ma page s'affiche .. presque comme je veux.
<?php
//=========================================
// initialisation des variables 
//=========================================
// on va afficher 4 résultats par page.
$nombre = 4;  
// si limite n'existe pas on l'initialise à zéro
if (!$limite) $limite = 0; 
// on cherche le nom de la page.    
$path_parts = pathinfo($_SERVER['PHP_SELF']);
$page = $path_parts["basename"];

//=========================================    
// requête SQL qui compte le nombre total 
// d'enregistrements dans la table.
//=========================================
$select = 'SELECT * FROM baskets WHERE validation=1 ORDER BY id ASC LIMIT '.$limite.','.$nombre;
$result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
$total = mysql_num_rows($result);
//=========================================    
// si on a récupéré un resultat on l'affiche.
//=========================================
if($total) {
    // début du tableau
    echo '<table>'."\n";
        echo '<tr>';
        echo '<td></td>';
        echo '<td></td>';
        echo '</tr>'."\n";
    while($row = mysql_fetch_array($result)) {
        echo '<tr>';
        echo '<td align="center"><span class="style1"><strong>'.$row['nom'].'</strong></span></td>';
        echo '<td align="center"><span class="style1">'.$row['presentation'].'</span></td>';
        echo '<td align="center"><span class="style1"><a href="http://'.$row['photo'].'" target="_blank"><img src="http://'.$row['photo'].'" width="220" border="0"/></a></span></td>';
        echo '<td align="center"><span class="style1">'.$row['suite'].'</span></td>';
        echo '<td align="center"><span class="style1">'.$row['prix'].'</span></td>';
        echo '<td align="center"><span class="style1">'.$row['paypal'].'</span></td>';
        echo '</tr>'."\n";
    }
    echo '</table>'."\n";
}
else echo 'Pas d\'enregistrements dans cette table...';
mysql_free_result($result);

$limitesuivante = $limite + $nombre;
$limiteprecedente = $limite - $nombre;
if($limite != 0) {
    echo '<a href="'.$page.'?limite='.$limiteprecedente.'">Page précédente</a>';
}
if($limitesuivante < $total) {
    echo '<a href="'.$page.'?limite='.$limitesuivante.'">Page Suivante</a>';
}
//récupération de $limite
    if(isset($_GET['limite'])) 
        $limite=$_GET['limite'];    else   $limite=0;

function verifLimite($limite,$total,$nombre) {
    // je verifie si limite est un nombre.
    if(is_numeric($limite)) {
        
// si $limite est entre 0 et $total, $limite est ok
        // sinon $limite n'est pas valide.
        if(($limite >=0) && ($limite <= $total) && (($limite%$nombre)==0)) {
            // j'assigne 1 à $valide si $limite est entre 0 et $max
            $valide = 1;
        }    
        else {
            // sinon j'assigne 0 à $valide
            $valide = 0;
        }
    }
    else {
            // si $limite n'est pas numérique j'assigne 0 à $valide
            $valide = 0;
    }
// je renvois $valide
return $valide;
}
function affichePages($nb,$page,$total) {
        $nbpages=ceil($total/$nb);
        $numeroPages = 1;
        $compteurPages = 1;
        $limite  = 0;
        echo '<table border = "0" ><tr>'."\n";
        while($numeroPages <= $nbpages) {
        echo '<td ><a href = "'.$page.'?limite='.$limite.'">'.$numeroPages.'</a></td>'."\n";
        $limite = $limite + $nb;
        $numeroPages = $numeroPages + 1;
        $compteurPages = $compteurPages + 1;
            if($compteurPages == 10) {
            $compteurPages = 1;
            echo '<br>'."\n";
            }
        }
        echo '</tr></table>'."\n";
}
?>
Les résultats s'affichent en ligne au lieu d'être en colonne. C'est sûrement tout bête, mais comme il y a cette variable $row, je suis perdu.

Par contre, la fin du code pour passer en page suivante, n'affiche rien. Et je n'y comprends rien !

par charabia » 04 juin 2009, 11:23

Eh non il ne s'agit pas d'un récapitulatif. Une nouvelle bonne relecture est nécessaire je crois bien.
parce que je ne vois pas ce que j'ai pu oublier.
Heu...une petite fonction non ?

par cmoi » 04 juin 2009, 11:17

Après avoir tout lu, et à peu près compris !, sur ce tuto http://www.phpdebutant.org/article84.php,
je me suis basé sur le dernier code que j'ai compris comme être un récapitulatif de tout ce qui est avant.
Sans doute, je me suis trompé, parce que je ne vois pas ce que j'ai pu oublier.

par charabia » 04 juin 2009, 11:11

Tu peux t'y fier, le tuto n'est en aucun cas en cause loin de là. L'erreur vient de ton côté. Je viens de reprendre le tuto qu'on t'a donné, tout marche à merveille.

Tu me demandes si la fonction verifLimite existe. C'est quand même toi qui a le code sous les yeux. Selon l'erreur indiquée, elle n'existe pas. As-tu vérifié dans ton code qu'elle est bien présente ?

par cmoi » 04 juin 2009, 11:07

$verifLimite= verifLimite($limite,$total,$nombre);
d'abord, cela vient du tuto. Si on peut pas si fier ...
Ensuite les variables sont définies avant. Donc qu'est-ce qui n'existe pas ? Est-ce que "verifLimite" n'est pas une fonction qui existe ?

par charabia » 04 juin 2009, 10:54

Quand tu vois une syntaxe que tu n'arrives pas à comprendre, va sur google et fait une recherche ou dans la documentation PHP. C'est très bien expliqué comme tu peux le voir. Surtout ne pas recopier sans comprendre.

Pour la fonction, quand tu vois qu'elle n'est pas définie c'est que...? C'est qu'elle n'existe pas tout simplement.

par cmoi » 04 juin 2009, 10:41

si je comprends bien, il fallait laisser "basename".

Quant à être interpellé .... quelle fonction n'est pas définie ??

Encore une fois, si je comprends l'esprit, je ne parle pas suffisamment la langue pour en comprendre toujours la syntaxe.
J'essaie mais il me manque des bases !!

par charabia » 04 juin 2009, 10:25

Le hic c'est que ce que tu "crois" comprendre n'est pas toujours forcément bon et tu dois creuser par toi-même plus que ça.

Je te renvoie sur la doc : http://fr.php.net/pathinfo

Quant à la fonction, "Call to undefined function" ne t'interpelle pas plus que ça ?