pagination

Eléphant du PHP | 119 Messages

26 janv. 2011, 22:05

bonjour, j'essaie de faire une pagination afin de limiter le nombres d'articles postés par page.
mon soucis est que les articles postés ne son visible que si vous etes amis avec la personnes qui a posté.

ma fonction get pour l'affichage des articles :
function get_news() {
		 	$answer = true;
		 	$news = array();			
			$nb_articles = 25;			
			$begin = 0;
                        $nb_articles = ceil($news/$nb_articles);			
			$first_news_id = 0;
			$last_news_id = $this->last_news_id;
- dans cette partie ==> $nb_articles = ceil($news/$nb_articles) je ne suis pas sur de cette variable

donc la j'ai bien 25 article sur la page, mais j'aimerais avoir un lien en bas de celle ci pour voir les suivants.
le soucis de ma table c'est que tout les articles se trouvent dans le meme champs.

voici ma requete :
switch ($this->type) {
				case 'MAIN' : {
					// Main Wall
				
					if ($this->option != 'more') {
						if ($this->filter == 'none') {
							// Get the last news
							$sel_req = "SELECT id FROM `".$this->config['bdd_table']
								."news` WHERE (`id` > ".$this->last_news_id.") AND
								(
								  (
									(`type` = 'WALL') 
									AND 
									news_id IN (SELECT id from `".$this->config['bdd_table']."wall` 
										WHERE ( (`user_id` = '".$this->owner_id."') OR user_id IN 
										(SELECT friend_id FROM `".$this->config['bdd_table']."friends` 
										         WHERE `user_id`='".$this->owner_id."'))
												 AND ( (`sender_id` = '".$this->owner_id."') OR `sender_id` in 
												 (SELECT friend_id FROM `".$this->config['bdd_table']."friends`
 												  WHERE `user_id`='".$this->owner_id."'))
												)
									)
								
								   OR 
								( 
									(`type` = 'STATUTE') 
									AND (`user_id` in (SELECT friend_id FROM `".$this->config['bdd_table']
										."friends` WHERE `user_id`='".$this->owner_id."')
									OR (`user_id`='".$this->owner_id."') )
								)
							)
						ORDER BY date DESC limit ".$begin.",".$nb_articles.";";	 
				
						} 
pour la requete j'ai essayé :
switch ($this->type) {
				case 'MAIN' : {
					// Main Wall
				
					if ($this->option != 'more') {
						if ($this->filter == 'none') {
							// Get the last news
							$sel_req = "SELECT id FROM `".$this->config['bdd_table']
								."news` WHERE (`id` > ".$this->last_news_id.") AND
								(
								  (
									(`type` = 'WALL') 
									AND 
									news_id IN (SELECT id from `".$this->config['bdd_table']."wall` 
										WHERE ( (`user_id` = '".$this->owner_id."') OR user_id IN 
										(SELECT friend_id FROM `".$this->config['bdd_table']."friends` 
										         WHERE `user_id`='".$this->owner_id."'))
												 AND ( (`sender_id` = '".$this->owner_id."') OR `sender_id` in 
												 (SELECT friend_id FROM `".$this->config['bdd_table']."friends`
 												  WHERE `user_id`='".$this->owner_id."'))
												)
									)
								
								   OR 
								( 
									(`type` = 'STATUTE') 
									AND (`user_id` in (SELECT friend_id FROM `".$this->config['bdd_table']
										."friends` WHERE `user_id`='".$this->owner_id."')
									OR (`user_id`='".$this->owner_id."') )
								)
							)
                                                              order by date desc limit ".(($begin-0)*$nb_articles).",".$nb_articles.";";
ensuite la ligne :
for ($i=0;$i<=$nb_articles;$i++) {
echo "$i";
}
malheureusement sans resultat car ma page se vide de tout articles quand je place comme cela.

merci de votre aide
Modifié en dernier par olivxii le 26 janv. 2011, 22:26, modifié 1 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

26 janv. 2011, 22:22

salut,

sur le principe c'est la deuxième solution mais tu y met le dernier id utilisé (id > dernierID


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 119 Messages

26 janv. 2011, 22:31

en faite ce qui me gene c'est ici :

$nb_articles = ceil($news/$nb_articles);

$news je ne suis pas sur car en faite cette page est celle des class php du mur et non l'affichage des news.

j'ai vu sur un tuto qu'il fallais le nombre total de messages postés et le divisé par le nombres de message par page afin d'obtenir les resultat de 25 par page.

mon soucis c'est que ma requete ne recupere que les message posté par les membre qui sont amis avec moi donc pas le total des messages postés, la est la difficulté.

comment s'avoir quelle est cette variable, moi j'ai mis $news mais je ne pense pas que cela soit cela.

sachant que le nombre de messages posté par mes amis est compris dans la variable $nb_articles

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

26 janv. 2011, 22:57

heu wé faut utiliser le notre mw d'article présent dans la table, donc la faut que tu te débrouille avoir cette info (select count..).


pour le limte j'ai mis une anerie => select truc from table where id > dernierId limit nbarticle :)

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 119 Messages

26 janv. 2011, 23:56

l'id est recuperée, ma requete est sous cette forme :
$sel_req = "SELECT id FROM `".$this->config['bdd_table']."news`
									WHERE ( (`id` > ".$this->last_news_id.") AND
									((`user_id` IN (SELECT friend_id FROM `".$this->config['bdd_table']."friends` 
									WHERE `user_id`='".$this->owner_id."'))
									OR (`user_id`='".$this->owner_id."')) AND (`type`='".$this->filter."'))
									ORDER BY date DESC LIMIT ".$begin.",".$nb_articles.";"; 
en fait c'est un peut plus complexe que je ne pensais .....

ce que je pensais c'etais si $nb_articles = 25 afficher les 25 suivant mais alors la je patauge complet ...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

27 janv. 2011, 00:07

heu je suis un peu perplexe, tu veux faire une pagination sur les news ?

quand je vois
$answer = true;
$news = array();
$nb_articles = 25;
$begin = 0;
$nb_articles = ceil($news/$nb_articles);
$first_news_id = 0;
$last_news_id = $this->last_news_id;

tu fais une division d'un tableau par un nombre c'est pas bon ça ;)

ce code c'est un truc que tu a fait ou bien un reprise d'un code ?

Tu a le principe de la pagination après, c'est pas clair ton truc, tu parle de news, d'article et c'est le drame :)


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 119 Messages

27 janv. 2011, 00:19

en faite il s'agit du script de devolia afin de créer un réseau social.

il fonctionne a merveille mais je voudrais juste y rajouter des fonctions

en faite tu a un mur ou les articles de tes amis ou autre se dépose comme sur facebook et un mur de profil ou il n'y a que les tiens.

la la limite est de 25 mais je voudrais que l'on puisse en afficher plus si on le désire avec un lien en bas de la page.

le soucis c'est qu'il y a 12 pages et 15 templates sans compté les css et js php différentes qui on chacune des fonctions différentes.

j'ai vu cette ligne qui normalement devrais "Obtenez des nouvelles plus anciennes avec filtre":
else {
							// Get older news with filter
							$sel_req = "SELECT id FROM `".$this->config['bdd_table']."news`
									WHERE ( (`id` > ".$this->last_news_id.") AND
									((`user_id` IN (SELECT friend_id FROM `".$this->config['bdd_table']."friends` 
									WHERE `user_id`='".$this->owner_id."'))
									OR (`user_id`='".$this->owner_id."')) AND (`type`='".$this->filter."'))
									ORDER BY date DESC LIMIT ".$begin.",".$nb_articles.";"; 
mais comment les afficher car je n'est pas d'autres requetes que celle-ci ...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

27 janv. 2011, 00:39

dans ce cas le plus simple pour toi est de demander de l'aider aux dev de l'appli :)


Dans ce que je vois il faut jouer avec $begin et $nb_article !

$begin est le dernier $id utilisé, en fait un offset
LIMIT accepte un ou deux arguments numériques. Ces arguments doivent être des entiers constants.

Avec un argument, la valeur spécifie le nombre de lignes à retourner depuis le début du jeu de résultat. Si deux arguments sont donnés, le premier indique le décalage du premier enregistrement à retourner, le second donne le nombre maximum d'enregistrement à retourner. Le décalage du premier enregistrement est 0 (pas 1) :
regarde le tuto sur la pagination c'est exactement la même chose.

tu doit gérer le $begin.

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 119 Messages

27 janv. 2011, 01:17

oui ca je le sait j'arrete pas de visualiser des tuto mais a chaque fois je vois ceci afin de compter le nombre de messages :
$retour_total=mysql_query('SELECT COUNT(*) AS bdd FROM champs'); 
$donnees_total=mysql_fetch_assoc($retour_total); 
$total=$donnees_total['total']; 

devlop78
Invité n'ayant pas de compte PHPfrance

27 janv. 2011, 02:07

oui ca je le sait j'arrete pas de visualiser des tuto mais a chaque fois je vois ceci afin de compter le nombre de messages :
$retour_total=mysql_query('SELECT COUNT(*) AS bdd FROM champs'); 
$donnees_total=mysql_fetch_assoc($retour_total); 
$total=$donnees_total['total']; 
Là tu vas obtenir null.
$total=$donnees_total['bdd'];
sera mieux

Eléphant du PHP | 119 Messages

27 janv. 2011, 02:10

ce n'etait qu'un exemple non adapté a ma requête ..

pour etre plus claire voici le code :
/**
		 * Collect all the last news of the wall
		 */
		 
		 function get_news() {
		 	$answer = true;
		 	$news = array();			
			$nb_articles = 50;			
			$begin = 0;			
			$first_news_id = 0;
			$last_news_id = $this->last_news_id;
			
			switch ($this->type) {
				case 'MAIN' : {
					// Main Wall
				
					if ($this->option != 'more') {
						if ($this->filter == 'none') {
							// Get the last news
							$sel_req = "SELECT id FROM `".$this->config['bdd_table']
								."news` WHERE (`id` > ".$this->last_news_id.") AND
								(
								  (
									(`type` = 'WALL') 
									AND 
									news_id IN (SELECT id from `".$this->config['bdd_table']."wall` 
										WHERE ( (`user_id` = '".$this->owner_id."') OR user_id IN 
										(SELECT friend_id FROM `".$this->config['bdd_table']."friends` 
										         WHERE `user_id`='".$this->owner_id."'))
												 AND ( (`sender_id` = '".$this->owner_id."') OR `sender_id` in 
												 (SELECT friend_id FROM `".$this->config['bdd_table']."friends`
 												  WHERE `user_id`='".$this->owner_id."'))
												)
									)
								
								   OR 
								( 
									(`type` = 'STATUTE') 
									AND (`user_id` in (SELECT friend_id FROM `".$this->config['bdd_table']
										."friends` WHERE `user_id`='".$this->owner_id."')
									OR (`user_id`='".$this->owner_id."') )
								)
							)
						ORDER BY date DESC limit ".$begin.",".$nb_articles.";";	 
				
						} 
						
						else {
							// Get the last news with filter
							$sel_req = "SELECT id from `".$this->config['bdd_table']."news` 
								WHERE ( (`id` > ".$this->last_news_id.") AND 
									((user_id IN (SELECT friend_id FROM `"
									.$this->config['bdd_table']."friends` WHERE 
									`user_id`='".$this->owner_id."'))
									OR (`user_id`='".$this->owner_id."')) AND (`type`='".$this->filter."'))
									ORDER BY date DESC limit ".$begin.",".$nb_articles.";";									
																						
						}
						
						}
					
					
					else {
						// Get older news
						if ($filter == 'none') {
							$sel_req = "SELECT id from `".$this->config['bdd_table']."news` 
								WHERE (`id` < ".$this->last_news_id.") 
								AND								
								(
								  (
									(`type` = 'WALL') 
									AND 
									news_id IN (select id from `".$this->config['bdd_table']."wall` 
										WHERE ( (`user_id` = '".$this->owner_id."') OR user_id IN
										(SELECT friend_id FROM `".$this->config['bdd_table']."friends`
										 	WHERE `user_id`='".$this->owner_id."'))
											AND ( (`sender_id = '".$this->owner_id."') OR sender_id in 
											(SELECT friend_id FROM `".$this->config['bdd_table']."friends`
											 WHERE `user_id`='".$this->owner_id."'))
											)
									)
									OR 
									( 
										(`type` = 'STATUTE') 
										AND (user_id IN (SELECT friend_id 
										FROM `".$this->config['bdd_table']."friends` 
										WHERE `user_id`='".$this->owner_id."')
										OR (`user_id`='".$this->owner_id."') )
									)
								)
							ORDER BY date DESC limit ".$begin.",".$nb_articles.";";
						
						} else {
							// Get older news with filter
							$sel_req = "SELECT id FROM `".$this->config['bdd_table']."news`
									WHERE ( (`id` > ".$this->last_news_id.") AND
									((`user_id` IN (SELECT friend_id FROM `".$this->config['bdd_table']."friends` 
									WHERE `user_id`='".$this->owner_id."'))
									OR (`user_id`='".$this->owner_id."')) AND (`type`='".$this->filter."'))
									ORDER BY date DESC LIMIT ".$begin.",".$nb_articles.";"; 
							
						}
					}
					
					break;
				}
en faite je regle uniquement le nombre d'articles sur une page ... je souhaite pouvoir en afficher plus voir la totalité mais pas sur cette meme page, un petit lien en bas qui dit "voir la suite"

Eléphant du PHP | 119 Messages

29 janv. 2011, 03:28