Door
Hans Hermes
op 02-07-2019 21:26
gewijzigd op 02-07-2019 21:58
3.372 views
Beste,
Ik heb een zoek script gevonden die ik voor mijn website kan gebruiken.
Dat is natuurlijk mooi maar het script laat de eerste 10 records zien, het totaal aantal records in getallen en het totaal aantal pagina's.
Ik ben geen held in php dus ik weet niet hoe ik dit kan wijzigen.
Wat ik wil is de searchbox wordt weergegeven en als er een record gevonden dat hij dan getoond wordt.
Dus als je op de pagina komt alleen eerst het zoekformulier laten zien. En pas wanneer je iets hebt gezocht en op "Zoek" drukt daadwerkelijk de resultaten laten zien.
Ik heb het script wat aangepast, maar zelf niet getest. Maar dit zou het moeten doen.
In een notendop:
Als er een $_GET of $_POST is geset (dus gezocht is) laat dan de tabel zien met resultaten. Als deze niet geset zijn, laat het dan niet zien.
Script is inderdaad heel simpel en is gevoelig voor mysql injections.
Heb daarom
Ik hoop ook dat die kolommen FULLTEXT indexen hebben?
MySQL heeft trouwens ook een voorziening voor dit soort gepagineerde content. Het komt er op neer dat je niet direct alle resultaten hoeft op te halen, je kunt direct 10 items of wat dan ook ophalen.
Uiteraard heb je ook het totaal aantal resultaten nodig om het aantal pagina's uit te kunnen rekenen. Dit doe je als volgt: allereerst voer je de query uit om de gegevens van de huidige pagina op te halen, dus inclusief LIMIT, maar ook met het speciale keyword SQL_CALC_FOUND_ROWS, dus zoiets:
SELECT SQL_CALC_FOUND_ROWS y, x, z, ...
FROM table
WHERE ...
LIMIT <offset>, <limit>
Nu heb je alle informatie voor de huidige pagina.
Vervolgens heb je nog het totale aantal records nodig voor bovenstaande query voor wanneer deze zonder LIMIT was uitgevoerd. Hiervoor heb je -vanwege SQL_CALC_FOUND_ROWS- nu de beschikking over de functie FOUND_ROWS() die precies dit doet. Voer direct na bovenstaande query de volgende query uit:
SELECT FOUND_ROWS() AS results
Nu bevat de "results" kolom het aantal records van de eerste query alsof deze zonder LIMIT was uitgevoerd.
Ik weet overigens niet of die berekening van $row_end wel klopt. Voor zover ik het begrijp is de constructie LIMIT <offset>, <limit>, en <limit> is altijd het aantal items per pagina, oftewel $per_page, maar in bovenstaande code lijkt $row_end elke pagina groter te worden? Ik weet niet of dat de bedoeling is? Het tweede argument van LIMIT is dus *niet* de eind-index van de records-van-interesse zoals de bovenstaande code doet vermoeden.
Beste allen,
Het script werkt nu op 1 ding na.
Als ik zoek dan laat hij idd de eerste 10 resultaten zien op de eerste pagina.
Als ik bijvoorbeeld zoek op the beatles (waar ik 28 nummers van heb) dan vindt hij idd 28 nummers verspreid over 3 pagina's wat ook klopt.
Maar op pagina 2 krijg ik 18 resultaten en op pagina 3, 8 resultaten.
Die 8 resultaten op pagina 3 zijn ook de laatste 8 resultaten van pagina 2.
Ik dacht dat hij op pagina 2 ook 10 resultaten moet laten zien en de rest op pagina 3.
Het wordt misschien duidelijker om dit te laten zien op https://www.mulasquez.nl/index.php/hoefvinyl/
en dan zoeken op beatles.
Maar bedankt met de hulp ik ben nu een stuk verder.
Met vriendelijke groet,
Hans Hermes
Want op de eerste page laat hij netjes eerste 10 records zien, op 3e page netjes laatste 8.
Maar op page 2 laat hij de 10e t/m 28e rijen zien, maar dit moet zijn 10e t/m 20e rij
Op page 2 zijn de variabelen $per_page = 10; en $page = 2;
Dan krijg je dus $row_end = 10 * 2 = 20;
$num_rows moet als het goed is 28 zijn.
if (20 > 28) wat niet is, dan zet $row_end = $num_rows;
Het lijkt erop, dat hij wel de $row_end op $num_rows zet, wat vreemd is.
De query gebruikt een "LIMIT (offset), (show_records)" structuur.
Degene die jouw zoekcode heeft geschreven denkt dat de LIMIT anders werkt. Namelijk LIMIT begin, eind
Pas eens regel
$sql .= " ORDER BY artiest ASC LIMIT $row_start ,$row_end ";
aan naar
$sql .= " ORDER BY artiest ASC LIMIT $row_start ,$per_page";