onveranderbare entries!?

Status
Niet open voor verdere reacties.

henk11

Gebruiker
Lid geworden
29 jul 2007
Berichten
27
Hallo,

Dit kan volgens mij nogal een ingewikkelde vraag zijn, dus zal ik eerst alles even uitleggen:

Over wat voor script hebben we het en wat is er mis mee:

Het is in feite een zoekmachine. Het werkt met FULLTEXT. Er wordt op de ene pagina iets ingevoerd en op de andere pagina krijg je dan zoiets: anderepagina.php?words=(de woorden die zijn ingevuld). Die woorden die zijn ingevuld worden er met $_GET uitgehaald en in een fulltext-query gestopt. Dan worden door middel van de rest van het script de resultaten op het scherm geladen, en er wordt paginanummering toegevoegd. Daar zit het probleem: je hebt bijv. dit: pagina 1.. 2.. einde. Dan staat er bijv. op pagina 1 dit:
"hallo" en op pagina 2 zou dan bijv. "doei" moeten staan. Maar dat is niet zo: op pagina 2 staat dan ook gewoon "hallo"!! Het is dus in feite een onveranderbare entry!

Het script zelf:
Dit is het script zelf:
PHP:
/********
*    Show all errors
********/
error_reporting(E_ALL);
ini_set("display_errors", 1);

//link_id even uitleggen
$link_id = mysql_connect 
// je weet wel wat er nu komt

//variabelen defineren
define("MIN_PER_PAGE", 5);
define("MAX_PER_PAGE", 20);
define("DEF_PER_PAGE", 10);
define("THIS_PAGE", $_SERVER['PHP_SELF']);

class Page_numbers {
    
    var $table = "VGB_ENTRY";
    var $condition = "WHERE ''";
    var $total_records;
    var $mpp;
    var $total_pages;
    var $page;
    var $offset;
    var $query_string;


//variabelen uitleggen

    function Page_numbers($table, $condition="", $link_id=NULL)
    {
        $this->table = $table;
        $this->condition = $condition;
        $this->link_id = $link_id;
        $countdata = $this->fetch_data("COUNTRY");        
        $this->total_records = count($countdata);
        $this->mpp = isset($_GET['mpp']) && is_numeric($_GET['mpp']) &&      $_GET['mpp'] >= MIN_PER_PAGE && $_GET['mpp'] <= MAX_PER_PAGE ? $_GET['mpp'] : DEF_PER_PAGE;
        $this->total_pages = ceil($this->total_records / $this->mpp);
        $this->page = isset($_GET['page']) && is_numeric($_GET['page']) && $_GET['page'] > 0 && $_GET['page'] <= $this->total_pages ? $_GET['page'] : 1;
        $this->offset = ($this->page - 1) * $this->mpp;
        $this->query_string = $this->get_query_string();
   }
	
