2010-08-27 5 views
1

Je n'arrive fondamentalement pas à faire fonctionner le bit de pagination, je l'ai fait avant de changer ma requête de base de données et maintenant je suis bloqué.Problème de pagination de codeigniter

Mon modèle ressemble:

function get_properties($limit, $offset) { 
    $location = $this->session->userdata('location'); 
    $property_type = $this->session->userdata('property_type'); 
    if($property_type == 0) 
    { 
     $sql = "SELECT * FROM properties "; 
    } 
    // more queries here 
    $sql .= " LIMIT ".$limit.", ".$offset.";"; 
    $query = $this->db->query($sql); 
    if($query->num_rows() > 0) { 
     $this->session->set_userdata('num_rows', $query->num_rows()); 
     return $query->result_array();  
     return FALSE; 
     } 
    } 
} 

et mon contrôleur ressemble à:

function results() { 
    $config['base_url'] = base_url().'/properties/results'; 
    $config['per_page'] = '3'; 
    $data['properties_results'] = $this->properties_model->get_properties($config['per_page'], $this->uri->segment(3)); 
    $config['total_rows'] = $this->session->userdata('num_rows'); 
    $this->pagination->initialize($config); 
    $config['full_tag_open']='<div id="pages">'; 
    $config['full_tag_close']='</div>'; 
    $data['links']=$this->pagination->create_links(); 
    $this->load->view('properties_results',$data); 
} 

s'il vous plaît aider ... son vissage!

+0

Non lié à votre question mais s'il vous plaît soyez conscient que vous pouvez avoir une vulnérabilité d'injection MySQL dans votre code lorsque vous modifiez directement la requête comme ça. Vous devriez utiliser la liaison de paramètres pour cela, CI le supporte. – Ferdy

Répondre

1

La raison pour laquelle cela ne fonctionne pas est que vous n'obtenez jamais le total_rows. Vous obtenez les TOTAL_ROWS par cette requête, mais il a déjà un décalage et une limite:

$sql .= " LIMIT ".$limit.", ".$offset.";"; 
$query = $this->db->query($sql); 

Pour résoudre ce problème, vous devez ajouter une fonction à votre modèle:

function get_all_properties() 
{ 
    return $this->db->get('properties'); 
} 

Ensuite, dans votre contrôleur, au lieu de:

$config['total_rows'] = $this->session->userdata('num_rows'); 

Do:

$config['total_rows'] = $this->properties_model->get_all_properties()->num_rows(); 

Cela devrait corriger votre pagination. A part ça, votre code a des choses étranges. Par exemple. dans get_properties ne sera jamais exécuter. Et pourquoi stockez-vous autant de données dans les sessions? Ce n'est pas nécessaire et pas une bonne idée à mon avis.

+0

C'est ok je l'ai réparé, c'était à voir avec le nombre total de lignes retournées. Les données dans les sessions proviennent d'un formulaire de recherche, comment pourrais-je faire cela pour transmettre des informations de page en page via codeigniter? – Ashley

+0

J'ai écrit un tutoriel sur Cdeigniter Pagination. S'il vous plaît jeter un oeil et donner vos suggestions https://www.cloudways.com/blog/pagination-in-codeigniter/ –