Pagination
Pagination क्यों
जब table में सैकड़ों rows हों, उन सबको एक page पर दिखाना धीमा और पढ़ना मुश्किल है। Pagination results को pages में बाँटता है — मान लीजिए 10 प्रति page — उनके बीच जाने को links के साथ। यह pages तेज़ रखता है और users को साफ़ browse करने का तरीका देता है।
LIMIT (कितने) और OFFSET (कितने skip)।विचार: LIMIT और OFFSET
LIMIT कहता है कितनी rows लौटानी हैं; OFFSET कहता है कितनी पहले skip करनी हैं।
-- page 1: पहली 10 rows
SELECT * FROM products LIMIT 10 OFFSET 0;
-- page 2: 10 skip, अगली 10 लो
SELECT * FROM products LIMIT 10 OFFSET 10;
हर page सिर्फ़ OFFSET बदलता है। page 3, 20 skip करेगा, page 4, 30 skip करेगा, वग़ैरह।
Offset निकालना
Offset page number से एक सरल formula से आता है।
<?php
$perPage = 10;
$page = max(1, (int)($_GET["page"] ?? 1));
$offset = ($page - 1) * $perPage;
// page 3 -> offset = (3-1)*10 = 20
?>
हम सुरक्षा को page को integer में cast करते हैं और max(1, ...) इस्तेमाल करते हैं ताकि page कभी 1 से नीचे न हो। Formula (page - 1) * perPage skip करने वाली rows देता है।
Paginated query
<?php
// कुल pages
$total = $pdo->query("SELECT COUNT(*) FROM products")->fetchColumn();
$totalPages = ceil($total / $perPage);
// इस page की rows
$stmt = $pdo->prepare("SELECT * FROM products LIMIT ? OFFSET ?");
$stmt->bindValue(1, $perPage, PDO::PARAM_INT);
$stmt->bindValue(2, $offset, PDO::PARAM_INT);
$stmt->execute();
$rows = $stmt->fetchAll();
?>
पहले हम सारी rows गिनते हैं और per-page से भाग देते हैं (ceil से ऊपर round) ताकि कुल pages मिलें। फिर सिर्फ़ इस page की rows LIMIT और OFFSET को integers की तरह bind करके लाते हैं।
Page links बनाना
<?php
for ($i = 1; $i <= $totalPages; $i++) {
echo "<a href='?page=$i'>$i</a> ";
}
?>
एक सरल loop हर page के लिए link print करता है। किसी number पर click URL में ?page=N set करता है, जिसे आपकी offset गणना उस page को दिखाने को पढ़ती है।
आम गलतियाँ
- Page number cast करना भूलना।
(int)इस्तेमाल कीजिए ताकि LIMIT/OFFSET सुरक्षित रहें। - Page 0 या negative की अनुमति। page मान्य रखने को
max(1, ...)इस्तेमाल कीजिए। - कुल pages ऊपर round न करना।
ceil()इस्तेमाल कीजिए, वरना आख़िरी कुछ rows को page नहीं मिलता। - LIMIT को string की तरह bind करना।
PDO::PARAM_INTसे bind कीजिए ताकि MySQL स्वीकार करे।
सारांश
- Pagination results को speed और पढ़ने योग्यता के लिए pages में बाँटता है।
LIMITकितनी rows तय करता है;OFFSETकितनी skip।- Offset formula:
(page - 1) * perPage। - कुल pages:
ceil(totalRows / perPage)। ?page=Nसे numbered page links print करने को loop।
आगे, queries सुरक्षित चलाइए prepared statements से, या results पढ़िए PHP CRUD से।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
PHP में pagination क्या है?
LIMIT और OFFSET कैसे काम करते हैं?
LIMIT तय करता है कितनी rows लौटानी हैं, और OFFSET कितनी पहले skip करनी हैं। page 2 पर 10 प्रति page के लिए, आप LIMIT 10 OFFSET 10 इस्तेमाल करते हैं — पहली 10 skip, फिर अगली 10 लो।किसी page के लिए offset कैसे निकालूँ?
offset = (page - 1) * perPage। page 3 पर 10 प्रति page के लिए, यह (3-1)*10 = 20 है, तो आप 20 rows skip करके 21 से 30 तक rows दिखाते हैं।कुल pages की संख्या कैसे पता करूँ?
SELECT COUNT(*) से सारी rows गिनिए, फिर per-page number से भाग देकर ceil() से ऊपर round कीजिए। 95 rows पर 10 प्रति page के लिए, यह ceil(95/10) = 10 pages है।क्या LIMIT को सीधे user input के साथ इस्तेमाल करूँ?
(int)$_GET["page"])। चूँकि LIMIT/OFFSET numbers लेते हैं, int में cast करना उन्हें सुरक्षित रखता है। हमेशा जाँचिए page कम-से-कम 1 हो।