2017-01-09 71 views
7

Używam SQLite3 i próbuję dostosować skrypt Paginator, który znalazłem. Po zmianie tego, co wydaje się być komendami MYSQL, działa, ale nie wyświetla poprawnej ilości elementów i wydaje się różnić od wyników, jakie daje.PHP SQLite3 Paginator oparty na MySQL podając błędy

Ja również otrzymuję następujący błąd, którego nie jestem pewien jak to naprawić:

Wskazówka: Undefined index: Video w katalogu C: \ xampp \ htdocs \ Projects \ index.php na linii 27

Kod używam jest:

Paginator.php

<?php 

class Paginator { 

    private $_conn; 
    private $_limit; 
    private $_page; 
    private $_query; 
    private $_total; 

    public function __construct($conn, $query) { 
     $this->_conn = $conn; 
     $this->_query = $query; 
     $rs= $this->_conn->query($this->_query); 
     $this->_total = count($rs); 
    } 

    public function getData($limit = 10, $page = 1) { 
     $this->_limit = $limit; 
     $this->_page = $page; 

     if ($this->_limit == 'all') { 
      $query  = $this->_query; 
     } else { 
      $query  = $this->_query . " LIMIT " . (($this->_page - 1) * $this->_limit) . ", $this->_limit"; 
     } 
     $rs    = $this->_conn->query($query); 

     while ($row = $rs->fetchArray()) { 
      $results[] = $row; 
     } 

     $results[] = []; 
     $result   = new stdClass(); 
     $result->page = $this->_page; 
     $result->limit = $this->_limit; 
     $result->total = $this->_total; 
     $result->data = $results; 
     return $result; 
    } 

    public function createLinks($links, $list_class) { 
     if ($this->_limit == 'all') { 
      return ''; 
     } 

     $last  = ceil($this->_total/$this->_limit); 
     $start  = (($this->_page - $links) > 0) ? $this->_page - $links : 1; 
     $end  = (($this->_page + $links) < $last) ? $this->_page + $links : $last; 
     $html  = '<ul class="' . $list_class . '">'; 
     $class  = ($this->_page == 1) ? "disabled" : ""; 
     $html  .= '<li class="' . $class . '"><a href="?limit=' . $this->_limit . '&page=' . ($this->_page - 1) . '">&laquo;</a></li>'; 

     if ($start > 1) { 
      $html .= '<li><a href="?limit=' . $this->_limit . '&page=1">1</a></li>'; 
      $html .= '<li class="disabled"><span>...</span></li>'; 
     } 

     for ($i = $start ; $i <= $end; $i++) { 
      $class = ($this->_page == $i) ? "active" : ""; 
      $html .= '<li class="' . $class . '"><a href="?limit=' . $this->_limit . '&page=' . $i . '">' . $i . '</a></li>'; 
     } 

     if ($end < $last) { 
      $html .= '<li class="disabled"><span>...</span></li>'; 
      $html .= '<li><a href="?limit=' . $this->_limit . '&page=' . $last . '">' . $last . '</a></li>'; 
     } 

     $class  = ($this->_page == $last) ? "disabled" : ""; 
     $html  .= '<li class="' . $class . '"><a href="?limit=' . $this->_limit . '&page=' . ($this->_page + 1) . '">&raquo;</a></li>'; 
     $html  .= '</ul>'; 
     return $html; 
    } 

} 

?> 

index.php

<?php 
    require_once 'Paginator.php'; 

    $db = new SQLite3('latest.db'); 

    $limit  = (isset($_GET['limit'])) ? $_GET['limit'] : 4; 
    $page  = (isset($_GET['page'])) ? $_GET['page'] : 1; 
    $links  = (isset($_GET['links'])) ? $_GET['links'] : 4; 
    $query  = "SELECT ID, video FROM latest"; 

    $Paginator = new Paginator($db, $query); 

    $results = $Paginator->getData($page, $limit); 
?> 

<!DOCTYPE html> 
    <head> 
     <title>PHP Pagination</title> 
     <link rel="stylesheet" href="css/stylesheet.css"> 
    </head> 
    <body> 
     <div class="container"> 
       <div class="col-md-10 col-md-offset-1"> 
       <h1>PHP Pagination</h1> 

<?php for($i = 0; $i < count($results->data); $i++) : ?> 
    <p><?php echo $results->data[$i]['video']; ?></p> 
<?php endfor; ?> 

<p><?php echo $Paginator->createLinks($links, 'pagination pagination-sm'); ?></p> 

       </div> 
     </div> 
     </body> 
</html> 

Aby utworzyć bazę danych i sprawdzić dane są dodawane i prowadził ten skrypt raz:

<?php 

// Create the Database 
$db = new SQLite3('latest.db'); 

// Create the Table 
$db->query('CREATE TABLE IF NOT EXISTS latest (ID INTEGER PRIMARY KEY ASC, video STRING)'); 

// Insert the data 
$db->query('INSERT INTO latest (video) VALUES ("XoiEkEuCWog")'); 
$db->query('INSERT INTO latest (video) VALUES ("jsbeemdD2rQ")'); 
$db->query('INSERT INTO latest (video) VALUES ("hv44srAsAo4")'); 
$db->query('INSERT INTO latest (video) VALUES ("nwpj9_hrK_A")'); 
$db->query('INSERT INTO latest (video) VALUES ("sY3rIlrTTh8")'); 
$db->query('INSERT INTO latest (video) VALUES ("QpbQ4I3Eidg")'); 
$db->query('INSERT INTO latest (video) VALUES ("M0it_zMP-EM")'); 
$db->query('INSERT INTO latest (video) VALUES ("6X_C9E55CfM")'); 
$db->query('INSERT INTO latest (video) VALUES ("cNw8A5pwbVI")'); 
$db->query('INSERT INTO latest (video) VALUES ("J-gYJBsln-w")'); 

