Trädvy Permalänk
Medlem
Plats
Piteå
Registrerad
Okt 2004

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?

CPU: AMD Ryzen 1700x @ 3.8GHz || Mem: 16GB Corsair LPX 3000mhz || Mobo: Asus x370 Prime || GPU: EVGA Geforce GTX1070 SC || SSD: WD black 500GB m2 || OS: Linux Mint/Win 10 || Monitor: Dell 43" 4K P4317Q

Citera om du vill ha svar :)

Trädvy Permalänk
Medlem
Plats
Karlskrona
Registrerad
Jan 2006

@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?

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

Trädvy Permalänk
Medlem
Plats
Halmstad
Registrerad
Apr 2003

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

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

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Maj 2004

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

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

Trädvy Permalänk
Medlem
Plats
Piteå
Registrerad
Okt 2004
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?

CPU: AMD Ryzen 1700x @ 3.8GHz || Mem: 16GB Corsair LPX 3000mhz || Mobo: Asus x370 Prime || GPU: EVGA Geforce GTX1070 SC || SSD: WD black 500GB m2 || OS: Linux Mint/Win 10 || Monitor: Dell 43" 4K P4317Q

Citera om du vill ha svar :)

Trädvy Permalänk
Medlem
Plats
Piteå
Registrerad
Okt 2004
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

CPU: AMD Ryzen 1700x @ 3.8GHz || Mem: 16GB Corsair LPX 3000mhz || Mobo: Asus x370 Prime || GPU: EVGA Geforce GTX1070 SC || SSD: WD black 500GB m2 || OS: Linux Mint/Win 10 || Monitor: Dell 43" 4K P4317Q

Citera om du vill ha svar :)

Trädvy Permalänk
Medlem
Plats
Piteå
Registrerad
Okt 2004

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() ) ); } ?>

CPU: AMD Ryzen 1700x @ 3.8GHz || Mem: 16GB Corsair LPX 3000mhz || Mobo: Asus x370 Prime || GPU: EVGA Geforce GTX1070 SC || SSD: WD black 500GB m2 || OS: Linux Mint/Win 10 || Monitor: Dell 43" 4K P4317Q

Citera om du vill ha svar :)