PDA

Prikaži potpunu verziju : Pagination


Dekip
21.12.2011, 1:31
Већ пар дана се мучим да наместим pagination на ову скрипту коју правим. Једна је ствар писати скрипту из почетка а друга је калемити туђа решења. Уз доста перипетија дошао сам до овога (http://www.sk.rs/forum/showthread.php?t=77270). Ставке ми се пакују како ја хоћи. Мало css, мало фотошопа и добио сам шта сам хтео.

Dekip
21.12.2011, 1:33
Али, сутра ће у бази бити "милион" ставки... Ту на сцену ступа pagination. Елем, дошао сам до овога:


<?php
include "storescripts/connect_to_mysql.php";

$sql = mysql_query("SELECT * FROM products ORDER BY date_added ASC");


$nr = mysql_num_rows($sql); // Get total of Num rows from the database query
if (isset($_GET['pn'])) { // Get pn from URL vars if it is present
$pn = preg_replace('#[^0-9]#iu', '', $_GET['pn']); // filter everything but numbers for security(new)
} else { // If the pn URL variable is not present force it to be value of page number 1
$pn = 1;
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////// THE FOLLOWING IS WHERE WE SET ITEMS PER PAGE ////////////////
////////////////////////////////////////////////////////////////////////
$itemsPerPage = 10; // <<<< EDIT THIS NUMBER ITEMS PER PAGE //////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
// Get the value of the last page in the pagination result set
$lastPage = ceil($nr / $itemsPerPage);
// Be sure URL variable $pn(page number) is no lower than page 1 and no higher than $lastpage
if ($pn < 1) { // If it is less than 1
$pn = 1; // force if to be 1
} else if ($pn > $lastPage) { // if it is greater than $lastpage
$pn = $lastPage; // force it to be $lastpage's value
}
// This creates the numbers to click in between the next and back buttons
$centerPages = ""; // Initialize this variable
$sub1 = $pn - 1;
$sub2 = $pn - 2;
$add1 = $pn + 1;
$add2 = $pn + 2;
if ($pn == 1) {
$centerPages .= ' <span class="pagNumActive">' . $pn . '</span> ';
$centerPages .= ' <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '&id=' . $pn . '">' . $add1 . '</a> ';
} else if ($pn == $lastPage) {
$centerPages .= ' <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '&id=' . $pn . '">' . $sub1 . '</a> ';
$centerPages .= ' <span class="pagNumActive">' . $pn . '</span> ';
} else if ($pn > 2 && $pn < ($lastPage - 1)) {
$centerPages .= ' <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub2 . '&id=' . $pn . '">' . $sub2 . '</a> ';
$centerPages .= ' <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '&id=' . $pn . '">' . $sub1 . '</a> ';
$centerPages .= ' <span class="pagNumActive">' . $pn . '</span> ';
$centerPages .= ' <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '&id=' . $pn . '">' . $add1 . '</a> ';
$centerPages .= ' <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add2 . '&id=' . $pn . '">' . $add2 . '</a> ';
} else if ($pn > 1 && $pn < $lastPage) {
$centerPages .= ' <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '&id=' . $pn . '">' . $sub1 . '</a> ';
$centerPages .= ' <span class="pagNumActive">' . $pn . '</span> ';
$centerPages .= ' <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '&id=' . $pn . '">' . $add1 . '</a> ';
}
// This line sets the "LIMIT" range... the 2 values we place to choose a range of rows from database in our query
$limit = 'LIMIT ' .($pn - 1) * $itemsPerPage .',' .$itemsPerPage;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Now we are going to run the same query as above but this time add $limit onto the end of the SQL syntax/////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////// $sql2 is what we will use to fuel our while loop statement below ////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////CHANGE THE FOLLOWING QUERY TO MATCH THE FIRST QUERY///////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
$sql2 = mysql_query("SELECT * FROM products ORDER BY date_time ASC $limit"); // <<<< CHANGE TO YOUR DB_TABLE ////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
$paginationDisplay = ""; // Initialize the pagination output variable
// This code runs only if the last page variable is not equal to 1, if it is only 1 page we require no paginated links to display
if ($lastPage != "1"){
// This shows the user what page they are on, and the total number of pages
$paginationDisplay .= 'Page <strong>' . $pn . '</strong> of ' . $lastPage. '<img src="style/clearImage.gif" width="48" height="1" alt="" />';
// If we are not on page 1 we can place the Back button
if ($pn != 1) {
$previous = $pn - 1;
$paginationDisplay .= ' <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $previous . '&id=' . $pn . '"> Back</a> ';
}
// Lay in the clickable numbers display here between the Back and Next links
$paginationDisplay .= '<span class="paginationNumbers">' . $centerPages . '</span>';
// If we are not on the very last page we can place the Next button
if ($pn != $lastPage) {
$nextPage = $pn + 1;
$paginationDisplay .= ' <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $nextPage . '&id=' . $pn . '"> Next</a> ';
}
}
$dynamicList = "";
$dyn_table = "";


$productCount = mysql_num_rows($sql2); // count the output amount
if ($productCount > 0) {
........
?>
У овом случају не добијам ништа. Добијам pagination бројеве који виде да имам ставки за две странице али ми не избацује ништа.

Dekip
21.12.2011, 1:34
<?php
include "storescripts/connect_to_mysql.php";

$sql = mysql_query("SELECT * FROM products ORDER BY date_added ASC");
////////////////////////////////////////////////////////////////////////
$nr = mysql_num_rows($sql); // Get total of Num rows from the database query
if (isset($_GET['pn'])) { // Get pn from URL vars if it is present
$pn = preg_replace('#[^0-9]#i', '', $_GET['pn']); // filter everything but numbers for security(new)
//$pn = ereg_replace("[^0-9]", "", $_GET['pn']); // filter everything but numbers for security(deprecated)
} else { // If the pn URL variable is not present force it to be value of page number 1
$pn = 1;
}
//This is where we set how many database items to show on each page
$itemsPerPage = 9;
// Get the value of the last page in the pagination result set
$lastPage = ceil($nr / $itemsPerPage);
// Be sure URL variable $pn(page number) is no lower than page 1 and no higher than $lastpage
if ($pn < 1) { // If it is less than 1
$pn = 1; // force if to be 1
} else if ($pn > $lastPage) { // if it is greater than $lastpage
$pn = $lastPage; // force it to be $lastpage's value
}
// This creates the numbers to click in between the next and back buttons
// This section is explained well in the video that accompanies this script
$centerPages = "";
$sub1 = $pn - 1;
$sub2 = $pn - 2;
$add1 = $pn + 1;
$add2 = $pn + 2;
if ($pn == 1) {
$centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;';
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '">' . $add1 . '</a> &nbsp;';
} else if ($pn == $lastPage) {
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '">' . $sub1 . '</a> &nbsp;';
$centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;';
} else if ($pn > 2 && $pn < ($lastPage - 1)) {
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub2 . '">' . $sub2 . '</a> &nbsp;';
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '">' . $sub1 . '</a> &nbsp;';
$centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;';
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '">' . $add1 . '</a> &nbsp;';
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add2 . '">' . $add2 . '</a> &nbsp;';
} else if ($pn > 1 && $pn < $lastPage) {
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '">' . $sub1 . '</a> &nbsp;';
$centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;';
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '">' . $add1 . '</a> &nbsp;';
}
// This line sets the "LIMIT" range... the 2 values we place to choose a range of rows from database in our query
$limit = 'LIMIT ' .($pn - 1) * $itemsPerPage .',' .$itemsPerPage;
// Now we are going to run the same query as above but this time add $limit onto the end of the SQL syntax
// $sql2 is what we will use to fuel our while loop statement below
$sql2 = mysql_query("SELECT * FROM products ORDER BY date_added ASC $limit");

$paginationDisplay = ""; // Initialize the pagination output variable
// This code runs only if the last page variable is ot equal to 1, if it is only 1 page we require no paginated links to display
if ($lastPage != "1"){
// This shows the user what page they are on, and the total number of pages
$paginationDisplay .= 'Page <strong>' . $pn . '</strong> of ' . $lastPage. '&nbsp; &nbsp; &nbsp; ';
// If we are not on page 1 we can place the Back button
if ($pn != 1) {
$previous = $pn - 1;
$paginationDisplay .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $previous . '"> Back</a> ';
}
// Lay in the clickable numbers display here between the Back and Next links
$paginationDisplay .= '<span class="paginationNumbers">' . $centerPages . '</span>';
// If we are not on the very last page we can place the Next button
if ($pn != $lastPage) {
$nextPage = $pn + 1;
$paginationDisplay .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $nextPage . '"> Next</a> ';
}
}

$dynamicList = "";
$dyn_table = "";


$productCount = mysql_num_rows($sql2); // count the output amount
if ($productCount > 0) {
$i = 0;
.........
У овом другом случају ми избацује све у у првој страници и у другој.

Дакле, шта променити да ми избаци онолико ставки по страници колико ја одредим? Скрипта правилно детектује број ставки и уредно избацује број страница колико је потребно за број ставки у бази, али како да ми избацује по страници онолико колико ја хоћу?

JohnnyNT
21.12.2011, 12:47
Скрипта правилно детектује број ставки и уредно избацује број страница колико је потребно за број ставки у бази, али како да ми избацује по страници онолико колико ја хоћу?

Pretpostavljam da već znaš, ali ovo menjaš ako želiš da promeniš broj stavki po stranici:

$itemsPerPage = 9;

I koliko uopšte stavki imaš u bazi, ako tu u drugom slučaju izbacuje sve na 2 stranice (valjda manje od 18)?

I ako te interesuje još stvari o paginaciji, baci pogled ovde (http://dzoni.iz.rs/php-jednostavna-pagiancija/), nije nešto profi ali trudio sam se da detaljno objasnim :D

Dekip
21.12.2011, 19:36
Скрипта регуларно избацује колико имам ставки у бази (Total Items: <?php echo $nr; ?>) само што у првом случају избацује свих 16 (колико их имам сада док радим) у обе стране пагинације. И у самој пагинацији ми избацује да имам две стране за output. Али шта променити да избаци само онолико колики је $limit?

У другом случају ми је output "ових артикала још увек немамо", што значи да тај део скрипте не види податке у бази, али ми пре пагинације исто избаци колико ставки имам и исто избаци број страна пагинације.

:confused:

Хвала за линк, али ако би ово могло да се поправи...


EДИТ:
Додао сам мало ставки у базу и усредсредио се на прву верзију. Она бар нешто избацује. :p
Дакле, уредно ми пријављује број ставки у бази, број страница пагинације (сада је већ три, али то се може мењати и у самој скрипти $itemsPerPage = 9; ), али ми и даље избацује све ставке одреда на све, сада већ три стране.

JohnnyNT
21.12.2011, 20:01
Aha, na svakoj strani izbacuje svih 16.

Da nisi možda u prvom slučaju pogrešio u delu koda koji nisi postavio ovde, pa si fetchovao $sql (gde nije limitiran prikaz) umesto $sql2 (gde je limitiran prikaz)?

Evo na šta mislim:

$row=mysql_fetch_array($sql) a treba $sql2

Dekip
21.12.2011, 20:32
Дакле, страшно. Мора пауза да се направи...


Сво време ударам главом у зид. 41916

Управо сам провалио, кад видим да си и ти дошао на исто. :ciao:

А оно ће едитујемо. Сори...

JohnnyNT
21.12.2011, 20:36
Znam kako je, obavezno uzmi pauzu kad mozak počne da šlajfuje u mestu :D Meni počnu da promiču još očiglednije stvari ako nastavim da radim.

doctor
21.12.2011, 23:47
Znam kako je, obavezno uzmi pauzu kad mozak počne da šlajfuje u mestu...
Ali je najčudnije što se ovo meni dešava najčešće sa PHP-om... :D Sa ostalim programskim jezicima ređe i slabije šlajfujem, ne znam zašto... :D

Dekip
22.12.2011, 19:57
Не вреди...
Бокал кафе и гајба пива и .... ништа.:kreza:

Наместио сам да ми пагинација ради на почетној страници, али имплемтентација на друге странице ми прави проблем. Заправо, остале су ми још три странице које у основи имају исту/сличну скрипту за селектовање из базе.

С обзиром на лимит карактера по поруци на овом форуму скрипту ћу исећи на пар места.

search.php 1.део

<?php
include "storescripts/connect_to_mysql.php";
$search_output = "";
$dyn_table = "";
if(isset($_POST['searchquery']) && $_POST['searchquery'] != ""){
$searchquery = preg_replace('#[^a-z 0-9?!]#i', '', $_POST['searchquery']);
$sql = mysql_query("SELECT * FROM products WHERE category LIKE '%$searchquery%' OR product_name LIKE '%$searchquery%'");
////////////////////////////////////////////////////////////////////////
$nr = mysql_num_rows($sql); // Get total of Num rows from the database query
if (isset($_GET['pn'])) { // Get pn from URL vars if it is present
$pn = preg_replace('#[^0-9]#i', '', $_GET['pn']); // filter everything but numbers for security(new)
//$pn = ereg_replace("[^0-9]", "", $_GET['pn']); // filter everything but numbers for security(deprecated)
} else { // If the pn URL variable is not present force it to be value of page number 1
$pn = 1;
}
//This is where we set how many database items to show on each page
$itemsPerPage = 9;
// Get the value of the last page in the pagination result set
$lastPage = ceil($nr / $itemsPerPage);
// Be sure URL variable $pn(page number) is no lower than page 1 and no higher than $lastpage
if ($pn < 1) { // If it is less than 1
$pn = 1; // force if to be 1
} else if ($pn > $lastPage) { // if it is greater than $lastpage
$pn = $lastPage; // force it to be $lastpage's value
}
.....

Dekip
22.12.2011, 19:58
search.php 2.део


......
// This creates the numbers to click in between the next and back buttons
// This section is explained well in the video that accompanies this script
$centerPages = "";
$sub1 = $pn - 1;
$sub2 = $pn - 2;
$add1 = $pn + 1;
$add2 = $pn + 2;
if ($pn == 1) {
$centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;';
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '">' . $add1 . '</a> &nbsp;';
} else if ($pn == $lastPage) {
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '">' . $sub1 . '</a> &nbsp;';
$centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;';
} else if ($pn > 2 && $pn < ($lastPage - 1)) {
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub2 . '">' . $sub2 . '</a> &nbsp;';
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '">' . $sub1 . '</a> &nbsp;';
$centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;';
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '">' . $add1 . '</a> &nbsp;';
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add2 . '">' . $add2 . '</a> &nbsp;';
} else if ($pn > 1 && $pn < $lastPage) {
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $sub1 . '">' . $sub1 . '</a> &nbsp;';
$centerPages .= '&nbsp; <span class="pagNumActive">' . $pn . '</span> &nbsp;';
$centerPages .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $add1 . '">' . $add1 . '</a> &nbsp;';
}
.....

Dekip
22.12.2011, 19:59
search.php 3.део


....
// This line sets the "LIMIT" range... the 2 values we place to choose a range of rows from database in our query
$limit = 'LIMIT ' .($pn - 1) * $itemsPerPage .',' .$itemsPerPage;
// Now we are going to run the same query as above but this time add $limit onto the end of the SQL syntax
// $sql2 is what we will use to fuel our while loop statement below
$sql2 = mysql_query("SELECT * FROM products WHERE category LIKE '%$searchquery%' OR product_name LIKE '%$searchquery%' $limit");
/////////////////////////////////////////////////////////////////////
$paginationDisplay = ""; // Initialize the pagination output variable
// This code runs only if the last page variable is ot equal to 1, if it is only 1 page we require no paginated links to display
if ($lastPage != "1"){
// This shows the user what page they are on, and the total number of pages
$paginationDisplay .= 'Page <strong>' . $pn . '</strong> of ' . $lastPage. '&nbsp; &nbsp; &nbsp; ';
// If we are not on page 1 we can place the Back button
if ($pn != 1) {
$previous = $pn - 1;
$paginationDisplay .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $previous . '"> Back</a> ';
}
// Lay in the clickable numbers display here between the Back and Next links
$paginationDisplay .= '<span class="paginationNumbers">' . $centerPages . '</span>';
// If we are not on the very last page we can place the Next button
if ($pn != $lastPage) {
$nextPage = $pn + 1;
$paginationDisplay .= '&nbsp; <a href="' . $_SERVER['PHP_SELF'] . '?pn=' . $nextPage . '"> Next</a> ';
}
}
...

Dekip
22.12.2011, 20:06
search.php 4.део


....
$count = mysql_num_rows($sql2);
if($count > 0){
$search_output .= "$count pogodak(a) za <strong>$searchquery</strong><hr />";
$i = 0;
$dyn_table = '<table width="100%" border="0" cellpadding="5" cellspacing="0">';
while($row = mysql_fetch_array($sql2)){
$id = $row["id"];
$product_name = $row["product_name"];
$price = $row["price"];
$date_added = strftime("%b %d, %Y", strtotime($row["date_added"]));
$search_output = '<table width="140px" border="1" cellspacing="0" cellpadding="6">
<tr>
<td height="130px" bgcolor="#ffffff" valign="top"><a href="product.php?id=' . $id . '"><img style="display: block; margin-left:auto; margin-right:auto; border:0" src="inventory_images/' . $id . '.jpg" alt="' . $product_name . '" width="77" height="102" border="1" /></a></td>
</tr>

<tr>
<td height="150px" valign="top"><b>' . $product_name . '</b><br />
RSD: ' . $price . '<br />
<a href="product.php?id=' . $id . '">Detaljnije &raquo;</a></td>
</tr>
</table>';
if ($i % 3 == 0) { // if $i is divisible by our target number (in this case "3")
$dyn_table .= '<tr><td>' . $search_output . '</td>';
} else {
$dyn_table .= '<td>' . $search_output . '</td>';
}
$i++;
} // close while
$dyn_table .= '</tr></table>';
} else {
$dyn_table = "<hr />0 results for <strong>$searchquery</strong><hr />$sqlCommand";
}
}
mysql_close();
?>
...


С обзиром да је у питању претрага скрипта је мало другачија од оне на коју сам накалемио пагинацију. У овом случају ми избацује на првој страници 9 ставки са све укупним бројем нађених, бројем страница за пагинацију и све то изгледа бајно. Проблем настаје када кликнем другу страницу у пагинацији, трећу...
Избаци ми следеће:
Notice: Undefined variable: paginationDisplay in C:\xampp\htdocs...

Тако да, сезона лова на прескочене тачке и зарезе је почела.:p

JohnnyNT
22.12.2011, 20:16
Je l' ti izbaci samo to, ili pored greške dobiješ i rezultate za drugu (ili treću, četvrtu) stranu?

Dekip
22.12.2011, 20:31
Ајд' када сам почео...


...
<div style=" padding:6px; background-color:#FFF; border:#999 1px solid;"><?php echo $paginationDisplay; ?></div>
<div><?php print $dyn_table; ?></div>
<div style=" padding:6px; background-color:#FFF; border:#999 1px solid;"><?php echo $paginationDisplay; ?></div></p>
<div>
<h4>Ukupno artikala: <?php echo $nr; ?></h4>
...

Ово је део кода за приказ на страници. За $paginationDisplay и $nr ми излази то што сам написао док ми за $dyn_table не излази ништа. Дакле, за прву страницу у пагинацији ми излази све како треба, док на било коју другу изађе ово и не могу у оквиру странице ни напред ни назад. Могу само на back у оквиру броусера. Не и у оквиру пагинације.


Као што рекох, на почетној ради као сат, али и скрипта за почетну се разликује од ове за претрагу.

JohnnyNT
22.12.2011, 20:41
Ovo upozorenje o grešci bi trebalo da ukloni znak @ ispred $paginationDisplay, dakle ovako:

@$paginationDisplay = ""; // Initialize the pagination output variable

E sad, pretpostavljam da ovo neće pomoći oko "kvara" paginacije, ali ti mi ne odgovori konkretno: da li na toj drugoj strani uopšte imaš nađenih rezultata ?

Dekip
22.12.2011, 22:37
Па рекао сам ти. Имаш у посту испод html код за приказ, а имаш и шта од тога избацује а шта не.

Излази ово:


Notice: Undefined variable: paginationDisplay in C:\xampp\htdocs\web\search.php on line 183


Notice: Undefined variable: paginationDisplay in C:\xampp\htdocs\web\search.php on line 185

Ukupno artikala:
Notice: Undefined variable: nr in C:\xampp\htdocs\web\search.php on line 187



Где су линије управо ове из html кода.