Bonjour,
[Tutoriel PHP : Développer un site : Jour 43, les routes]
Ma base de données est PostgreSQL pour ce tutoriel.
24:38 - Grafikart nous fait remarquer que lorsqu'il clique sur 1 il arrive sur l'article 2, il nous propose de faire ceci :
$d'posts'] = $this->Post->find(array(
'conditions' => $conditions,
// rajouter le OFFSET pour PostgreSQL
'limit' => ($perPage * ($this->request->page-1)) . ' OFFSET ' . $perPage
));
dans le fichier Model.php, j'ai ceci :
if(isset($req'limit'])) {
$sql .= ' LIMIT '.$req'limit'];
}
Dans le navigateur le contenu de l'article 1 ne s'affiche pas seul les boutons 1 et 2 s'affiche, en cliquant sur 1 rien ne s'affiche et sur 2 l'article 2 s'affiche.
Je tourne en rond et je ne comprends pas pourquoi je n'obtiens pas le résultat escompté.
Merci d'avance.
Sophonie.
Bonsoir,
essaye ceci dans le PostController.php
<?php
class PostsController extends Controller {
function index() {
$perPage = 1;
$this->loadModel('Post');
$condition = array('online' => 1, 'type' => 'post');
$d'post'] = $this->Post->find(array(
'conditions' => $condition,
'limit' => ($perPage * ($this->request->page - 1)).','.$perPage
));
$d'total'] = $this->Post->findCount($condition);
$d'page'] = ceil($d'total'] / $perpage);
$this->set($d);
}
function view($id) {
$this->loadModel('Post');
$d'page'] = $this->Post->findFirst(array(
'conditions' => array('online' => 1, 'id' => $id, 'type' => 'post')
));
if(empty($d'page'])) {
$this->e404('Page introuvable');
}
$this->set($d);
}
}
?>
L'Offset peut être remplacé par une ',' même avec un PostgreSQL si j'ai bien lu sur le net
Je te confirme que OFFSET ne peut pas être remplacé par la ',' voici le message d'erreur que j'obtiens :
ERROR: LIMIT #,# syntax is not supported at character 61
HINT: Use separate LIMIT and OFFSET clauses.
STATEMENT: SELECT * FROM posts as Post WHERE online=1 AND type='post' LIMIT 1 , 1
Le problème est résolu en faisant ceci :
'Essayes d'inverser l'ordre de la limite le $perPage en premier et la multiplication après.'
[Dans le cas de figure de PostgreSQL]
Avec OFFSET on ne peut pas procéder comme avec la ',' de MySQL.
Le LIMIT récupère le nombre de lignes donc automatiquement
$perPage
puisque l'on veut qu'un seul enregistrement tandis que le OFFSET indique de passer ce nombre de lignes ... mais à partir du résultat stocké dans
$perPage*($this->request->page - 1)
Merci pour ta réponse ... mais ce que tu me proposes n'est pas réalisable dans mon cas de figure.
Dans la classe PostsController je suis obligé d'utiliser ceci :
'limit' => ($perPage * ($this->request->page)) . ' OFFSET ' . $perPage
au lieu de cela :
limit' => ($perPage * ($this->request->page - 1)).','.$perPage
car :
1°) j'utilise PostgreSQL donc je dois utiliser un OFFSET après un LIMIT et pas une virgule comme avec MySQL
2°) si je mets page-1 j'ai les deux boutons mais l'article 1 n'apparait pas.
En faisant ce que tu me proposes, j'obtiens les deux boutons de la pagination mais l'article 1 n'apparait pas quand je clique sur 1.
Ce que tu lui proposes fonctionnera pas F0rZ3r0 x) . Tu lui proposes en gros de mettre comme limite 10,10 si il décide de mettre 10 article mais tu prends pas en compte la page actuelle.
L'Offset peut être remplacé par une ',' même avec un PostgreSQL si j'ai bien lu sur le net tout comme MySQL supporte désormais l'OFFSET.
Essayes d'inverser l'ordre de la limite le $perPage en premier et la multiplication après.
Montres nous vers quoi pointes tes paginations et le .htaccess si tu l'utilises pour rediriger l'url.
limit' => ($perPage * ($this->request->page - 1)).' offset '.$perPage
SELECT * FROM ma_table
LIMIT 10 OFFSET 10
'limit' => ($perPage * ($this->request->page)).' OFFSET '.$perPage
Je vais reproduire le tutoriel et installer PostgreSQL pour voir car la deux tête je m'en sort pas ^^
Merci pour vos réponses, je ne suis pas chez moi mais dès que je rentre je vérifie tout cela et je vous tiens au courant.
Ok donc c'est bien l'inversion qui a permis ça ? J'avais vu que l'OFFSET fonctionnait différemment de la virgule et que dans PostgreSQL comme MYSQL les deux étaient compatibles bon après je pense que c'est une question de version mais je pense tout de même que tu as la dernière à jour.