echo '<h1>The Following Data Was Created</h1>'; 

// Get the data 
$results = $db->query('SELECT ID, video FROM latest'); 
while ($row = $results->fetchArray()) { 
    echo '<b>ID:</b> ' . $row['ID'] . ', <b>Video:</b> ' . $row['video'] . '<br>'; 
} 

?> 

Jak można naprawić ten błąd i uzyskać ten kod działa poprawnie?

Edit:

Dzięki proponowanej poprawki usuwania "$ wyniki [] = [];" strona indeksu wyświetla się teraz bez błędów, ale nie działa zgodnie z oczekiwaniami.

Spodziewałem się, że ponieważ limit $ zostanie ustawiony na 10, wyświetli 10 ciągów znaków i wyświetli przyciski paginatora «1», a jeśli limit $ zostanie ustawiony na 5, wówczas 5 wyświetli się i "1,2" jako przyciski jednak obecnie tylko pokazuje 1 ciąg jak:

nwpj9_hrK_A

klikając również kolejne strony i przycisków sprawia, że ​​daje nieoczekiwane rezultaty zamiast być koniec listy stron, jeśli dadzą coś losowego.

Odpowiedz

5

Powodem, że otrzymujesz błąd indeksu niezdefiniowanej właśnie z powodu tego kawałka kodu

while ($row = $rs->fetchArray()) { 
     $results[] = $row; 
    } 

    $results[] = []; /** this line here **/ 

Jesteś resetującym wyników. Usuń tę linię. Jeśli chodzi o resztę pytania, proszę podać więcej informacji.

Zanotowano twoją aktualizację. Proszę zobaczyć answer by Dhruv wydaje się, że rozwiązał resztę problemu.

+0

Dzięki, że jest błąd naprawiony. Dokonałem edycji z dodatkowymi informacjami. – zeddex

+0

Dzięki za nagrodę. – e4c5

5

Oprócz $results[] = [] bitowej (która dołączona jeden pusty wiersz zwróconych wyników), jest bardzo, bardzo niewielki błąd w kodzie:

  • Gdy sposób getData() jest wywoływana z index.php mamy:

    $results = $Paginator->getData($page, $limit); 
    


  • Zważywszy, że w definicji, to jest:

    public function getData($limit = 10, $page = 1){ 
    } 
    

Oznacza to, mimo że pozornie wygląda parametr $limit jest ustawiony, aby pobrać co najmniej 4 rekordy, jest on domyślnie 1 rekordu tylko . Miejsce, w którym można je zamienić, pozostawia się z pewnością swojemu dyskretności. Jednak zdarzyło mi się naprawić tę definicję. Dodatkowo, byłoby miło mieć deklarację $results na początku samej metody (lub inny, mamy niezdefiniowany błąd ponownie podczas jazdy poza ostatniej stronie wyświetlanych wyników):

public function getData($page = 1, $limit = 10) { 
    $this->_limit = $limit; 
    $this->_page = $page; 
    $results  = array(); 

    if ($this->_limit == 'all') { 
     $query  = $this->_query; 
    } 
    else { 
     $query  = $this->_query . " LIMIT " . (($this->_page - 1) * $this->_limit) . ", $this->_limit"; 
    } 
    $rs    = $this->_conn->query($query); 

    while ($row = $rs->fetchArray()) { 
     $results[] = $row; 
    } 

    //$results[] = []; 
    $result   = new stdClass(); 
    $result->page = $this->_page; 
    $result->limit = $this->_limit; 
    $result->total = $this->_total; 
    $result->data = $results; 
    return $result; 
} 
+0

Dzięki temu rozwiązuje podstawowy system stronicowania i działa świetnie, więc przyjąłem twoją odpowiedź. Teraz jednym z nowych problemów są przyciski numerów stron. Wydaje się, że tylko strona 1 jest wyświetlana, a kliknięcie można cofnąć lub przekroczyć limit. – zeddex

4

paginacji korzystania OFFSET ma nieodłączne problemy, gdy rekordy są dodawane/usuwane, gdy użytkownik przegląda strony. Ponadto, OFFSET jest dość nieefektywny, gdy zbiór danych jest duży.

Polecam porzucić wszystko, co używa OFFSET. Zamiast „pamiętać gdzie zostało przerwane” i używając coś podobnego do „next” Strona:

WHERE id > $left_off 
ORDER BY id 
LIMIT 10 

Więcej details

+0

Dzięki, ale ten kod nie używa OFFSET, został dostosowany z Paginacji SQL znalezionej online. Mody z Dhruv Saxena wydają się naprawiać błędy, ale przyciski nadal nie wyświetlają się lub działają poprawnie, jestem zaskoczony, że nie ma więcej kodu sqlite3 dla tego typu rzeczy. – zeddex

+0

Och, ale kod sugeruje, że tak. "LIMIT 100,10" jest skrótem dla 'LIMIT 10 OFFSET 100'. –