	//data verzamelen uit de database
    function fetch_data()
    {
$data = "";
$searchstring = mysql_real_escape_string($_GET['words']);
$res = mysql_query("SELECT
COUNTRY, 
ENTRY, 
EMAIL,
HIDEEMAIL,
MATCH( COUNTRY, ENTRY ) AGAINST ( '$searchstring' ) AS score 
FROM 
VGB_ENTRY 
WHERE 
MATCH( COUNTRY, ENTRY ) AGAINST ( '$searchstring' IN BOOLEAN MODE) 
AND UNMODERATED = 0
ORDER BY 
score DESC");  

while($row = mysql_fetch_assoc($res))
        {
            $data[] = $row;
        }
        return $data;	
	}

	
//string opmaken
    function get_query_string($query_string="")
    {
        foreach($_GET as $key => $value)
        {
            if($key != 'page' && $key != 'mpp')
            {
                $query_string .= '&amp;'.$key.'='.$value;
            }
        }
        return $query_string;
    }



//Message Per Page upmaken en terug geven.
   
    function show_mpp()
    {
        $str = '<script type="text/javascript" language="javascript1.5">
        <!--
        function openUrl()
        {
            var control = document.getElementById(\'mpp\');
            window.location = "'.THIS_PAGE.'?page=1&mpp="+control.options[control.selectedIndex].value+"'.str_replace('&amp;', '&', $this->query_string).'";
        }
        //-->
        </script>
        <select id="mpp" onchange="openUrl();">';
        
        for($i=MIN_PER_PAGE; $i<=MAX_PER_PAGE; $i+=5)
        {
            $str .= '<option value="'.$i.'"'.($i == $this->mpp ? ' selected="selected"': '').'>'.$i.'</option>'."\r\n";
        }
        
        return $str.'</select>';
    }        



//Previous & Next links

    function prev_next()
    {
        $str = ($this->page > 1) ? '<a href="searchresults.php?page='.($this->page-1).'&amp;mpp='.$this->mpp.$this->query_string.'" title="Previous Page">&laquo;&laquo;previous</a>' : '<span style="color:#aaa">&laquo;&laquo;previous</span>';
        $str .= '&nbsp;&nbsp;&nbsp;';
        $str .= ($this->page < $this->total_pages) ? '<a href="searchresults.php?page='.($this->page+1).'&amp;mpp='.$this->mpp.$this->query_string.'" title="Next Page">next&raquo;&raquo;</a>' : '<span style="color:#aaa">next&raquo;&raquo;</span>';
    
        return $str;
    }



//Pagenumbers opmaken en weergeven 
    function show_page_numbers($num_page_links=7)
    {
        if($this->total_pages > 1)
        {
            $num_page_links = $num_page_links % 2 ? $num_page_links : $num_page_links + 1;
            
            $pagenumbers = 'Page: <strong>'.$this->page.'</strong> of '.$this->total_pages.'<br />';
            
            if($this->total_pages > $num_page_links)
            {
                
                $cutoff = floor($num_page_links / 2);
                
                $start = $this->page - $cutoff;
                $end   = $this->page + $cutoff;


                /********
                *    No Pagenumbers Less then 1 && Greater then total_pages
                ********/
                while($start < 1)                    { $start++; $end++; }
                while($end > $this->total_pages)    { $start--; $end--; }


                /********
                *    Pagina nummers opmaken en uitspugen
                ********/
                if($this->page > $cutoff + 1) { $pagenumbers .= '<a href="'.THIS_PAGE.'?page=1&amp;mpp='.$this->mpp.$this->query_string.'" title="First Page (1)">...</a>&nbsp; '; }
                
                for($i=$start; $i<=$end; $i++)
                {
                    $pagenumbers .= ($i == $this->page) ? '<strong style="text-decoration:underline;">'.$i.'</strong>&nbsp; '."\r\n" : '<a href="'.THIS_PAGE.'?page='.$i.'&amp;mpp='.$this->mpp.$this->query_string.'" title="Go to Page '.$i.'">'.$i.'</a>&nbsp; '."\r\n";
                }
                
                if($this->page < $this->total_pages - $cutoff) { $pagenumbers .= '<a href="'.THIS_PAGE.'?page='.$this->total_pages.'&amp;mpp='.$this->mpp.$this->query_string.'" title="Last Page ('.$this->total_pages.')">...</a>&nbsp; '; }
                
            }
            else
            {
                for($i=1; $i<=$this->total_pages; $i++)
                {
                    $pagenumbers .= ($i == $this->page) ? '<strong style="text-decoration:underline;">'.$i.'</strong>&nbsp; '."\r\n" : '<a href="'.THIS_PAGE.'?page='.$i.'&amp;mpp='.$this->mpp.$this->query_string.'" title="Go to Page '.$i.'">'.$i.'</a>&nbsp; '."\r\n";
                }
            }
            return rtrim($pagenumbers);
        }
        else
        {
            return NULL;
        }
    }


}

/********
*    Pagina nummering aanroepen
********/
$page_nums = new Page_numbers("guestbook", "WHERE blocked='N'", $link_id);
$page_numbers = $page_nums->show_page_numbers(7);
$mpp = $page_nums->show_mpp();
$prev_next = $page_nums->prev_next();
$data = $page_nums->fetch_data("COUNTRY", "ORDER BY score DESC");
$data2 = $page_nums->fetch_data("EMAIL", "ORDER BY score DESC");
$data3 = $page_nums->fetch_data("ENTRY", "ORDER BY score DESC");
$data4 = $page_nums->fetch_data("HIDEEMAIL", "ORDER BY score DESC");
$searchstring = mysql_real_escape_string($_GET['words']);

if (strlen($searchstring) <=3 || $data3 == "" || strlen($searchstring) >=254) {
    echo '
	<table width="600" style="height: 400px" align="center">
<tr>
  <td valign="middle" align="center">
  <span>
  <h3>No matches were found,</h3> 
  <h4>here\'s a list of possible reasons for that:</h4><br />
  <ul>
  <li><p><font face="arial" color="#0000ff" size="2">There just isn\'t an URL that matches your search</font></p></li>   
  <li><p><font face="arial" color="#0000ff" size="2">Your search was too short: it has to be at least 4 characters long</font></p></li>
  <li><p><font face="arial" color="#0000ff" size="2">Your search exceeded the limit of 254 characters</font></p></li>
 </span>
</td>
</tr>
</table>';
} else {
/********
*    Pagina Nummers en Berichten Per Pagina uitspugen naar browser
********/
 echo '<table cellpadding="0" cellspacing="0" style="width:450px;">
    <tr>';
echo '<td align="left" style="position: static;">';
echo  $page_numbers;
echo '</td></tr></table><table style="margin-top:-25px; margin-bottom:20px; width:200px; margin-left:400px;"><td>Messages Per Page: '.$mpp.'</td>
</table>';

/********
*    Data uitspugen naar de browser
********/
$totalentries = count($data);
$Emailishidden = "This e-mail is hidden";
echo '<div id="maxwidthfix">';
for ($x=0;$x < ($totalentries);$x++) 
{ 
echo '<table><tr>
      <td bgcolor="#FFFFFF" width="600" height="3">
      </td></tr></table>';
echo '<table border="0" cellspacing="0" cellpadding="1">
      <tr>
      <td bgcolor="#AFAFAF" align="left" width="600">';
echo '<a target="_blank" href="http://';
echo $data[$x]['COUNTRY'];
echo '">'; 
echo $data[$x]['COUNTRY'];
echo '</a>';
echo '</td></tr>
      <tr>
      <td bgcolor="#DFDFDF" align="left">';
echo $data3[$x]['ENTRY'];
echo '</td></tr></table>';
if ($data4[$x]['HIDEEMAIL'] == 0) {      
echo '<table border="0" cellspacing="0" cellpadding="1">
      <tr>
      <td bgcolor="#AFAFAF" align="left" width="600">';
echo $data2[$x]['EMAIL']; 
echo '</td></tr></table>';
} else {
echo '<table border="0" cellspacing="0" cellpadding="1">
      <tr>
      <td bgcolor="#AFAFAF" align="left" width="600">';
echo $Emailishidden; 
echo '</td></tr></table>';
}
}

echo '<BR /><div style="margin-left: 67px;">
//hier stond een google script, ads
echo '</div></div>';

/********
*    Previous & Next Links
********/
echo '<br /><div style="margin-bottom:20px; margin-left: 230px;">'.$prev_next;
echo '</div>';
}
ik weet dat het een beetje een lang script is, maar anders denk ik dat het bij jullier niet echt duidelijk wordt.

Vraag:
Weet iemand waar hier de fout kan zitten en wat eraan gedaan kan worden?

Alvast bedankt!
 
Laatst bewerkt:
Hey..

tip: plaats de code tussen
PHP:
 en
dat leest een stuk makkelijker...

Er zit geen fout aan de query overigens, want je vraagt altijd aan de database het antwoord op je vraag (query). Wat je wilt weten is een deel van de query...

Dit is op te lossen door het volgende aan je statement toe te voegen

LIMIT $volvor, X

deze $volvor is de eerste rij in van je uitkomst. De X is het aantal resultaten die je op de pagina wilt hebben.
Aan je PHP-pagina wil je dan een post of get-waarde toevoegen, waarbij je meegeeft op welke pagina je zit. Deze pagina vermenigvuldig je met X (dus het aantal waardes op een pagina) > uitkomst is je $volvor (of hoe je het wil noemen)

Let wel op dat op pagina 1 je 0 tot 20 wilt... Dus pagina 1 is eigenlijk 0 (of X-1)
 
Bedankt! ik had nog niet aan LIMIT gedacht. Trouwens ik had alles al tussen <?php en ?> staan, maar hier moet dat met vBcode, dus ff wenne. Dus eigenlijk bedoel je ongeveer hetzelfde als dit:
PHP:
/******** 
*    Data uitspugen naar de browser 
********/ 
$totalentries = count($data); 
$Emailishidden = "This e-mail is hidden"; 
echo '<div id="maxwidthfix">'; 
for ($x=0;$x < ($totalentries);$x++) 
{

(alleen dat iets anders natuurlijk). Verder is het heel duidelijk uitgelegd, maar ik snap dit gedeelte niet:
deze $volvor is de eerste rij in van je uitkomst
En nog een vraagje: bij LIMIT $volvor, X. Moet het dan niet $x zijn?

En nog een: ik heb je idee nog eens heel goed doorgelezen en toen dacht ik dit:
je zit op pagina 2, je wilt 10 resultaten per pagina: $volvor=20, X=10? Dan geef je alles achterstevoren weer toch?
of je zit op pagina 10 en je wilt 20 resultaten per pagina: $volvor=200, X=20!?
Dat komt niet echt overeen met dit: http://php.about.com/od/mysqlcommands/g/Limit_sql.htm

zou je dit nader uit kunnen leggen. Nogmaals bedankt!
 
Laatst bewerkt:
Ik snap het niet precies, ik ben vandaag slecht in abstract kijken. Het lijkt erop dat je die code gebruikt om de resultaten te posten in html?

Ik zat eigenlijk meer aan een fixed-aantal te denken...


in je browser komt: pagina.php?paginanummer=GETAL&zoekopdracht=..................

je vraagt bovenaan heel simpel op
PHP:
$pagina = $_GET['paginanummer']
vervolgens
PHP:
$volvor = X * $_GET['pid'];

waarbij X gewoon het nummer is met het aantal resultaten dat je per pagina wilt hebben...
dit gebruik je daarna in je SQL query

PHP:
$sql = 'SELECT * FROM tabel WHERE blabla LIMIT $volvor, X

Het resultaat is dan een klein stukje uit de database, die je op je website kan posten.
Als ik jouw code goed begrijp, kan je dan $totalentries vervangen door je statische X

uitbreiden kan natuurlijk ook, dan is je statische X een variabale $aantalresultaten die je beinvloed door een knopje en ook weer terugkomt in een $_GET of $_POST waarde =)
 
Misschien heb je iets aan deze [engels] tutorial? Hierin wordt volgens mij hetgeen waarover mrniceguy2002 praat uitgelegd...
 
Ik zal wel een voorbeeldje geven van wat ik nu ongeveer heb:

PHP:
    function fetch_data() 
    { 
$data = ""; 
$searchstring = mysql_real_escape_string($_GET['words']); 

$messageperpage = isset($_GET['mpp']) && ctype_digit($_GET['mpp']) && $_GET['mpp'] >= MIN_PER_PAGE && $_GET['mpp'] <= MAX_PER_PAGE ? $_GET['mpp'] : 10;; 
$pagina = $this->page; 
$start = (($pagina-1)*$messageperpage); 
  
$res = mysql_query("SELECT 
COUNTRY, ENTRY, EMAIL, HIDEEMAIL, 
MATCH( COUNTRY, ENTRY ) AGAINST ( '$searchstring' ) 
AS score FROM VGB_ENTRY WHERE MATCH( COUNTRY, ENTRY ) AGAINST ( '$searchstring' IN BOOLEAN MODE) 
AND UNMODERATED = 0 ORDER BY score DESC 
LIMIT 0, 10 ") or die("res:". mysql_error()); 

echo 'DIt is start'; 
echo $start; 
echo 'Dit is mpp'; 
echo $messageperpage; 

while($row = mysql_fetch_assoc($res)) 
        { 
            $data[] = $row; 
        } 
        return $data;    
    }
(en a.u.b. geen commentaar op de hoofdletters in de query moet ik nog veranderen.) Dan krijg ik deze echo:

DIt is start-10Dit is mpp10DIt is start0Dit is mpp10DIt is start0Dit is mpp10DIt is start0Dit is mpp10DIt is start0Dit is mpp10

Zoals je ziet is de eerste start anders dan de tweede, hoe los ik dit op, of nog beter: hoe kan dit?
 
PHP:
$messageperpage = isset($_GET['mpp']) && ctype_digit($_GET['mpp']) && $_GET['mpp'] >= MIN_PER_PAGE && $_GET['mpp'] <= MAX_PER_PAGE ? $_GET['mpp'] : 10;;

dit moet waarschijnlijk in een if staan?
je geeft $messageperpage nu een heeeeeeeeeeeele gare waarde (die ik niet snap XD)

waarschijnlijk is het de eerste keer 0... 0 - 1 = -1... * 10 is -10...
2e keer geeft die waarschijnlijk wel 1... (-1 * 10 = 0)

ik weet niet of je paginawaarde standaard wordt meegegeven, zoniet dan moet hij 1 krijgen als hij leeg is, anders de waarde van je $_GET[]

je kan ook gewoon je $messageperpage in je header plaatsen (naast de begin waarde)
dan heb je gewoon een variabele voor de pagina's en een variabele voor je mpp, beide uit je header...

je functie fetch_data() roep je daarnaast misschien ook vaker op?
 
In de header zetten werkt in ieder geval niet: misschien zou je een voorbeeldje kunnen geven van hoe dit gedeelte wel moet:

PHP:
$messageperpage = isset($_GET['mpp']) && ctype_digit($_GET['mpp']) && $_GET['mpp'] >= MIN_PER_PAGE && $_GET['mpp'] <= MAX_PER_PAGE ? $_GET['mpp'] : 10;

Hier nog wat extra info:

define("MIN_PER_PAGE", 5);
define("MAX_PER_PAGE", 20);

Trouwens, er wordt toch al een extra waarde meegegeven als er niks met de $_GET kan worden gedaan : 10;

Maar zou je a.u.b. een voorbeeldje kunnen geven van hoe het het beste kan, want volgens mij is dit idd niet echt goed.
 
Euh.. dat ziet er voor mij uit als abacadabra =) veel te abstract

ik denk dat je iets als volgend wilt

PHP:
if(isset($_GET['pagina'])){
    $start = $_GET['pagina'];
} else { $start = 1; }
if(isset($_GET['mpp']) && (($_GET['mpp'] < 10) && ($_GET['mpp'] > 5)){
    $messageperpage = $_GET['mpp'];
} else { $messageperpage = 10; }

en nee.. niet in de header, ik bedoelde natuurlijk je link cq adresbalk =)
squsemoi
 
Het werkt nu eindelijk, bedankt voor de hulp, nog even wat beveiliging inbouwen en dan ben ik er bijna want er is nog een probleempje: de paginanummering doet het nu niet meer, maarja dat los ik zelf wel op en als dat niet zou mogen lukken horen jullie nog wel van me in dit topic:P
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan