2016-04-03 44 views
1

Ich arbeite an einem Web-Projekt in PHP, die potenziell viele Benutzer haben könnte. Aus administrativer Sicht versuche ich, eine Tabelle mit Informationen über jeden Benutzer anzuzeigen, und da die Tabelle der Benutzer extrem groß werden kann, möchte ich die Seitennummerierung verwenden.wie man Paginierung erreicht HTML PHP-MySQL

  • Auf dem Backend, habe ich einen Dienst, der eine Grenze und einen Offset-Parameter erwartet, der verwendet wird, um die Datenbank für Datensätze innerhalb des geeigneten Bereichs abzufragen. Der Dienst gibt die Gesamtzahl der Datensätze in der Tabelle, zusammen mit den Aufzeichnungen die Abfrage passenden

    public static function getUsersInfo($limit = 50, $offset=1) 
    { 
        $users_count = Users::count(
          array(
           "column" => "user_id" 
          ) 
         ); 
    
        $users_info = array(); 
        $users = Users::query() 
         ->order('created_at') 
         ->limit($limit, $offset) 
         ->execute() 
         ->toArray(); 
    
        foreach ($users as $index => $user) { 
         $users_info[$index]['user_id'] = $user['user_id']; 
         $users_info[$index]['name'] = $user['first_name'] . " " . $user['last_name']; 
         $users_info[$index] ['phone'] = $user['phone']; 
         $users_info[$index] ['profile_image_url'] = $user['profile_image_url']; 
        } 
    
        $results = array(
         'users_count' => $users_count, 
         'users_info' => $users_info 
        ); 
        return !empty($results) ? $results : false; 
    } 
    
  • auf dem Frontend, was ich möchte im Idealfall erreichen, hat die Navigation am unteren Ende der Tabelle angezeigt , mit den typischen vorherigen, nächsten Tasten und zusätzlich ein paar Zahlen, die dem Benutzer erlauben, schnell zu einer gewünschten Seite zu navigieren, wenn die Seitenzahl angezeigt wird. Dies ist, was ich bisher für den UsersController ohne Paginierung habe.

    class UsersController extends ControllerBase 
    { 
        public function indexAction() 
        { 
         $usersObject = new Users(); 
         $data = $usersObject->getUsers(); 
    
         if ($data['status'] == Constants::SUCCESS) { 
          $users = $data['data']['users_info']; 
          $users_count = $data['data']['users_count'];  
          $this->view->setVar('users', $users); 
         } 
    
         echo $this->view->render('admin/users');  
        } 
    
        public function getUsersAction() 
        { 
         echo Pagination::create_links(15, 5, 1); 
        } 
    } 
    

Ich habe keine Arbeit Paginierung noch, aber ich war eine gute Art und Weise zu denken wäre zu gehen, um eine Pagination Bibliothek mit einer create_links Funktion zu erstellen, die die

  • total_count nehmen der Datensätze in der Datenbank, so weiß ich, wie viele Seiten erwartet werden
  • limit so weiß ich, wie viele Datensätze zu sammeln
  • cur_page damit ich weiß, wo aus

Abrufen beginnen also, wenn diese Funktion mit den richtigen Parametern aufgerufen wird, würde es den HTML-Code erzeugen, um die Paginierung zu erreichen, und das wiederum kann dann zu der Ansicht geführt werden und angezeigt.

Ich habe das vorher noch nie gemacht, aber von den Forschungen, die ich bisher gemacht habe, scheint es, dass dies ein guter Weg ist, um es zu erreichen. Irgendwelche Ratschläge, Vorschläge oder irgendetwas wirklich in Bezug auf dieses würde sehr geschätzt werden.

+0

google: http://code.tutsplus.com/tutorials/how-to-paginate-data-with-php--net-2928 –

+0

Zeigen Sie uns etwas Code. – sensation

Antwort

0

Es sieht so aus, als ob Sie ein maßgeschneidertes MVC-ish-Framework verwenden. Zwar ist es nicht Ihre Frage nicht beantworten genau ich ein paar Punkte haben:

  1. Wenn Sie viele Benutzer suchen, Paginieren die wenigsten Ihrer Probleme. Sie müssen überlegen, wie die Datenbank indexiert wird, wie die Ergebnisse zurückgegeben werden und vieles mehr.
  2. Ohne zu verstehen, die zugrundeliegende Datenbank abstrakte Schicht/Treiber Sie verwenden, ist es schwierig zu bestimmen, ob Ihre ->limit($limit, $offset) Zeile ordnungsgemäß funktioniert. Der Offset sollte wahrscheinlich auf 0 gesetzt werden, aber ohne den Code zu kennen, ist es schwer zu sagen.
  3. Der ternäre Operator in Ihrer ersten Methode (return !empty($results) ? $results : false;) ist zur Zeit wertlos, weil die Anweisung davor bedeutet, dass die Variable immer ein Array sein wird.
  4. Vermeiden Sie Echo-Anweisungen in Controllern. Sie sollten zu einer Templating-Engine zurückkehren, um eine Ansicht auszugeben.
  5. Sie Users Klasse wäre besser User benannt, da das MVC-Framework impliziert, dass das "Modell" eine singuläre Einheit ist.

Während es keine allgemeine Regel ist, die meist Paginierung Systeme, die ich verwendet habe auf einem Null-Index-System gearbeitet (Seite 1 Seite 0), so die Berechnung des Grenzbereich ist einfach:

$total_records = 1000; 
$max_records = 20; 
$current_page = 0; 

$offset = $max_records * $current_page; 

$sql = "SELECT * FROM foo LIMIT $offset, $max_records"; 
Verwandte Themen