/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
5 links pr. side -> Script Problem...!
Fra : Bo Larsen


Dato : 04-04-03 14:00

Hej

Jeg har et problem med mit Søge script.
Søge scriptet vil ikke vise noget, når man klikker Næste
Dvs. den viser kun 5 links på den første side og ikke de andre f.eks. 3
links på den anden side.


Hvad kan fejlen være..?

Noget at koden:

$pr_side = "5"; //Definerer antal resultater pr. side

if($_POST[search]){
connect_db();

if (!isset($s)) {
$s = "0"; //Tjekker om $s - som står for start - er sat, hvis ikke
sættes den
}

echo "<table border='1'>\n";
echo "<tr><td>Id</td><td>Bogstav</td></tr>\n";

$query = mysql_query("select id from alfabetet where bogstav like
'$_POST[search]%' order by id asc limit $s,$pr_side") or die(mysql_error());
$nr = mysql_num_rows($query);

if ($nr > 0) {

while($row = mysql_fetch_array($query)){
echo "<tr><td>$row[id]</td><td>$row[bogstav]</td</tr>\n";
}

echo "<tr><td colspan='2'>";

$g_total = mysql_query("select count(id) as total from alfabetet where
bogstav like '$_POST[search]%'") or die(mysql_error());
$total = mysql_result($g_total,0);

if ($s >= $pr_side) { //Tjekker om værdien af $s er større eller lig
$pr_side
$previous_s = $s-$pr_side; //Regner ud hvor mysql skal starte hvis
forrige side kaldes
echo "<a href='?s=$previous_s'>Forrige</a> "; //Udskriver linket
}

$page = 1; //Definerer hvor sidetal skal starte
for($start=0; $total > $start; $start=$start+$pr_side){ //For-løkke der
kører indtil der ikke er nok rows til en side mere
if ($start != $s) { //Tjekker om linket vil komme til at pege på den
side man er på
echo "<a href='?s=$start'>$page</a> "; //...hvis ikke, udskrives
link med værdien af $page
} else { //Ellers, dvs. hvis linket vil pege på den side man er på..
echo "$page "; //...udskrives værdien af $page bare, altså ikke som
link
}
$page++; //Lægger en til $page til næste gang løkken køres
}

if ($total > $s+$pr_side) { //Tjekker om der er flere sider
$next_s = $s+$pr_side; //Regner ud hvor mysql skal starte hvis næste
side kaldes
echo "<a href='?s=$next_s'>Næste</a>"; //Udskriver linket "næste"
}

echo "</td></tr>\n";
echo "</table>\n";
}
}



 
 
Jesper Brunholm (07-04-2003)
Kommentar
Fra : Jesper Brunholm


Dato : 07-04-03 11:53

Bo Larsen wrote:
> Søge scriptet vil ikke vise noget, når man klikker Næste
> Dvs. den viser kun 5 links på den første side og ikke de andre f.eks. 3
> links på den anden side.

> Hvad kan fejlen være..?

Godt spørgsmål - du forklarer ikke dit problem, og hvad du selv har
prøvet ret godt, så det er ikke let at hjælpe.

Det _kunne_ dreje sig om at $s skal være $_GET['s'] i stedet?

> if (!isset($s)) {
> $s = "0"; //Tjekker om $s - som står for start - er sat, hvis ikke
> sættes den
> }

mvh

Jesper Brunholm

--
H.C. Andersen-Centret med nyt design: <http://www.andersen.sdu.dk/>
Phønix - dansk folk-musik fra unge musikere - <http://www.phonixfolk.dk/>


Bo Larsen (08-04-2003)
Kommentar
Fra : Bo Larsen


Dato : 08-04-03 21:08

Hvis jeg sætter $_GET['s'] ind i stedet for $s laver den en SQL fejl...

.....Info....
Søgemaskinen er sat op til at vise 5 resultater pr. side, dvs. hvis der er 7
resultater laver den et link til næste side.
Alt dette virker fint.

.....Problem.....
Men mit problem er at den ikke viser resultat nr. 6 og 7 på den næste side,
siden er helt blank.
Hvis jeg bruger scriptet "udenfor" søgemaskinen, dvs. til at vise nyheder
eller sådan noget, så virker det fint altsammen.

Jeg kan ikke helt gennemskue fejlen...

Jeg vil tro at problemmet er den måde den henter data fra databasen på..
Dvs. den åbenbart tror at den kun skal vise 5 resultater...

Håber du forstår hvad jeg mener...!




> Det _kunne_ dreje sig om at $s skal være $_GET['s'] i stedet?
>
> > if (!isset($s)) {
> > $s = "0"; //Tjekker om $s - som står for start - er sat, hvis ikke
> > sættes den
> > }
>
> mvh
>
> Jesper Brunholm
>
> --
> H.C. Andersen-Centret med nyt design: <http://www.andersen.sdu.dk/>
> Phønix - dansk folk-musik fra unge musikere - <http://www.phonixfolk.dk/>
>



Jesper Brunholm (08-04-2003)
Kommentar
Fra : Jesper Brunholm


Dato : 08-04-03 22:02

Bo Larsen wrote:
> Hvis jeg sætter $_GET['s'] ind i stedet for $s laver den en SQL fejl...

Det lyder absurd - hvis det er samme sted vi snakker om - jeg snupper
lige hele koden med en række kommentarer herunder. Noget andet er:
hvilken fejl?

Men inden da:
Det er en del lettere at svare når du svarer _under_ det du svarer på -
så kan man læse koden i sammenhæng. (også selv om jeg må tilstå at jeg
ikke gjorde det ).

Hold debatten her i gruppen - min mail har ikke noget med det at gøre.

> ....Info....
> Søgemaskinen er sat op til at vise 5 resultater pr. side, dvs. hvis der er 7
> resultater laver den et link til næste side.
> Alt dette virker fint.

Dvs - den laver linket. Står der det i linket, som der skal?

> ....Problem.....
> Men mit problem er at den ikke viser resultat nr. 6 og 7 på den næste side,
> siden er helt blank.
> Hvis jeg bruger scriptet "udenfor" søgemaskinen, dvs. til at vise nyheder
> eller sådan noget, så virker det fint altsammen.

Så må du jo prøve at lave det ligesom det udenfor, og så ændre skridt
for skridt - så kan du se hvor og hvornår det går galt. Det kan være
drøjt, så se nedenfor

Bo Larsen wrote:
> $pr_side = "5"; //Definerer antal resultater pr. side
>
> if($_POST[search]){

1) Hvorfor ikke if(isset eller if(!empty ?
2) det skal være $_POST['search'] (med anførselstegn - da det er en
streng, $mitArray[1] er kun ok fordi 1 er et tal)

> connect_db();
>
> if (!isset($s)) {

Det er _her_ du skal ha helt styr på om det er $s fra URL'en - som så er
$_GET['s'] - der skal bruges... Forskellen på $s og $_GET['s'] opstod
for ikke så afsindigt længe hvor den (dengang) nye PHP version ikke var
sat til at have register_globals til on som default. Det er smart, men
kan snyde hvis man ikke er obs på det.
(Keyword er 'register_globals' hvis du skal læse mere om det.)

> $s = "0"; //Tjekker om $s - som står for start - er sat, hvis ikke
> sættes den
> }

> echo "<table border='1'>\n";
> echo "<tr><td>Id</td><td>Bogstav</td></tr>\n";
>
> $query = mysql_query("select id from alfabetet where bogstav like
> '$_POST[search]%' order by id asc limit $s,$pr_side") or
die(mysql_error());

Det er jo nydeligt - og så alligevel:
1) hvis du bruger formen:
$MQuery="select id from alfabetet where bogstav like '$_POST[search]%'
order by id asc limit $s,$pr_side";

$query = mysql_query($MQuery) or die(mysql_error());

så har du (ret let) mulighed for at køre en

echo $MQuery;

og sikre dig at der kommer til at stå det du forventer i det du sender
til databasen.

2) "SELECT id FROM alfabetet WHERE bogstav LIKE...

er faktisk lettere at læse - brug det

> $nr = mysql_num_rows($query);
>
> if ($nr > 0) {

Det er faktisk helt overflødigt. While'en nedenfor skal nok lade være
med at gøre noget hvis der ikke er nogen rækker i $query.

> while($row = mysql_fetch_array($query)){
> echo "<tr><td>$row[id]</td><td>$row[bogstav]</td</tr>\n";

Hvor regner du med at den får 'bogstav' fra? - du har ikke bedt om den i
SQL'en

> }
>
> echo "<tr><td colspan='2'>";
>
> $g_total = mysql_query("select count(id) as total from alfabetet where
> bogstav like '$_POST[search]%'") or die(mysql_error());
> $total = mysql_result($g_total,0);
>
> if ($s >= $pr_side) { //Tjekker om værdien af $s er større eller lig
> $pr_side
> $previous_s = $s-$pr_side; //Regner ud hvor mysql skal starte hvis
> forrige side kaldes
> echo "<a href='?s=$previous_s'>Forrige</a> "; //Udskriver linket
> }
>
> $page = 1; //Definerer hvor sidetal skal starte
> for($start=0; $total > $start; $start=$start+$pr_side){ //For-løkke der
> kører indtil der ikke er nok rows til en side mere
> if ($start != $s) { //Tjekker om linket vil komme til at pege på den
> side man er på
> echo "<a href='?s=$start'>$page</a> "; //...hvis ikke, udskrives
> link med værdien af $page
> } else { //Ellers, dvs. hvis linket vil pege på den side man er på..
> echo "$page "; //...udskrives værdien af $page bare, altså
ikke som
> link
> }
> $page++; //Lægger en til $page til næste gang løkken køres
> }
>
> if ($total > $s+$pr_side) { //Tjekker om der er flere sider
> $next_s = $s+$pr_side; //Regner ud hvor mysql skal starte hvis næste
> side kaldes
> echo "<a href='?s=$next_s'>Næste</a>"; //Udskriver linket "næste"
> }
>
> echo "</td></tr>\n";
> echo "</table>\n";
> }
> }

Hvis alt det ovenfor ikke giver noget så må dit næste skridt vist blive
at sætte echo ind på fx $s et par gange undervejs, så du er sikker på at
variablerne indeholder det som du mener de skal indeholde

Jeg håber det hjalp

mvh

Jesper Brunholm


Bo Larsen (09-04-2003)
Kommentar
Fra : Bo Larsen


Dato : 09-04-03 17:50


Jeg har ændret i script koden og tilføjet nogle af dine ændringer..

Du kan prøve scriptet, se info om PHP Version og se den nye kode her:
http://www.thetop.1go.dk/side.php

Jeg håber jeg har besvaret den korrekt..
Læs nedenfor..


> Bo Larsen wrote:
> > Hvis jeg sætter $_GET['s'] ind i stedet for $s laver den en SQL fejl...
>
> Det lyder absurd - hvis det er samme sted vi snakker om - jeg snupper
> lige hele koden med en række kommentarer herunder. Noget andet er:
> hvilken fejl?
>
> Men inden da:
> Det er en del lettere at svare når du svarer _under_ det du svarer på -
> så kan man læse koden i sammenhæng. (også selv om jeg må tilstå at jeg
> ikke gjorde det ).
>
> Hold debatten her i gruppen - min mail har ikke noget med det at gøre.

Ja, det skal jeg nok...
Jeg kom bare til at besvar i stedet for svar til gruppe..

>
> > ....Info....
> > Søgemaskinen er sat op til at vise 5 resultater pr. side, dvs. hvis der
er 7
> > resultater laver den et link til næste side.
> > Alt dette virker fint.
>
> Dvs - den laver linket. Står der det i linket, som der skal?

Linket er som det skal være.. det bliver dog ikke vist på den næste side..

>
> > ....Problem.....
> > Men mit problem er at den ikke viser resultat nr. 6 og 7 på den næste
side,
> > siden er helt blank.
> > Hvis jeg bruger scriptet "udenfor" søgemaskinen, dvs. til at vise
nyheder
> > eller sådan noget, så virker det fint altsammen.
>
> Så må du jo prøve at lave det ligesom det udenfor, og så ændre skridt
> for skridt - så kan du se hvor og hvornår det går galt. Det kan være
> drøjt, så se nedenfor

Det har jeg prøvet.. og jeg har stadig ikke opfattet fejlen..
... men det kan også bare være mig, der er helt væk...

>
> Bo Larsen wrote:
> > $pr_side = "5"; //Definerer antal resultater pr. side
> >
> > if($_POST[search]){
>
> 1) Hvorfor ikke if(isset eller if(!empty ?
> 2) det skal være $_POST['search'] (med anførselstegn - da det er en
> streng, $mitArray[1] er kun ok fordi 1 er et tal)

Jeg har ændret det til if(isset ($_POST['search'])){

>
> > connect_db();
> >
> > if (!isset($s)) {
>
> Det er _her_ du skal ha helt styr på om det er $s fra URL'en - som så er
> $_GET['s'] - der skal bruges... Forskellen på $s og $_GET['s'] opstod
> for ikke så afsindigt længe hvor den (dengang) nye PHP version ikke var
> sat til at have register_globals til on som default. Det er smart, men
> kan snyde hvis man ikke er obs på det.
> (Keyword er 'register_globals' hvis du skal læse mere om det.)

Jeg har indsat $_GET['s'] i stedet for $s, men det har ikke hjulpet..
Den fejl der opstod før syldes at jeg brugte $_GET['s'] i stedet for
$_GET[s] inde i "select...."

>
> > $s = "0"; //Tjekker om $s - som står for start - er sat, hvis ikke
> > sættes den
> > }
>
> > echo "<table border='1'>\n";
> > echo "<tr><td>Id</td><td>Bogstav</td></tr>\n";
> >
> > $query = mysql_query("select id from alfabetet where bogstav like
> > '$_POST[search]%' order by id asc limit $s,$pr_side") or
> die(mysql_error());
>
> Det er jo nydeligt - og så alligevel:
> 1) hvis du bruger formen:
> $MQuery="select id from alfabetet where bogstav like '$_POST[search]%'
> order by id asc limit $s,$pr_side";
>
> $query = mysql_query($MQuery) or die(mysql_error());
>

Overstående er tilføjet i stedet for det eksisterende..

> så har du (ret let) mulighed for at køre en
>
> echo $MQuery;

Jeg er ikke helt med hvor echo $MQuery; skal stå..

>
> og sikre dig at der kommer til at stå det du forventer i det du sender
> til databasen.
>
> 2) "SELECT id FROM alfabetet WHERE bogstav LIKE...
>
> er faktisk lettere at læse - brug det
>
> > $nr = mysql_num_rows($query);
> >
> > if ($nr > 0) {
>

Jeg har slettet overstående..

> Det er faktisk helt overflødigt. While'en nedenfor skal nok lade være
> med at gøre noget hvis der ikke er nogen rækker i $query.
>
> > while($row = mysql_fetch_array($query)){
> > echo "<tr><td>$row[id]</td><td>$row[bogstav]</td</tr>\n";
>
> Hvor regner du med at den får 'bogstav' fra? - du har ikke bedt om den i
> SQL'en

Denne bliver ikke brugt $row[bogstav] og er blevet slettet..

>
> > }
> >
> > echo "<tr><td colspan='2'>";
> >
> > $g_total = mysql_query("select count(id) as total from alfabetet where
> > bogstav like '$_POST[search]%'") or die(mysql_error());
> > $total = mysql_result($g_total,0);
> >
> > if ($s >= $pr_side) { //Tjekker om værdien af $s er større eller lig
> > $pr_side
> > $previous_s = $s-$pr_side; //Regner ud hvor mysql skal starte hvis
> > forrige side kaldes
> > echo "<a href='?s=$previous_s'>Forrige</a> "; //Udskriver linket
> > }
> >
> > $page = 1; //Definerer hvor sidetal skal starte
> > for($start=0; $total > $start; $start=$start+$pr_side){ //For-løkke der
> > kører indtil der ikke er nok rows til en side mere
> > if ($start != $s) { //Tjekker om linket vil komme til at pege på
den
> > side man er på
> > echo "<a href='?s=$start'>$page</a> "; //...hvis ikke,
udskrives
> > link med værdien af $page
> > } else { //Ellers, dvs. hvis linket vil pege på den side man er
på..
> > echo "$page "; //...udskrives værdien af $page bare, altså
> ikke som
> > link
> > }
> > $page++; //Lægger en til $page til næste gang løkken køres
> > }
> >
> > if ($total > $s+$pr_side) { //Tjekker om der er flere sider
> > $next_s = $s+$pr_side; //Regner ud hvor mysql skal starte hvis
næste
> > side kaldes
> > echo "<a href='?s=$next_s'>Næste</a>"; //Udskriver linket "næste"
> > }
> >
> > echo "</td></tr>\n";
> > echo "</table>\n";
> > }
> > }
>
> Hvis alt det ovenfor ikke giver noget så må dit næste skridt vist blive
> at sætte echo ind på fx $s et par gange undervejs, så du er sikker på at
> variablerne indeholder det som du mener de skal indeholde
>
> Jeg håber det hjalp
>
> mvh
>
> Jesper Brunholm



Bo Larsen (09-04-2003)
Kommentar
Fra : Bo Larsen


Dato : 09-04-03 20:42

Hvis du går ind på http://www.thetop.1go.dk/side2.php

Kan du se hvordan det hele gerne skulle komme til at virke..

Jeg har fjernet

if(isset ($_POST['search'])){

fra scriptet.. dvs. det samme script som side.php



Jesper Brunholm (10-04-2003)
Kommentar
Fra : Jesper Brunholm


Dato : 10-04-03 07:43

Bo Larsen wrote:
> Jeg har ændret i script koden og tilføjet nogle af dine ændringer..
>
> Du kan prøve scriptet, se info om PHP Version og se den nye kode her:
> http://www.thetop.1go.dk/side.php

Det er straks mere brugbart.

Du skal læse hele din kode grundigt igennem og sikre dig at du bruger
isset eller !empty overalt hvor du checker en variabels tilstedevæselse
eller indhold, og at alle array-positions som er en string (som fx 's' i
det følgende) er angivet som en string.

Grunden til at du ikke lægger mærke til problemerne er at du ikke får
warnings om din kode - de kan være ret praktiske imens man udvikler, og
du bør kunne få dem hvis du indsætter

error_reporting (E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

i dokumentet mens du udvikler. Det er en god ide at se nærmere på error
handling en dag...

if (!isset($_GET['s'])) {
$_GET[s] = "0";

der skal '' om s'et, til gengæld kan du roligt spare dem omkring 0'et
(som jo er et tal).

>>Hold debatten her i gruppen - min mail har ikke noget med det at gøre.
>
> Jeg kom bare til at besvar i stedet for svar til gruppe..

ok - det var mest for at undgå misforståede gentagelser

>>1) Hvorfor ikke if(isset eller if(!empty ?
>>2) det skal være $_POST['search'] (med anførselstegn - da det er en
>>streng, $mitArray[1] er kun ok fordi 1 er et tal)
>
> Jeg har ændret det til if(isset ($_POST['search'])){

- og forstået hvorfor?

> Jeg har indsat $_GET['s'] i stedet for $s, men det har ikke hjulpet..
> Den fejl der opstod før syldes at jeg brugte $_GET['s'] i stedet for
> $_GET[s] inde i "select...."

jeps - PHP kan ikke lide streng-i-streng. Det løses mest rigtigt ved at
stoppe strengen, sætte sin variabel på, og startestrengen igen. Eller
sætte tre stumper streng sammen - kunne man også kalde det:

"select id from alfabetet where bogstav like '".$_POST['search']."%'
order by id asc limit ".$_GET['s'].",$pr_side";

>>$query = mysql_query($MQuery) or die(mysql_error());

> Overstående er tilføjet i stedet for det eksisterende..
>
>
>>så har du (ret let) mulighed for at køre en
>>
>>echo $MQuery;
>
>
> Jeg er ikke helt med hvor echo $MQuery; skal stå..

Der hvor du vil sikre dig at du får den query ud som du regner med - her
kunne det med fornuft være: (hov - du har vist ikke rettet koden i
kodevisningen til til at vise de ændringer du har lavet i koden? - Jeg
får flg i kodevisningen, og det passer ikke med det du siger du har rettet:

$g_total = mysql_query("select count(id) as total from alfabetet where
bogstav like '$_POST[search]%'") or die(mysql_error());
$total = mysql_result($g_total,0);

??

Nå - men: det kan fx let gøres ved at du bare skriver:

echo $MQuery="SELECT ... osv

Jeg tror at det er dette som vil hjælpe dig, jeg har nemlig på
fornemmelsen at der i din query kommer til at stå en ubrugelig limit-range.

mvh

Jesper Brunholm


Søg
Reklame
Statistik
Spørgsmål : 177502
Tips : 31968
Nyheder : 719565
Indlæg : 6408534
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste