login  Naam:   Wachtwoord: 
Registreer je!
 Forum

paginanummer systeem

Offline prienstra - 05/10/2008 09:47
Avatar van prienstraMySQL interesse Gisteren ben ik fijn geholpen met een code nu wil ik in deze code een paginanummeringssysteem inbouwen, maar dat gaat me niet goed af. Ik gebruik deze tutorial.

Ik heb nu:
Plaatscode: 31438

Weet iemand waar de fout zit?

18 antwoorden

Gesponsorde links
Offline zointer - 06/10/2008 04:41
Avatar van zointer HTML gevorderde
prienstra schreef:
[peut....]

Weet iemand waar de fout zit?

welke fout krijg je?
Offline prienstra - 06/10/2008 08:03
Avatar van prienstra MySQL interesse bij openen pagina worden de items uit de databasr geladen. pagina 1 krijg ik met bv 2 items (ingesteld in script), wil ik naar de volgende pagina, dan krijg ik geen items te zien. Wanneer ik terug ga naar de beginpagina krijg ik ook niks meer te zien.
Offline Kr4nKz1n - 06/10/2008 10:11
Avatar van Kr4nKz1n Onbekend Werkt zo niet.

Heb geen highlight.
Offline prienstra - 06/10/2008 10:52
Avatar van prienstra MySQL interesse wat bedoel je met highlight?
Offline Kr4nKz1n - 06/10/2008 10:59
Avatar van Kr4nKz1n Onbekend http://www.plaatscode.be/31438

