Permalänk
Medlem

PHP MsSQL pageing

Sitter och kodar en blogg.. mest för att lära mig, har fått till "pageing" som jag vill ha förutom en grej, den räknar inläggen 1 2 3 4 men jag vill ha högsta numret först så det blir 4 3 2 1 om ni förstår, har försökt få till en array reverse men de vill sig inte riktigt och man kan säga att jag har kört fast...

<?php error_reporting(E_ALL); ini_set('display_errors', 1); $rowsPerPage = 2; try { $conn = new PDO( "sqlsrv:server=localhost ; Database=blog", "*****", "*******"); $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); } catch(Exception $e) { die( print_r( $e->getMessage() ) ); } try { $tsql = "SELECT COUNT(blogID) FROM blog_posts"; $stmt = $conn->query($tsql); $rowsReturned = $stmt->fetch(PDO::FETCH_NUM); if($rowsReturned[0] == 0) { echo "No rows returned."; } else { $numOfPages = ceil($rowsReturned[0]/$rowsPerPage); for($i = 1; $i<=$numOfPages; $i++) { $pageNum = "index.php?pageNum=$i"; print("<a href='$pageNum' class='btn btn-primary active btn-sm'>$i</a>&nbsp;&nbsp;"); } } $tsql = "SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY blogID asc) AS RowNumber, blog_title, blog_post, blog_author, blog_category, blog_date FROM blog_posts) AS Temp WHERE RowNumber BETWEEN ? AND ?"; $stmt2 = $conn->prepare($tsql); if(isset($_GET['pageNum'])) { $highRowNum = $_GET['pageNum'] * $rowsPerPage; $lowRowNum = $highRowNum - $rowsPerPage + 1; } else { $lowRowNum = 1; $highRowNum = $rowsPerPage; } $params = array(&$lowRowNum, &$highRowNum); $stmt2->execute(array($lowRowNum, $highRowNum)); while($row = $stmt2->fetch(PDO::FETCH_NUM) ) { echo "$row[1]; echo "$row[2]"; echo $row[3]"; echo date_format( new DateTime($row['5']), 'd M Y, H:i' ); echo "$row[4]"; echo "$row[0]"; } } catch(Exception $e) { die( print_r( $e->getMessage() ) ); } ?>

om jag ändrar

$tsql = "SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY blogID asc)

Till DESC istället som jag ska ha egentligen så får jag nyaste inlägget först som det ska vara men det står fortfarande att det är inlägg 1 så det hjälper mig inte det minsta

några förslag?

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem

@pellski87:
Du kan inte bara köra med ASC sen köra reversed?
Typ nåt sånt här:

$row = $stmt2->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_LAST); do { ..... } while ($row = $stmt2->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_PRIOR));

Här inte testat koden men borde ta dig i rätt riktning kanske?

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem

Absolut märkligaste pagineringen jag sett i hela mitt liv, hela konceptet är fel, speciellt att köra en subquery endast för att få fram raderna OCH sen köra en "between" på resultatet.

Gör bara en vanlig query med LIMIT & offset

http://www.w3schools.com/php/php_mysql_select_limit.asp

Använd $rowsPerPage på samma sätt du gjort nu fast i LIMIT sektionen istället

Visa signatur

Hur kan syltkakor överleva i det vilda utan ögon?

Permalänk
Medlem

LIMIT finns bara i MySQL, så vitt jag vet. För SQL-Server (2012 eller senare) är det OFFSET/FETCH som gäller.
https://msdn.microsoft.com/en-us/library/ms188385.aspx

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem
Skrivet av JesperA:

Absolut märkligaste pagineringen jag sett i hela mitt liv, hela konceptet är fel, speciellt att köra en subquery endast för att få fram raderna OCH sen köra en "between" på resultatet.

Gör bara en vanlig query med LIMIT & offset

http://www.w3schools.com/php/php_mysql_select_limit.asp

Använd $rowsPerPage på samma sätt du gjort nu fast i LIMIT sektionen istället

LIMIT går ej använda med microsoft sql, dock är jag rookie på php osv så att jag fått det att fungera anser jag ger mig rätt till en klapp på axeln

Hur hade du gjort för att göra samma sak?

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem
Skrivet av NoPaiN^:

@pellski87:
Du kan inte bara köra med ASC sen köra reversed?
Typ nåt sånt här:

$row = $stmt2->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_LAST); do { ..... } while ($row = $stmt2->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_PRIOR));

Här inte testat koden men borde ta dig i rätt riktning kanske?

Tackar, löste det på ett enklare sätt, skippade att printa row count raden och printar bara blogID raden istället men tack för hjälpen

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem

hur går jag tillväga om jag skulle vilja lägga till så man kan gå till tex index.php?blogID=1 eller 2 3 4 osv, ja ni kanske fattar?
så både pageing fungerar men även att man kan gå till individuella inläggen? har kört fast lite kan man säga

<?php error_reporting(E_ALL); ini_set('display_errors', 1); $rowsPerPage = 2; try { $conn = new PDO( "sqlsrv:server=localhost ; Database=blog", "******", "*******"); $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); } catch(Exception $e) { die( print_r( $e->getMessage() ) ); } try { $tsql = "SELECT COUNT(blogID) FROM blog_posts"; $stmt = $conn->query($tsql); $rowsReturned = $stmt->fetch(PDO::FETCH_NUM); if($rowsReturned[0] == 0) { echo "No rows returned."; } else { $numOfPages = ceil($rowsReturned[0]/$rowsPerPage); for($i = 1; $i<=$numOfPages; $i++) { $pageNum = "index.php?pageNum=$i"; print("<a href='$pageNum' class='btn btn-primary active btn-sm'>$i</a>&nbsp;&nbsp;"); } } $tsql = "SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY blogID DESC) AS RowNumber, blog_title, blog_post, blog_author, blog_category, blog_date, blogID FROM blog_posts) AS Temp WHERE RowNumber BETWEEN ? AND ?"; $stmt2 = $conn->prepare($tsql); if(isset($_GET['pageNum'])) { $highRowNum = $_GET['pageNum'] * $rowsPerPage; $lowRowNum = $highRowNum - $rowsPerPage + 1; } else { $lowRowNum = 1; $highRowNum = $rowsPerPage; } $params = array(&$lowRowNum, &$highRowNum); $stmt2->execute(array($lowRowNum, $highRowNum)); while($row = $stmt2->fetch(PDO::FETCH_NUM) ) { echo "$row[1]"; echo "$row[2]"; echo "$row[3]"; echo date_format( new DateTime($row['5']), 'd M Y, H:i' ); echo "$row[4]"; echo "$row[6]"; } } catch(Exception $e) { die( print_r( $e->getMessage() ) ); } ?>

Visa signatur

Citera om du vill ha svar :)