Gewoon alles zwart, hieruit kan ik niks opmaken. Zorg dat alles wordt gehighlight met <?php
Offline prienstra - 06/10/2008 11:10 (laatste wijziging 06/10/2008 11:11)
Avatar van prienstra MySQL interesse Wellicht kan je nu iets vinden, want ik kom er niet meer uit :-(

  1. <?
  2. $res1 = mysql_query("SELECT COUNT(id) FROM zaak") or die("res1: ".mysql_error()); // vraag het AANTAL items op
  3. $items_totaal = mysql_result($res1, 0); // het totaal aantal items
  4. mysql_free_result($res1); // geef het resultaat vrij
  5.  
  6. $items_per_pagina = 2; // vrij te kiezen
  7. $aantal_paginas = ceil($items_totaal / $items_per_pagina); // het aantal items per pagina
  8.  
  9. // de huidige pagina opvragen
  10. $huidige_pagina = 0; // default
  11. if(isset($_GET['pagina']) && is_numeric($_GET['pagina']) && $_GET['pagina'] > 0 && $_GET['pagina'] < $aantal_paginas) {
  12. $huidige_pagina = $_GET['pagina'];
  13. } }
  14. ?>
  15.  
  16. <?
  17. if($_SERVER['REQUEST_METHOD'] == 'POST'){
  18. $sQuerystring = 'SELECT * FROM zaak WHERE ';
  19. $aWheres = array();
  20. if(isset($_POST['land']) && trim($_POST['land']) != ''){
  21. $aWheres['land'] = $_POST['land'];
  22. }
  23. if(isset($_POST['provincie']) && trim($_POST['provincie']) != ''){
  24. $aWheres['provincie'] = $_POST['provincie'];
  25. }
  26. if(isset($_POST['plaats']) && trim($_POST['plaats']) != ''){
  27. $aWheres['plaats'] = $_POST['plaats'];
  28. }
  29.  
  30. foreach($aWheres AS $kolom => $waarde){
  31. $sQuerystring .= $kolom."='".$waarde."' AND ";
  32. }
  33. $sQuerystring = substr($sQuerystring, 0, (strlen($sQuerystring) - 4));
  34. $offset = $huidige_pagina * $items_per_pagina;
  35. $sQuerystring .= " ORDER BY id ASC LIMIT ".$offset.",".$items_per_pagina."";
  36.  
  37. ?>
  38.  
  39. <?
  40. if($iResults > 0)
  41. {
  42.  
  43. for($i = 0; $i < $aantal_paginas; $i++) {
  44. if($huidige_pagina == $i) {
  45. // huidige pagina is niet klikbaar
  46. echo "<b>".($i+1)."</b>";
  47. } else {
  48. // een andere pagina dan de huidige is wel klikbaar
  49. echo "<a href=\"".$_SERVER['PHP_SELF']."?pagina=".$i."\">".($i+1)."</a>";
  50. }
  51. // deel-streepje tussen alle items
  52. if($i < $aantal_paginas - 1) {
  53. echo " - ";
  54.  
  55. }
  56.  
  57. }
  58.  
  59.  
  60. }
  61. ?>
Offline Kr4nKz1n - 06/10/2008 11:31
Avatar van Kr4nKz1n Onbekend Echo offset, zodat je weet waar hij begint.

Zelf kijken of je kan debuggen.
Offline prienstra - 06/10/2008 13:35
Avatar van prienstra MySQL interesse ik vermoed dat het te maken heeft met de:
if($_SERVER['REQUEST_METHOD'] == 'POST')
Als je dan naar een andere pagina gaat, is er geen input meer. Dus is er een lege pagina.

Hoe kan ik het oplossen dat alles wordt ge-post wordt, onthouden wordt?
Offline Mythix - 06/10/2008 13:52 (laatste wijziging 06/10/2008 13:56)
Avatar van Mythix Nieuw lid Kan op verschillende manieren:
Je slaat alles op de server op in een session;
Je slaat alles op in een cookie, wat me niet aangewezen lijkt aangezien de client dit kan uitschakelen;
Of je zet de waardes in je querystring in de link, dit vereist wel dat je ipv $_POST['variabele'] een alternatieve functie of ideaal gezien een classe moet maken om de variabelen op te vragen bv:
  1. <?php
  2. class Myrequest
  3. {
  4. function getVar( $varName, $type = null, $default = null ){
  5. //value ophalen uit post, get en eventueel een config file
  6. if (isset($_POST[$varName]) $value = $_POST[$varName];
  7. if (isset($_GET[$varName]) $value = $_GET[$varName];
  8.  
  9. //eventueel types checken
  10. switch ($type){
  11. case 'int':
  12. if (!is_numeric( $value )) $value = false;
  13. break;
  14. }
  15. //eventuele default value
  16. if ($default && !$value){
  17. $value = $default;
  18. }
  19. return $value;
  20. }
  21. }
  22. ?>

zo kan je makkelijk je request vars zuiveren van slechte user input op globale basis

  1. <?
  2. $huidige_pagina = Myrequest::getVar( 'pagina', 'int', 0);
  3. ?>


Dit is ook beter naar sucurity toe, aangezien je dit altijd kan gebruiken om variabelen op te vragen uit een POST of GET, en deze gegevens zijn van onbetrouwbare bron (de gebruiker)

door het in een klasse te steken kan je het makkelijk hergebruiken en uitbreiden zodat je het bij elk script dat je maakt kan gebruiken
Offline Kr4nKz1n - 06/10/2008 14:09
Avatar van Kr4nKz1n Onbekend Alleen nu de vraag waarom een classe voor dit stukje? Een simpele functie is toch ook genoeg. Vooral als prienstra niet met classes werkt.
Offline prienstra - 06/10/2008 14:14
Avatar van prienstra MySQL interesse zal een session in dit geval het makkelijkste / beste zijn of niet?
Offline Mythix - 06/10/2008 14:36 (laatste wijziging 06/10/2008 14:38)
Avatar van Mythix Nieuw lid
Kr4nKz1n schreef:
Alleen nu de vraag waarom een classe voor dit stukje? Een simpele functie is toch ook genoeg. Vooral als prienstra niet met classes werkt.


omdat een klasse de code herbruikbaar maakt en makkelijk uit te breiden, zo kan je makkelijk een setVar() functie toevoegen, of een getPost() functie die alle post data ophaalt en hem zuiverd van eventuele SQLinjecties...

Je kan deze classe kopieren naar elke website, elk script dat je wil maken, zeker geen verloren moeite om dit dan even in een klasse te steken

De toekomst van PHP ligt zowizo al bij OOP, dit wordt versterkt door het nieuwe DOM van php 5 en het allomtegewoordig gebruik van XML&webservices.

Trouwens een klasse als deze kan je toch makkelijk implementeren in een proceduraal script, je include gewoon de classe file en gebruikt de statische aanroep naar getVar ipv dat je de $_POST global gebruikt.

@ prienstra: wat het beste / makkelijkste is dat valt binnen jouw persoonlijke keuze, aangezien je de stap naar OOP nog niet gezet hebt is het voor jouw waarschijnlijk makkelijker om de data op te slagen in sessions
Offline prienstra - 07/10/2008 14:34 (laatste wijziging 07/10/2008 14:35)
Avatar van prienstra MySQL interesse is er een voorbeeld hoe je een sessie kan aanmaken met een zoekformulier?
Zodat er op geslagen wordt waarop gezocht wordt?
Offline TomJansen - 08/10/2008 02:19 (laatste wijziging 08/10/2008 10:45)
Avatar van TomJansen Nieuw lid Wat zou je met die sessie doen dan?

prienstra schreef:
Gisteren ben ik fijn geholpen met een code nu wil ik in deze code een paginanummeringssysteem inbouwen, maar dat gaat me niet goed af. Ik gebruik deze tutorial.

Ik heb nu:
Plaatscode: 31438

Weet iemand waar de fout zit?

Uh, wat is de fout dan?

(Mijn punt is, zonder nadere uitleg ga ik toch niet je code doorspitten om te raden wat je verwacht en en wat je daadwerkelijk krijgt?)

De fout is vast dat je de variabele $iResults verkeerd hebt gespeld. Ik gok namelijk dat je het aantal resultaten in een variabele genaamd $iResultz hebt zitten; dat kan ik niet zien maar dat zal het vast wel zijn.

Sorry ik doe een beetje lullig.

Je bouwt heel mooi een query op in $sQuerystring, maar misschien ben je wel glad vergeten om mysql_query($sQuerystring) aan te roepen? Wie zal het zeggen.

Nee nou heb ik de fout gevonden: je site is natuurlijk gehackt middels SQL-injectie:
  1. $aWheres = array();
  2. if(isset($_POST['land']) && trim($_POST['land']) != ''){
  3. $aWheres['land'] = $_POST['land'];
  4. }
  5. if(isset($_POST['provincie']) && trim($_POST['provincie']) != ''){
  6. $aWheres['provincie'] = $_POST['provincie'];
  7. }
  8. if(isset($_POST['plaats']) && trim($_POST['plaats']) != ''){
  9. $aWheres['plaats'] = $_POST['plaats'];
  10. }
  11.  
  12. foreach($aWheres AS $kolom => $waarde){
  13. $sQuerystring .= $kolom."='".$waarde."' AND ";
  14. }


Het kan gewoon van alles zijn... zonder uitleg kan echt niemand je helpen hoor...
"dat gaat me niet goed af"
Wat verwachtte je te zien en wat kreeg je te zien?

Ik heb nog wel een performance tip voor bij de paginering: Google eens op SQL_CALC_FOUND_ROWS, die is reuze handig  
Offline prienstra - 08/10/2008 12:33
Avatar van prienstra MySQL interesse Beste TomJansen,
bedankt voor je reactie. De zoekformule werkt gewoon goed.
Maas als ik een paginanummer met vorige - volgende wil toevoegen, gaat het fout.
Bij het kiezen van een volgende pagina krijg ik een lege pagina.

Zoals eerder gepost, vermoed ik dat het ligt aan dat er waardes gepost worden, en dat die niet meegenomen worden.

Als je wil kan ik ook wel eens de gehele script posten.
Offline TomJansen - 08/10/2008 15:48 (laatste wijziging 08/10/2008 23:09)
Avatar van TomJansen Nieuw lid Oeps, ik ben hier nieuw en moet nog een beetje wennen aan het forum, had totaal niet gezien dat dit al de tweede pagina van de topic is! Foutje...

Je zegt dat het zoeken wel werkt maar als je dan doorklikt naar de volgende pagina dat je dan een lege pagina krijgt.
Kijk zo komen we verder, nou zullen we eens een kijkje nemen naar die paginalinks.

Je pakt de paginanummer, indien present, uit GET.
En je pakt de zoekresultaten uit POST.
Dat gaat de eerste keer goed, dus als de gebruiker net van het formulier kwam.
Want als de gebruiker het formulier invult dan wordt dat opgestuurd middels POST.

Hier schrijf je de link naar de volgende pagina:
  1. echo "<a href=\"".$_SERVER['PHP_SELF']."?pagina=".$i."\">".($i+1)."</a>";


De paginanummer wordt dan doorgegeven in de URL, dus die zal beschikbaar zijn in GET.
De zoekcriteria in POST wordt echter niet doorgegeven! Dat gaat verloren.
Sterker nog, de conditie ($_SERVER['REQUEST_METHOD']=='POST') zal false zijn want als de gebruiker op een link klikt, dan is de requestmethode "GET".

Mogelijke oplossingen:

- Inderdaad, mogelijk is het met die sessie. Bij ($_SERVER['REQUEST_METHOD']=='POST') doe je dan de zoekcriteria opslaan in de sessie; en bij else oftewel ($_SERVER['REQUEST_METHOD']=='GET') doe je dan het paginanummer uitlezen uit GET en de zoekcriteria uit de sessie.
Maar dan lijkt me persoonlijk niet het handigste.

- Een andere oplossing zou zijn dat je de zoekcriteria opgeeft via GET. Dan moet je ten eerste het formulier aanpassen zodat het formulier een GET-request genereert i.p.v. een POST-request: je hebt ergens een stukje HTML ongeveer als: <form method="post" action="zoeken.php">. Dan moet je method="post" weghalen of vervangen door method="get".
Ten tweede moet je dan in de zoekscript overal $_POST vervangen door $_GET.

- Nog een andere oplossing zou zijn dat je de zoekcriteria steeds doorgeeft via POST. Als je dan een link naar de volgende pagina schrijft, dan moet dat niet een gewone <a> link zijn, maar een formulier <form method="post" action="url">. Met hidden inputs kan je dan de zoekcriteria doorgeven. Paginanummer kan eventueel in de URL (dus dan komt het in GET), of ook in een hidden input (dan komt het in POST).

En als je nou dit:
$aWheres['land'] = $_POST['land'];
vervangt door:
$aWheres['land'] = mysql_real_escape_string($_POST['land']);
en hetzelfde bij provincie, plaats, etc... dan is je site meteen beveiligd tegen SQL-injecties :-)
Offline Kr4nKz1n - 09/10/2008 08:35
Avatar van Kr4nKz1n Onbekend
TomJansen schreef:
Oeps, ik ben hier nieuw en moet nog een beetje wennen aan het forum, had totaal niet gezien dat dit al de tweede pagina van de topic is! Foutje...

Sukkel  
Offline TomJansen - 14/10/2008 10:43
Avatar van TomJansen Nieuw lid Komt omdat de openingspost op elke pagina staat, i.p.v. alleen op de eerste. Ben phpbb3 gewend 
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.271s